- Timestamp:
- 2018-10-29T15:20:26+01:00 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/UKMO/dev_r5518_AMM15_package/NEMOGCM/TOOLS/SIREN/src/mpp.f90
r10248 r10251 165 165 !> to get processors to be used:<br/> 166 166 !> @code 167 !> CALL mpp_get_use( td_mpp, id_imin, id_imax, &168 !> & id_jmin, id_jmax )167 !> CALL mpp_get_use( td_mpp, id_imin, id_imax, id_idim, & 168 !> & id_jmin, id_jmax, id_jdim ) 169 169 !> @endcode 170 170 !> - id_imin 171 171 !> - id_imax 172 !> - id_idim 172 173 !> - id_jmin 173 174 !> - id_jmax 175 !> - id_jdim 174 176 !> 175 177 !> to get sub domains which form global domain contour:<br/> … … 350 352 !> 351 353 !> @author J.Paul 352 !> @date November, 2013- Initial Version354 !> - November, 2013- Initial Version 353 355 !> @date November, 2014 354 356 !> - use function instead of overload assignment operator … … 377 379 ! copy mpp variable 378 380 mpp__copy_unit%c_name = TRIM(td_mpp%c_name) 379 mpp__copy_unit%i_id = td_mpp%i_id380 381 mpp__copy_unit%i_niproc = td_mpp%i_niproc 381 382 mpp__copy_unit%i_njproc = td_mpp%i_njproc … … 424 425 !> 425 426 !> @author J.Paul 426 !> @date November, 2013- Initial Version427 !> - November, 2013- Initial Version 427 428 !> @date November, 2014 428 429 !> - use function instead of overload assignment operator … … 453 454 ! 454 455 !> @author J.Paul 455 !> @date November, 2013- Initial Version456 !> - Nov, 2013- Initial Version 456 457 ! 457 458 !> @param[in] td_mpp mpp structure … … 494 495 ! print dimension 495 496 IF( td_mpp%i_ndim /= 0 )THEN 496 WRITE(*,'(/a)') " MPPdimension"497 WRITE(*,'(/a)') " File dimension" 497 498 DO ji=1,ip_maxdim 498 499 IF( td_mpp%t_dim(ji)%l_use )THEN … … 697 698 CALL dim_clean(tl_dim) 698 699 699 IF( ( PRESENT(id_niproc) .AND. (.NOT. PRESENT(id_n jproc))) .OR. &700 IF( ( PRESENT(id_niproc) .AND. (.NOT. PRESENT(id_niproc))) .OR. & 700 701 ((.NOT. PRESENT(id_niproc)) .AND. PRESENT(id_njproc) ) )THEN 701 702 CALL logger_warn( "MPP INIT: number of processors following I and J "//& … … 911 912 !> 912 913 !> @author J.Paul 913 !> @date November, 2013- Initial Version914 !> - November, 2013- Initial Version 914 915 ! 915 916 !> @param[in] td_file file strcuture … … 1027 1028 ! create some attributes for domain decomposition (use with dimg file) 1028 1029 tl_att=att_init( "DOMAIN_number_total", mpp__init_file%i_nproc ) 1029 CALL mpp_ move_att(mpp__init_file, tl_att)1030 CALL mpp_add_att(mpp__init_file, tl_att) 1030 1031 1031 1032 tl_att=att_init( "DOMAIN_I_position_first", mpp__init_file%t_proc(:)%i_impp ) 1032 CALL mpp_ move_att(mpp__init_file, tl_att)1033 CALL mpp_add_att(mpp__init_file, tl_att) 1033 1034 1034 1035 tl_att=att_init( "DOMAIN_J_position_first", mpp__init_file%t_proc(:)%i_jmpp ) 1035 CALL mpp_ move_att(mpp__init_file, tl_att)1036 CALL mpp_add_att(mpp__init_file, tl_att) 1036 1037 1037 1038 tl_att=att_init( "DOMAIN_I_position_last", mpp__init_file%t_proc(:)%i_lci ) 1038 CALL mpp_ move_att(mpp__init_file, tl_att)1039 CALL mpp_add_att(mpp__init_file, tl_att) 1039 1040 1040 1041 tl_att=att_init( "DOMAIN_J_position_last", mpp__init_file%t_proc(:)%i_lcj ) 1041 CALL mpp_ move_att(mpp__init_file, tl_att)1042 CALL mpp_add_att(mpp__init_file, tl_att) 1042 1043 1043 1044 tl_att=att_init( "DOMAIN_I_halo_size_start", mpp__init_file%t_proc(:)%i_ldi ) 1044 CALL mpp_ move_att(mpp__init_file, tl_att)1045 CALL mpp_add_att(mpp__init_file, tl_att) 1045 1046 1046 1047 tl_att=att_init( "DOMAIN_J_halo_size_start", mpp__init_file%t_proc(:)%i_ldj ) 1047 CALL mpp_ move_att(mpp__init_file, tl_att)1048 CALL mpp_add_att(mpp__init_file, tl_att) 1048 1049 1049 1050 tl_att=att_init( "DOMAIN_I_halo_size_end", mpp__init_file%t_proc(:)%i_lei ) 1050 CALL mpp_ move_att(mpp__init_file, tl_att)1051 CALL mpp_add_att(mpp__init_file, tl_att) 1051 1052 1052 1053 tl_att=att_init( "DOMAIN_J_halo_size_end", mpp__init_file%t_proc(:)%i_lej ) 1053 CALL mpp_ move_att(mpp__init_file, tl_att)1054 CALL mpp_add_att(mpp__init_file, tl_att) 1054 1055 1055 1056 ! clean … … 1121 1122 CALL file_clean(tl_file) 1122 1123 1124 CALL logger_debug("MPP INIT READ: fin init_read ") 1123 1125 END FUNCTION mpp__init_file 1124 1126 !------------------------------------------------------------------- … … 1129 1131 ! 1130 1132 !> @author J.Paul 1131 !> @date November, 2013 - Initial Version 1132 !> @date July, 2015 - add only use dimension in MPP structure 1133 !> - November, 2013- Initial Version 1133 1134 !> 1134 1135 !> @param[in] td_file file strcuture … … 1162 1163 IF( td_file%i_id == 0 )THEN 1163 1164 CALL logger_info(" id "//TRIM(fct_str(td_file%i_id))) 1164 CALL logger_error("MPP INIT READ: netcdf file "// &1165 & TRIM(td_file%c_name)//" not opened")1165 CALL logger_error("MPP INIT READ: netcdf file "//TRIM(td_file%c_name)//& 1166 & " not opened") 1166 1167 ELSE 1167 1168 … … 1190 1191 CALL mpp_add_dim(mpp__init_file_cdf,tl_dim) 1191 1192 ENDIF 1192 1193 IF( td_file%t_dim(3)%l_use )THEN 1194 tl_dim=dim_init( td_file%t_dim(3)%c_name, td_file%t_dim(3)%i_len) 1195 CALL mpp_add_dim(mpp__init_file_cdf,tl_dim) 1196 ENDIF 1197 1198 IF( td_file%t_dim(4)%l_use )THEN 1199 tl_dim=dim_init( td_file%t_dim(4)%c_name, td_file%t_dim(4)%i_len) 1200 CALL mpp_add_dim(mpp__init_file_cdf,tl_dim) 1201 ENDIF 1193 tl_dim=dim_init( td_file%t_dim(3)%c_name, td_file%t_dim(3)%i_len) 1194 CALL mpp_add_dim(mpp__init_file_cdf,tl_dim) 1195 1196 tl_dim=dim_init( td_file%t_dim(4)%c_name, td_file%t_dim(4)%i_len) 1197 CALL mpp_add_dim(mpp__init_file_cdf,tl_dim) 1202 1198 1203 1199 ! initialise file/processor … … 1316 1312 ! 1317 1313 !> @author J.Paul 1318 !> @date November, 2013- Initial Version1314 !> - November, 2013- Initial Version 1319 1315 ! 1320 1316 !> @param[in] td_file file strcuture … … 1536 1532 ! 1537 1533 !> @author J.Paul 1538 !> @date November, 2013- Initial Version1534 !> - Nov, 2013- Initial Version 1539 1535 ! 1540 1536 !> @param[in] td_mpp mpp structure … … 1628 1624 IF( il_varid /= 0 )THEN 1629 1625 1626 CALL logger_error( " MPP ADD VAR: variable "//TRIM(td_var%c_name)//& 1627 & ", standard name "//TRIM(td_var%c_stdname)//& 1628 & ", already in mpp "//TRIM(td_mpp%c_name) ) 1629 1630 1630 DO ji=1,td_mpp%t_proc(1)%i_nvar 1631 1631 CALL logger_debug( " MPP ADD VAR: in mpp structure : & … … 1634 1634 & TRIM(td_mpp%t_proc(1)%t_var(ji)%c_stdname) ) 1635 1635 ENDDO 1636 CALL logger_error( " MPP ADD VAR: variable "//TRIM(td_var%c_name)//&1637 & ", standard name "//TRIM(td_var%c_stdname)//&1638 & ", already in mpp "//TRIM(td_mpp%c_name) )1639 1636 1640 1637 ELSE … … 1678 1675 ! 1679 1676 !> @author J.Paul 1680 !> @date November, 2013- Initial Version1677 !> - November, 2013- Initial Version 1681 1678 ! 1682 1679 !> @param[in] td_mpp mpp structure … … 1843 1840 !> @author J.Paul 1844 1841 !> @date November, 2013 - Initial version 1845 !> @date February, 20151846 !> - define local variable structure to avoid mistake with pointer1847 1842 ! 1848 1843 !> @param[inout] td_mpp mpp strcuture … … 1857 1852 ! local variable 1858 1853 INTEGER(i4) :: il_varid 1859 TYPE(TVAR) :: tl_var1860 1854 !---------------------------------------------------------------- 1861 1855 ! check if mpp exist … … 1888 1882 ELSE 1889 1883 1890 tl_var=var_copy(td_mpp%t_proc(1)%t_var(il_varid)) 1891 CALL mpp_del_var(td_mpp, tl_var) 1884 CALL mpp_del_var(td_mpp, td_mpp%t_proc(1)%t_var(il_varid)) 1892 1885 1893 1886 ENDIF … … 2200 2193 !> 2201 2194 !> @author J.Paul 2202 !> @date November, 2013 - Initial Version 2203 !> @date July, 2015 2204 !> - rewrite the same as way var_add_dim 2195 !> - November, 2013- Initial Version 2205 2196 !> 2206 2197 !> @param[inout] td_mpp mpp structure … … 2217 2208 2218 2209 ! loop indices 2210 INTEGER(i4) :: ji 2219 2211 !---------------------------------------------------------------- 2220 2212 IF( td_mpp%i_ndim <= ip_maxdim )THEN 2221 2213 2222 ! check if dimension already used in mpp structure 2223 il_ind=SCAN(TRIM(cp_dimorder),TRIM(td_dim%c_sname)) 2224 IF( il_ind == 0 )THEN 2225 CALL logger_warn( & 2226 & " MPP ADD DIM: dimension "//TRIM(td_dim%c_name)//& 2227 & ", short name "//TRIM(td_dim%c_sname)//& 2228 & ", will not be added in mpp "//TRIM(td_mpp%c_name) ) 2229 ELSEIF( td_mpp%t_dim(il_ind)%l_use )THEN 2230 CALL logger_error( & 2231 & " MPP ADD DIM: dimension "//TRIM(td_dim%c_name)//& 2232 & ", short name "//TRIM(td_dim%c_sname)//& 2233 & ", already used in mpp "//TRIM(td_mpp%c_name) ) 2214 ! check if dimension already in mpp structure 2215 il_ind=dim_get_index(td_mpp%t_dim(:), td_dim%c_name, td_dim%c_sname) 2216 IF( il_ind /= 0 )THEN 2217 2218 IF( td_mpp%t_dim(il_ind)%l_use )THEN 2219 CALL logger_error( & 2220 & "MPP ADD DIM: dimension "//TRIM(td_dim%c_name)//& 2221 & ", short name "//TRIM(td_dim%c_sname)//& 2222 & ", already used in mpp "//TRIM(td_mpp%c_name) ) 2223 ELSE 2224 ! replace dimension 2225 td_mpp%t_dim(il_ind)=dim_copy(td_dim) 2226 td_mpp%t_dim(il_ind)%i_id=il_ind 2227 td_mpp%t_dim(il_ind)%l_use=.TRUE. 2228 ENDIF 2229 2234 2230 ELSE 2235 2231 2236 ! back to disorder dimension array 2237 CALL dim_disorder(td_mpp%t_dim(:)) 2238 2239 ! add new dimension 2240 td_mpp%t_dim(td_mpp%i_ndim+1)=dim_copy(td_dim) 2241 2242 ! update number of attribute 2243 td_mpp%i_ndim=COUNT(td_mpp%t_dim(:)%l_use) 2232 IF( td_mpp%i_ndim == ip_maxdim )THEN 2233 CALL logger_error( & 2234 & "MPP ADD DIM: can not add dimension "//TRIM(td_dim%c_name)//& 2235 & ", short name "//TRIM(td_dim%c_sname)//& 2236 & ", in mpp "//TRIM(td_mpp%c_name)//". Already "//& 2237 & TRIM(fct_str(ip_maxdim))//" dimensions." ) 2238 ELSE 2239 ! search empty dimension 2240 DO ji=1,ip_maxdim 2241 IF( td_mpp%t_dim(ji)%i_id == 0 )THEN 2242 il_ind=ji 2243 EXIT 2244 ENDIF 2245 ENDDO 2246 2247 ! add new dimension 2248 td_mpp%t_dim(il_ind)=dim_copy(td_dim) 2249 ! update number of attribute 2250 td_mpp%i_ndim=COUNT(td_mpp%t_dim(:)%l_use) 2251 2252 td_mpp%t_dim(il_ind)%l_use=.TRUE. 2253 td_mpp%t_dim(il_ind)%i_id=td_mpp%i_ndim 2254 ENDIF 2244 2255 2245 2256 ENDIF 2246 ! reorder dimension to ('x','y','z','t')2247 CALL dim_reorder(td_mpp%t_dim(:))2248 2257 2249 2258 ELSE … … 2259 2268 !> 2260 2269 !> @author J.Paul 2261 !> @date November, 2013 - Initial Version 2262 !> @date July, 2015 2263 !> - rewrite the same as way var_del_dim 2270 !> - November, 2013- Initial Version 2264 2271 !> 2265 2272 !> @param[inout] td_mpp mpp structure … … 2273 2280 2274 2281 ! local variable 2282 INTEGER(i4) :: il_status 2275 2283 INTEGER(i4) :: il_ind 2276 TYPE(TDIM) :: tl_dim2284 TYPE(TDIM), DIMENSION(:), ALLOCATABLE :: tl_dim 2277 2285 2278 2286 ! loop indices 2279 !---------------------------------------------------------------- 2280 2281 2282 IF( td_mpp%i_ndim <= ip_maxdim )THEN 2283 2284 CALL logger_trace( & 2285 & " MPP DEL DIM: delete dimension "//TRIM(td_dim%c_name)//& 2287 INTEGER(i4) :: ji 2288 !---------------------------------------------------------------- 2289 ! check if dimension already in mpp structure 2290 il_ind=dim_get_index(td_mpp%t_dim(:), td_dim%c_name, td_dim%c_sname) 2291 IF( il_ind == 0 )THEN 2292 2293 CALL logger_error( & 2294 & "MPP DEL DIM: no dimension "//TRIM(td_dim%c_name)//& 2286 2295 & ", short name "//TRIM(td_dim%c_sname)//& 2287 2296 & ", in mpp "//TRIM(td_mpp%c_name) ) 2288 2289 ! check if dimension already in variable structure2290 il_ind=SCAN(TRIM(cp_dimorder),TRIM(td_dim%c_sname))2291 2292 ! replace dimension by empty one2293 td_mpp%t_dim(il_ind)=dim_copy(tl_dim)2294 2295 ! update number of dimension2296 td_mpp%i_ndim=COUNT(td_mpp%t_dim(:)%l_use)2297 2298 ! reorder dimension to ('x','y','z','t')2299 CALL dim_reorder(td_mpp%t_dim)2300 2297 2301 2298 ELSE 2302 CALL logger_error( & 2303 & " MPP DEL DIM: too much dimension in mpp "//& 2304 & TRIM(td_mpp%c_name)//" ("//TRIM(fct_str(td_mpp%i_ndim))//")") 2299 2300 ALLOCATE( tl_dim(td_mpp%i_ndim-1), stat=il_status ) 2301 IF(il_status /= 0 )THEN 2302 2303 CALL logger_error( & 2304 & "MPP DEL DIM: not enough space to put dimensions from "//& 2305 & TRIM(td_mpp%c_name)//" in temporary dimension structure") 2306 2307 ELSE 2308 2309 ! save temporary dimension's mpp structure 2310 tl_dim( 1 : il_ind-1 ) = dim_copy(td_mpp%t_dim( 1 : il_ind-1 )) 2311 tl_dim( il_ind : td_mpp%i_ndim-1 ) = & 2312 & dim_copy(td_mpp%t_dim( il_ind+1 : td_mpp%i_ndim )) 2313 2314 ! remove dimension from file 2315 CALL dim_clean(td_mpp%t_dim(:)) 2316 ! copy dimension in file, except one 2317 td_mpp%t_dim(1:td_mpp%i_ndim)=dim_copy(tl_dim(:)) 2318 2319 ! update number of dimension 2320 td_mpp%i_ndim=td_mpp%i_ndim-1 2321 2322 ! update dimension id 2323 DO ji=1,td_mpp%i_ndim 2324 td_mpp%t_dim(ji)%i_id=ji 2325 ENDDO 2326 2327 ! clean 2328 CALL dim_clean(tl_dim(:)) 2329 DEALLOCATE(tl_dim) 2330 2331 ENDIF 2332 2305 2333 ENDIF 2306 2334 … … 2312 2340 !> 2313 2341 !> @author J.Paul 2314 !> @date November, 2013- Initial Version2342 !> - November, 2013- Initial Version 2315 2343 !> 2316 2344 !> @param[inout] td_mpp mpp structure … … 2460 2488 & ", in mpp structure "//TRIM(td_mpp%c_name) ) 2461 2489 2462 IF( ASSOCIATED(td_mpp%t_proc(1)%t_ att) )THEN2490 IF( ASSOCIATED(td_mpp%t_proc(1)%t_var) )THEN 2463 2491 DO ji=1,td_mpp%t_proc(1)%i_natt 2464 2492 CALL logger_debug( "MPP DEL ATT: in mpp structure : & 2465 & attribute : "//TRIM(td_mpp%t_proc(1)%t_ att(ji)%c_name) )2493 & attribute : "//TRIM(td_mpp%t_proc(1)%t_var(ji)%c_name) ) 2466 2494 ENDDO 2467 2495 ENDIF … … 2488 2516 !> @author J.Paul 2489 2517 !> @date November, 2013 - Initial version 2490 !> @date February, 20152491 !> - define local attribute structure to avoid mistake with pointer2492 2518 ! 2493 2519 !> @param[inout] td_mpp mpp strcuture … … 2501 2527 2502 2528 ! local variable 2503 INTEGER(i4) :: il_attid 2504 TYPE(TATT) :: tl_att 2529 INTEGER(i4) :: il_attid 2505 2530 !---------------------------------------------------------------- 2506 2531 ! check if mpp exist … … 2526 2551 IF( il_attid == 0 )THEN 2527 2552 2528 CALL logger_ debug( &2553 CALL logger_warn( & 2529 2554 & "MPP DEL ATT : there is no attribute with "//& 2530 2555 & "name "//TRIM(cd_name)//" in mpp structure "//& … … 2533 2558 ELSE 2534 2559 2535 tl_att=att_copy(td_mpp%t_proc(1)%t_att(il_attid)) 2536 CALL mpp_del_att(td_mpp, tl_att) 2560 CALL mpp_del_att(td_mpp, td_mpp%t_proc(1)%t_att(il_attid)) 2537 2561 2538 2562 ENDIF … … 2839 2863 2840 2864 CALL logger_info("MPP OPTIMIZ: number of processor "//& 2841 & TRIM(fct_str(ji))//"x"//TRIM(fct_str(jj))//"="//& 2842 & TRIM(fct_str(tl_mpp%i_nproc)) ) 2865 & TRIM(fct_str(tl_mpp%i_nproc)) ) 2843 2866 IF( tl_mpp%i_nproc > td_mpp%i_nproc .AND. & 2844 2867 & tl_mpp%i_nproc <= il_maxproc )THEN 2845 2868 ! save optimiz decomposition 2846 2847 CALL logger_info("MPP OPTIMIZ:save this decomposition "//&2848 & TRIM(fct_str(ji))//"x"//TRIM(fct_str(jj))//"="//&2849 & TRIM(fct_str(tl_mpp%i_nproc)) )2850 2869 2851 2870 ! clean mpp … … 3127 3146 !> 3128 3147 !> @author J.Paul 3129 !> @date November, 2013 - Initial version3148 !> @date November, 2013 3130 3149 !> 3131 3150 !> @param[inout] td_mpp mpp strcuture … … 3165 3184 !> 3166 3185 !> @author J.Paul 3167 !> @date November, 2013 - Initial version3186 !> @date November, 2013 3168 3187 !> 3169 3188 !> @param[in] td_mpp mpp strcuture … … 3230 3249 ! 3231 3250 !> @author J.Paul 3232 !> @date November, 2013 - Initial version3251 !> @date November, 2013 3233 3252 ! 3234 3253 !> @param[in] td_mpp mpp strcuture … … 3292 3311 !> 3293 3312 !> @author J.Paul 3294 !> @date November, 2013 - Initial version3313 !> @date November, 2013 3295 3314 !> 3296 3315 !> @param[inout] td_mpp mpp strcuture … … 3385 3404 !> 3386 3405 !> @author J.Paul 3387 !> @date November, 2013- Initial Version3406 !> - November, 2013- Initial Version 3388 3407 !> 3389 3408 !> @param[in] td_mpp mpp structure … … 3398 3417 3399 3418 ! local variable 3419 INTEGER(i4) :: il_ndim 3400 3420 3401 3421 ! loop indices … … 3409 3429 mpp__check_var_dim=.FALSE. 3410 3430 3431 CALL logger_error( & 3432 & "MPP CHECK DIM: variable and mpp dimension differ"//& 3433 & " for variable "//TRIM(td_var%c_name)//& 3434 & " and mpp "//TRIM(td_mpp%c_name)) 3435 3411 3436 CALL logger_debug( & 3412 3437 & " mpp dimension: "//TRIM(fct_str(td_mpp%i_ndim))//& 3413 3438 & " variable dimension: "//TRIM(fct_str(td_var%i_ndim)) ) 3414 DO ji = 1, ip_maxdim 3439 il_ndim=MIN(td_var%i_ndim, td_mpp%i_ndim ) 3440 DO ji = 1, il_ndim 3415 3441 CALL logger_debug( & 3416 3442 & "MPP CHECK DIM: for dimension "//& … … 3422 3448 & ", variable used "//TRIM(fct_str(td_var%t_dim(ji)%l_use))) 3423 3449 ENDDO 3424 3425 CALL logger_error( &3426 & "MPP CHECK DIM: variable and mpp dimension differ"//&3427 & " for variable "//TRIM(td_var%c_name)//&3428 & " and mpp "//TRIM(td_mpp%c_name))3429 3430 3450 ENDIF 3431 3451 … … 3436 3456 ! 3437 3457 !> @author J.Paul 3438 !> @date November, 2013- Initial Version3458 !> - November, 2013- Initial Version 3439 3459 ! 3440 3460 !> @param[in] td_file array of file structure … … 3476 3496 ! 3477 3497 !> @author J.Paul 3478 !> @date Ocotber, 2014- Initial Version3498 !> - Ocotber, 2014- Initial Version 3479 3499 ! 3480 3500 !> @param[in] td_mpp mpp file structure
Note: See TracChangeset
for help on using the changeset viewer.