Changeset 13 for trunk/NEMO/OPA_SRC/lib_mpp.F90
- Timestamp:
- 2004-02-17T08:14:05+01:00 (20 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/NEMO/OPA_SRC/lib_mpp.F90
r3 r13 1 1 MODULE lib_mpp 2 !!====================================================================== 3 !! *** MODULE lib_mpp *** 4 !! Ocean numerics: massively parallel processing librairy 5 !!===================================================================== 6 #if defined key_mpp 7 !!---------------------------------------------------------------------- 8 !! 'key_mpp' massively parallel processing library 9 !!---------------------------------------------------------------------- 10 !! mynode 11 !! mpparent 12 !! mppspawn 13 !! mppshmem 14 !! mpp_lnk : generic interface (defined in lbclnk) for : 15 !! mpp_lnk_2d, mpp_lnk_3d 16 !! mpplnks 17 !! mpprecv 18 !! mppsend 19 !! mppscatter 20 !! mppgather 21 !! mpp_isl : generic inteface for : 22 !! mppisl_int , mppisl_a_int , mppisl_real, mppisl_a_real 23 !! mpp_min : generic interface for : 24 !! mppmin_int , mppmin_a_int , mppmin_real, mppmin_a_real 25 !! mpp_max : generic interface for : 26 !! mppmax_real, mppmax_a_real 27 !! mpp_sum : generic interface for : 28 !! mppsum_int , mppsum_a_int , mppsum_real, mppsum_a_real 29 !! mppsync 30 !! mppstop 31 !! mppobc : variant of mpp_lnk for open boundaries 32 !! mpp_ini_north 33 !! mpp_lbc_north 34 !!---------------------------------------------------------------------- 35 !! History : 36 !! ! 94 (M. Guyon, J. Escobar, M. Imbard) Original code 37 !! ! 97 (A.M. Treguier) SHMEM additions 38 !! ! 98 (M. Imbard, J. Escobar, L. Colombet ) SHMEM and MPI 39 !! 9.0 ! 03 (J.-M. Molines, G. Madec) F90, free form 40 !!---------------------------------------------------------------------- 41 !! OPA 9.0 , LODYC-IPSL (2003) 42 !!--------------------------------------------------------------------- 43 !! * Modules used 44 USE dom_oce ! ocean space and time domain 45 USE in_out_manager ! I/O manager 46 47 IMPLICIT NONE 48 49 !! * Interfaces 50 !! define generic interface for these routine as they are called sometimes 51 !! with scalar arguments instead of array arguments, which causes problems 52 !! for the compilation on AIX system as well as NEC and SGI. Ok on COMPACQ 53 54 INTERFACE mpp_isl 55 MODULE PROCEDURE mppisl_a_int, mppisl_int, mppisl_a_real, mppisl_real 56 END INTERFACE 57 INTERFACE mpp_min 58 MODULE PROCEDURE mppmin_a_int, mppmin_int, mppmin_a_real, mppmin_real 59 END INTERFACE 60 INTERFACE mpp_max 61 MODULE PROCEDURE mppmax_a_real, mppmax_real 62 END INTERFACE 63 INTERFACE mpp_sum 64 MODULE PROCEDURE mppsum_a_int, mppsum_int, mppsum_a_real, mppsum_real 65 END INTERFACE 66 INTERFACE mpp_lbc_north 67 MODULE PROCEDURE mpp_lbc_north_3d, mpp_lbc_north_2d 68 END INTERFACE 69 70 !! * Module parameters 2 !!====================================================================== 3 !! *** MODULE lib_mpp *** 4 !! Ocean numerics: massively parallel processing librairy 5 !!===================================================================== 6 #if defined key_mpp_mpi || defined key_mpp_shmem 7 !!---------------------------------------------------------------------- 8 !! 'key_mpp_mpi' OR MPI massively parallel processing library 9 !! 'key_mpp_shmem' SHMEM massively parallel processing library 10 !!---------------------------------------------------------------------- 11 !! mynode 12 !! mpparent 13 !! mppshmem 14 !! mpp_lnk : generic interface (defined in lbclnk) for : 15 !! mpp_lnk_2d, mpp_lnk_3d 16 !! mpplnks 17 !! mpprecv 18 !! mppsend 19 !! mppscatter 20 !! mppgather 21 !! mpp_isl : generic inteface for : 22 !! mppisl_int , mppisl_a_int , mppisl_real, mppisl_a_real 23 !! mpp_min : generic interface for : 24 !! mppmin_int , mppmin_a_int , mppmin_real, mppmin_a_real 25 !! mpp_max : generic interface for : 26 !! mppmax_real, mppmax_a_real 27 !! mpp_sum : generic interface for : 28 !! mppsum_int , mppsum_a_int , mppsum_real, mppsum_a_real 29 !! mppsync 30 !! mppstop 31 !! mppobc : variant of mpp_lnk for open boundaries 32 !! mpp_ini_north 33 !! mpp_lbc_north 34 !!---------------------------------------------------------------------- 35 !! History : 36 !! ! 94 (M. Guyon, J. Escobar, M. Imbard) Original code 37 !! ! 97 (A.M. Treguier) SHMEM additions 38 !! ! 98 (M. Imbard, J. Escobar, L. Colombet ) SHMEM and MPI 39 !! 9.0 ! 03 (J.-M. Molines, G. Madec) F90, free form 40 !!---------------------------------------------------------------------- 41 !! OPA 9.0 , LODYC-IPSL (2003) 42 !!--------------------------------------------------------------------- 43 !! * Modules used 44 USE dom_oce ! ocean space and time domain 45 USE in_out_manager ! I/O manager 46 47 IMPLICIT NONE 48 49 !! * Interfaces 50 !! define generic interface for these routine as they are called sometimes 51 !! with scalar arguments instead of array arguments, which causes problems 52 !! for the compilation on AIX system as well as NEC and SGI. Ok on COMPACQ 53 54 INTERFACE mpp_isl 55 MODULE PROCEDURE mppisl_a_int, mppisl_int, mppisl_a_real, mppisl_real 56 END INTERFACE 57 INTERFACE mpp_min 58 MODULE PROCEDURE mppmin_a_int, mppmin_int, mppmin_a_real, mppmin_real 59 END INTERFACE 60 INTERFACE mpp_max 61 MODULE PROCEDURE mppmax_a_real, mppmax_real 62 END INTERFACE 63 INTERFACE mpp_sum 64 MODULE PROCEDURE mppsum_a_int, mppsum_int, mppsum_a_real, mppsum_real 65 END INTERFACE 66 INTERFACE mpp_lbc_north 67 MODULE PROCEDURE mpp_lbc_north_3d, mpp_lbc_north_2d 68 END INTERFACE 69 70 !! * Module parameters 71 LOGICAL, PUBLIC, PARAMETER :: lk_mpp = .TRUE. !: mpp flag 72 71 73 !! The processor number is a required power of two : 72 74 !! 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024,... … … 76 78 ndim_mpp = jpnij ! dimension for this simulation 77 79 78 #if defined key_mpp_mpi79 80 !! No MPI variable definition 80 # else81 # if defined key_mpp_shmem 81 82 !! * PVM and SHMEM version 82 83 CHARACTER (len=80), PARAMETER :: simfile = 'pvm3_ndim' ! file name 83 84 CHARACTER (len=47), PARAMETER :: executable = 'opa' ! executable name 84 # if defined key_mpp_shmem85 85 CHARACTER, PARAMETER :: opaall = "" ! group name (old def opaall*(*)) 86 # else87 CHARACTER, PARAMETER :: opaall = "opaall" ! group name88 # endif89 86 90 87 !! PVM control … … 101 98 102 99 !! Variable definition 103 # if defined key_mpp_pvm104 INTEGER, PARAMETER :: & !!! PVM case105 jpvmreal = 6, & ! specific pvm3 code for real4 and real8106 ! ! ( real4 = 4, real8 = 6 )107 jpvmint = 3 ! specific pvm3 code for integer4 and integer8108 ! ! ( integer4 = 3, integer8 = 21 : ext Cray)109 # else110 100 INTEGER, PARAMETER :: & 111 101 jpvmreal = 6, & ! ??? 112 102 jpvmint = 21 ! ??? 113 # endif 114 115 # if defined key_mpp_shmem 103 116 104 ! Maximum dimension of array to sum on the processors 117 105 INTEGER, PARAMETER :: & !!! SHMEM case … … 121 109 ! ! ??? 122 110 # endif 123 #endif124 111 125 112 … … 133 120 size, & ! number of process 134 121 rank ! process number [ 0 - size-1 ] 135 #el se136 !! * PVM andSHMEM version122 #elif defined key_mpp_shmem 123 !! * SHMEM version 137 124 # include <fpvm3.h> 138 125 … … 156 143 nt3d_tids ! tids array [ 0 - nproc-1 ] 157 144 158 # if defined key_mpp_shmem159 145 !! * SHMEM version 160 146 # include <mpp/shmem.fh> … … 227 213 niltab_shmem 228 214 229 # endif230 215 #endif 231 216 #if defined key_mpp_mpi … … 279 264 mynode = rank 280 265 #else 281 !! * Local variables ( PVM orSHMEM version)266 !! * Local variables (SHMEM version) 282 267 INTEGER :: mynode 283 268 INTEGER :: & … … 322 307 ! ------------------------- 323 308 IF( npvm_nproc > 1 ) THEN 324 CALL mppspawn(executable,pvmdefault,'*' & 325 ,npvm_nproc-1,npvm_tids(1),info) 326 IF(info /= npvm_nproc-1 ) THEN 327 WRITE(nummpp,*) 'mynode, problem in spawn ' & 328 ,' info=', info,' executable=',executable 329 STOP 330 ENDIF 309 DO ji = 1, npvm_nproc-1 310 npvm_tids(ji) = nt3d_tids(ji) 311 END DO 312 info=npvm_nproc-1 313 331 314 IF(mynode_print /= 0 ) THEN 332 315 WRITE(nummpp,*) 'mynode, npvm_mytid=',npvm_mytid, & … … 408 391 !! *** routine mpparent *** 409 392 !! 410 !! ** Purpose : If key_mpp_pvm then call pvmfparent fonction 411 !! else use an pvmfparent routine for T3E 412 !! (default key or key_mpp_shmem) 413 !! or only RETURN -1 (key_mpp_mpi) 393 !! ** Purpose : use an pvmfparent routine for T3E (key_mpp_shmem) 394 !! or only RETURN -1 (key_mpp_mpi) 414 395 !!---------------------------------------------------------------------- 415 396 !! * Arguments 416 INTEGER, INTENT(inout) :: & 417 kparent_tid ! ??? 418 419 #if defined key_mpp_pvm 420 !! * PVM version 421 422 CALL pvmfparent(kparent_tid) 423 424 #elif defined key_mpp_mpi 397 INTEGER, INTENT(inout) :: kparent_tid ! ??? 398 399 #if defined key_mpp_mpi 425 400 !! * Local variables (MPI version) 426 401 … … 428 403 429 404 #else 430 !! * Local variables (SHMEN o r PVM onto T3E version)405 !! * Local variables (SHMEN onto T3E version) 431 406 INTEGER :: & 432 407 it3d_my_pe, LEADZ, ji, info … … 483 458 END SUBROUTINE mpparent 484 459 485 SUBROUTINE mppspawn( cdexec, kmod, cdwhere, kproc, ktids, kinfo )486 !!----------------------------------------------------------------------487 !! *** routine mppspawn ***488 !!489 !! ** Purpose : If key_mpp_pvm then call pvmfspawn fonction490 !! else use an pvmfspawn routine for T3E491 !! (default key or key_mpp_shmem)492 !! or only RETURN -1 (key_mpp_mpi)493 !!----------------------------------------------------------------------494 !! * Arguments495 CHARACTER(LEN=*) :: cdexec,cdwhere496 INTEGER ,DIMENSION(:) :: ktids497 INTEGER :: kmod,kproc,kinfo498 499 #if defined key_mpp_pvm500 !! * PVM version501 502 CALL pvmfspawn( cdexec, kmod, cdwhere, kproc, ktids, kinfo )503 504 # elif defined key_mpp_mpi505 !! * MPI version506 507 kinfo=-1508 509 #else510 !! * Lovcal variables (SHMEM or PVM onto T3E version)511 INTEGER :: ji512 513 DO ji = 1, kproc514 ktids(ji) = nt3d_tids(ji)515 END DO516 kinfo=kproc517 #endif518 519 END SUBROUTINE mppspawn520 521 460 #if defined key_mpp_shmem 522 461 … … 701 640 END SELECT 702 641 703 # else704 !! * Local variables (PVM version)705 706 imigr=jpreci*jpj*jpk*jpbyt707 708 SELECT CASE ( nbondi )709 710 CASE ( -1 )711 CALL mppsend(2,t3we(1,1,1,1),imigr,noea,0)712 CALL mpprecv(1,t3ew(1,1,1,2),imigr)713 714 CASE ( 0 )715 CALL mppsend(1,t3ew(1,1,1,1),imigr,nowe,0)716 CALL mppsend(2,t3we(1,1,1,1),imigr,noea,0)717 CALL mpprecv(1,t3ew(1,1,1,2),imigr)718 CALL mpprecv(2,t3we(1,1,1,2),imigr)719 720 CASE ( 1 )721 CALL mppsend(1,t3ew(1,1,1,1),imigr,nowe,0)722 CALL mpprecv(2,t3we(1,1,1,2),imigr)723 END SELECT724 725 642 #endif 726 643 … … 803 720 804 721 CASE ( 1 ) 805 CALL mppsend(3,t3ns(1,1,1,1),imigr,noso,0)806 CALL mpprecv(4,t3sn(1,1,1,2),imigr)807 END SELECT808 809 #else810 !! * Local variables (PVM version)811 812 imigr=jprecj*jpi*jpk*jpbyt813 814 SELECT CASE ( nbondj )815 816 CASE ( -1 )817 CALL mppsend(4,t3sn(1,1,1,1),imigr,nono,0)818 CALL mpprecv(3,t3ns(1,1,1,2),imigr)819 820 CASE ( 0 )821 CALL mppsend(3,t3ns(1,1,1,1),imigr,noso,0)822 CALL mppsend(4,t3sn(1,1,1,1),imigr,nono,0)823 CALL mpprecv(3,t3ns(1,1,1,2),imigr)824 CALL mpprecv(4,t3sn(1,1,1,2),imigr)825 826 CASE ( 1 )827 722 CALL mppsend(3,t3ns(1,1,1,1),imigr,noso,0) 828 723 CALL mpprecv(4,t3sn(1,1,1,2),imigr) … … 1038 933 END SELECT 1039 934 1040 #else1041 !! * PVM version1042 1043 imigr=jpreci*jpj*jpk*jpbyt1044 1045 SELECT CASE ( nbondi )1046 1047 CASE ( -1 )1048 CALL mppsend(2,t3we(1,1,1,1),imigr,noea,0)1049 CALL mpprecv(1,t3ew(1,1,1,2),imigr)1050 1051 CASE ( 0 )1052 CALL mppsend(1,t3ew(1,1,1,1),imigr,nowe,0)1053 CALL mppsend(2,t3we(1,1,1,1),imigr,noea,0)1054 CALL mpprecv(1,t3ew(1,1,1,2),imigr)1055 CALL mpprecv(2,t3we(1,1,1,2),imigr)1056 1057 CASE ( 1 )1058 CALL mppsend(1,t3ew(1,1,1,1),imigr,nowe,0)1059 CALL mpprecv(2,t3we(1,1,1,2),imigr)1060 END SELECT1061 1062 935 #endif 1063 936 … … 1114 987 ! ! = S : T-point, north fold treatment 1115 988 ! ! = G : F-point, north fold treatment 989 ! ! = I : sea-ice velocity at F-point with index shift 1116 990 REAL(wp), INTENT( in ) :: & 1117 991 psgn ! control of the sign change … … 1135 1009 ! ! ==================== 1136 1010 1137 IF( nbondi == 2 .AND.(nperio == 1 .OR. nperio == 4 .OR. nperio == 6)) THEN1011 IF( nbondi == 2 .AND. (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN 1138 1012 ! ... cyclic 1139 1013 pt2d( 1 ,:) = pt2d(jpim1,:) … … 1246 1120 END SELECT 1247 1121 1248 #else1249 !! * PVM version1250 1251 imigr=jpreci*jpj*jpbyt1252 1253 SELECT CASE ( nbondi )1254 1255 CASE ( -1 )1256 CALL mppsend(2,t2we(1,1,1),imigr,noea,0)1257 CALL mpprecv(1,t2ew(1,1,2),imigr)1258 1259 CASE ( 0 )1260 CALL mppsend(1,t2ew(1,1,1),imigr,nowe,0)1261 CALL mppsend(2,t2we(1,1,1),imigr,noea,0)1262 CALL mpprecv(1,t2ew(1,1,2),imigr)1263 CALL mpprecv(2,t2we(1,1,2),imigr)1264 1265 CASE ( 1 )1266 CALL mppsend(1,t2ew(1,1,1),imigr,nowe,0)1267 CALL mpprecv(2,t2we(1,1,2),imigr)1268 END SELECT1269 1270 1122 #endif 1271 1123 … … 1352 1204 END SELECT 1353 1205 1354 #else1355 !! * PVM version1356 1357 imigr=jprecj*jpi*jpbyt1358 1359 SELECT CASE ( nbondj )1360 1361 CASE ( -1 )1362 CALL mppsend(4,t2sn(1,1,1),imigr,nono,0)1363 CALL mpprecv(3,t2ns(1,1,2),imigr)1364 1365 CASE ( 0 )1366 CALL mppsend(3,t2ns(1,1,1),imigr,noso,0)1367 CALL mppsend(4,t2sn(1,1,1),imigr,nono,0)1368 CALL mpprecv(3,t2ns(1,1,2),imigr)1369 CALL mpprecv(4,t2sn(1,1,2),imigr)1370 1371 CASE ( 1 )1372 CALL mppsend(3,t2ns(1,1,1),imigr,noso,0)1373 CALL mpprecv(4,t2sn(1,1,2),imigr)1374 END SELECT1375 1376 1206 #endif 1377 1207 … … 1568 1398 SELECT CASE ( nbondi ) 1569 1399 1570 CASE ( -1 )1571 CALL mppsend(2,t2we(1,1,1),imigr,noea,0)1572 CALL mpprecv(1,t2ew(1,1,2),imigr)1573 1574 CASE ( 0 )1575 CALL mppsend(1,t2ew(1,1,1),imigr,nowe,0)1576 CALL mppsend(2,t2we(1,1,1),imigr,noea,0)1577 CALL mpprecv(1,t2ew(1,1,2),imigr)1578 CALL mpprecv(2,t2we(1,1,2),imigr)1579 1580 CASE ( 1 )1581 CALL mppsend(1,t2ew(1,1,1),imigr,nowe,0)1582 CALL mpprecv(2,t2we(1,1,2),imigr)1583 END SELECT1584 1585 #else1586 !! * PVM version1587 1588 imigr=jpreci*jpj*jpbyt1589 1590 SELECT CASE ( nbondi )1591 1592 1400 CASE ( -1 ) 1593 1401 CALL mppsend(2,t2we(1,1,1),imigr,noea,0) … … 1658 1466 1659 1467 !! * Local variables 1660 INTEGER :: ji, j j, jl! dummy loop indices1468 INTEGER :: ji, jl ! dummy loop indices 1661 1469 INTEGER :: & 1662 1470 imigr, iihom, ijhom ! temporary integers … … 1703 1511 CALL mpprecv(3,t2p1(1,1,2),imigr) 1704 1512 1705 # else1706 !! * PVM version1707 1708 imigr=jprecj*jpi*jpbyt1709 1710 CALL mppsend(3,t2p1(1,1,1),imigr,nono,0)1711 CALL mpprecv(3,t2p1(1,1,2),imigr)1712 1713 1513 #endif 1714 1514 … … 1735 1535 1736 1536 imigr=jprecj*jpi 1737 1738 CALL mppsend(3,t2p1(1,1,1),imigr,nono,0)1739 CALL mpprecv(3,t2p1(1,1,2),imigr)1740 1741 # else1742 !! * PVM version1743 1744 imigr=jprecj*jpi*jpbyt1745 1537 1746 1538 CALL mppsend(3,t2p1(1,1,1),imigr,nono,0) … … 1821 1613 END SELECT 1822 1614 1823 # else1824 !! * PVM version1825 1826 imigr=jpreci*jpj*jpbyt1827 1828 SELECT CASE ( nbondi )1829 1830 CASE ( -1 )1831 CALL mppsend(2,t2we(1,1,1),imigr,noea,0)1832 CALL mpprecv(1,t2ew(1,1,2),imigr)1833 1834 CASE ( 0 )1835 CALL mppsend(1,t2ew(1,1,1),imigr,nowe,0)1836 CALL mppsend(2,t2we(1,1,1),imigr,noea,0)1837 CALL mpprecv(1,t2ew(1,1,2),imigr)1838 CALL mpprecv(2,t2we(1,1,2),imigr)1839 1840 CASE ( 1 )1841 CALL mppsend(1,t2ew(1,1,1),imigr,nowe,0)1842 CALL mpprecv(2,t2we(1,1,2),imigr)1843 1844 END SELECT1845 1846 1615 #endif 1847 1616 … … 1933 1702 END SELECT 1934 1703 1935 # else1936 !! * PVM version1937 1938 imigr=jprecj*jpi*jpbyt1939 1940 SELECT CASE ( nbondj )1941 1942 CASE ( -1 )1943 CALL mppsend(4,t2sn(1,1,1),imigr,nono,0)1944 CALL mpprecv(3,t2ns(1,1,2),imigr)1945 1946 CASE ( 0 )1947 CALL mppsend(3,t2ns(1,1,1),imigr,noso,0)1948 CALL mppsend(4,t2sn(1,1,1),imigr,nono,0)1949 CALL mpprecv(3,t2ns(1,1,2),imigr)1950 CALL mpprecv(4,t2sn(1,1,2),imigr)1951 1952 CASE ( 1 )1953 CALL mppsend(3,t2ns(1,1,1),imigr,noso,0)1954 CALL mpprecv(4,t2sn(1,1,2),imigr)1955 END SELECT1956 1704 #endif 1957 1705 … … 2012 1760 CALL mpi_send(pmess,kbytes,mpi_real8,kdest,ktyp, & 2013 1761 mpi_comm_world,iflag) 2014 2015 # else 2016 !! * Local variables ( PVM version) 2017 INTEGER :: iflag 2018 INTEGER :: itid_dest,info 2019 2020 itid_dest = npvm_tids(kdest) 2021 IF( mppsend_print /= 0 ) THEN 2022 WRITE(nummpp,*) 'mytid=',npvm_mytid, ' ========== mppsend ========== ' 2023 WRITE(nummpp,*) 'mytid=',npvm_mytid, ' kbytes=',kbytes,' kdest=',kdest & 2024 ,' ktyp=',ktyp,' iflag=',iflag 2025 ENDIF 2026 2027 CALL pvmfinitsend(pvmdataraw, info) 2028 CALL pvmfpack( byte1, pmess, kbytes, 1, info ) 2029 2030 IF( info < 0 ) STOP ' mppsend : problem in pvmfpack ' 2031 CALL pvmfsend ( itid_dest , ktyp , iflag ) 2032 IF( iflag < 0 ) STOP ' mppsend : problem in pvmfsend ' 2033 IF(mppsend_print /= 0 ) THEN 2034 WRITE(nummpp,*) 'mytid=',npvm_mytid,' after:itid_dest=' ,itid_dest,' iflag=',iflag 2035 ENDIF 2036 #endif 1762 #endif 1763 2037 1764 END SUBROUTINE mppsend 2038 1765 … … 2061 1788 mpi_comm_world, istatus, iflag ) 2062 1789 2063 # else2064 !! * Local variables ( PVM version)2065 INTEGER :: itid_kexp, info, ibufid2066 2067 itid_kexp = -12068 IF( mpprecv_print /= 0 ) THEN2069 WRITE(nummpp,*) 'mytid=',npvm_mytid, ' ============= mpprecv ============'2070 WRITE(nummpp,*) 'mytid=',npvm_mytid, ' mpprecv, pvmfrecv, itid_kexp=',itid_kexp2071 ENDIF2072 CALL pvmfrecv ( itid_kexp , ktyp , ibufid )2073 IF( mpprecv_print /= 0 ) THEN2074 WRITE(nummpp,*) 'mytid=',npvm_mytid,' mpprecv,END pvmfrecv' &2075 ,'ibufid=',ibufid,' npvm_me=',npvm_me2076 ENDIF2077 CALL pvmfunpack( byte1, pmess, kbytes, 1, info )2078 IF( info < 0 ) kbytes = info2079 1790 #endif 2080 1791 … … 2084 1795 SUBROUTINE mppgather( ptab, kk, kp, pio ) 2085 1796 !!---------------------------------------------------------------------- 2086 !! routine mppgather 2087 !! ********************* 2088 !! ** Purpose : 2089 !! Transfert between a local subdomain array and a work array 2090 !! which is distributed following the vertical level. 2091 !! 2092 !! ** Method : 2093 !! 2094 !! Input : 2095 !! argument 2096 !! ptab : subdomain array input 2097 !! kk : vertical level 2098 !! kp : record length 2099 !! 2100 !! Output : 2101 !! argument 2102 !! pio : output array 1797 !! *** routine mppgather *** 1798 !! 1799 !! ** Purpose : Transfert between a local subdomain array and a work 1800 !! array which is distributed following the vertical level. 1801 !! 1802 !! ** Method : 2103 1803 !! 2104 1804 !!---------------------------------------------------------------------- … … 2126 1826 CALL mpi_gather(ptab,itaille,mpi_real8,pio,itaille & 2127 1827 ,mpi_real8,kp,mpi_comm_world,ierror) 2128 #else2129 !! * Local variables (PVM version)2130 2131 INTEGER :: imess,ic2132 INTEGER :: ji,jj2133 INTEGER :: ii2134 2135 IF(jpnij == 1 ) THEN2136 DO jj = 1, jpj2137 DO ji = 1, jpi2138 pio(ji,jj,1) = ptab(ji,jj)2139 END DO2140 END DO2141 RETURN2142 ENDIF2143 CALL mppsync2144 IF( npvm_me /= kp ) THEN2145 2146 ! send data to the root member2147 2148 imess=kk+ 100000*npvm_me2149 CALL mppsend(imess,ptab,jpi*jpj*jpbyt,kp,0)2150 ELSE2151 2152 ! receive message form other member2153 ! of the group2154 2155 DO ji=0,npvm_nproc-12156 IF (ji == npvm_me ) THEN2157 pio(:,:,ji+1) = ptab(:,:)2158 ELSE2159 imess=kk+ 100000*ji2160 CALL mpprecv(imess,pio(1,1,ji+1),jpi*jpj*jpbyt)2161 ENDIF2162 END DO2163 ENDIF2164 CALL mppsync2165 1828 #endif 2166 1829 … … 2209 1872 mpi_real8,kp,mpi_comm_world,ierror) 2210 1873 2211 # else2212 !! * Local variables (PVM version)2213 INTEGER :: imess,ic2214 INTEGER :: ji,jj2215 2216 IF(jpnij == 1 ) THEN2217 DO jj = 1, jpj2218 DO ji = 1, jpi2219 ptab(ji,jj) = pio(ji,jj,1)2220 END DO2221 END DO2222 RETURN2223 ENDIF2224 CALL mppsync2225 imess=kk2226 CALL pvmfscatter(ptab,pio,jpi*jpj,jpvmreal,imess,opaall,kp,ic)2227 IF(ic /= 0 ) THEN2228 WRITE(nummpp,*) "problem pvmfscatter kk=", kk, " kp=", kp2229 ENDIF2230 CALL mppsync2231 1874 #endif 2232 1875 … … 2284 1927 2285 1928 # elif defined key_mpp_mpi 1929 2286 1930 !! * Local variables (MPI version) 2287 1931 LOGICAL :: lcommute … … 2295 1939 ktab(:) = iwork(:) 2296 1940 2297 # else2298 !! * Local variables (PVM version)2299 INTEGER :: ityd2300 INTEGER :: info,itype,ibuf,iroot2301 EXTERNAL PvmIsl22302 2303 itype= 1002304 iroot=02305 ityd=npvm_tids(npvm_me)2306 IF(jpnij == 1) RETURN2307 IF(mppisl_print /= 0 ) THEN2308 WRITE(nummpp,*) 'mppisl_a_int me=',npvm_me,' ityd=',ityd2309 ENDIF2310 CALL pvmfreduce(PvmIsl2, ktab, kdim, jpvmint, &2311 itype, opaall, iroot,info)2312 IF(iroot == npvm_me ) THEN2313 CALL pvmfinitsend(pvmdataraw, ibuf )2314 CALL pvmfpack(jpvmint,ktab,kdim,1,info)2315 IF(info /= 0 ) THEN2316 WRITE(nummpp,*) 'me=',npvm_me,' pvmfpack problem'2317 STOP 'mppisl_a_int'2318 ENDIF2319 CALL pvmfbcast(opaall,itype+1,info)2320 IF(info /= 0 ) THEN2321 WRITE(nummpp,*) 'me=',npvm_me,' pvmfbcast problem'2322 STOP 'mppisl_a_int'2323 ENDIF2324 ELSE2325 CALL pvmfrecv(iroot,itype+1,ibuf)2326 CALL pvmfunpack(jpvmint,ktab,kdim,1,info)2327 IF(info /= 0 ) THEN2328 WRITE(nummpp,*) 'me=',npvm_me,' pvmfunpack problem'2329 STOP 'mppisl_a_int'2330 ENDIF2331 ENDIF2332 CALL pvmfbarrier(opaall,npvm_nproc,info)2333 1941 #endif 2334 1942 … … 2374 1982 2375 1983 # elif defined key_mpp_mpi 1984 2376 1985 !! * Local variables (MPI version) 2377 1986 LOGICAL :: lcommute … … 2385 1994 ktab = iwork 2386 1995 2387 # else2388 !! * Local variables (PVM version)2389 INTEGER :: ityd2390 INTEGER :: info,itype,ibuf,iroot2391 EXTERNAL PvmIsl22392 2393 itype= 1002394 iroot=02395 ityd=npvm_tids(npvm_me)2396 IF(jpnij == 1) RETURN2397 IF(mppisl_print /= 0 ) THEN2398 WRITE(nummpp,*) 'mppisl_int me=',npvm_me,' ityd=',ityd2399 ENDIF2400 CALL pvmfreduce(PvmIsl2, ktab, 1, jpvmint, &2401 itype, opaall, iroot,info)2402 IF(iroot == npvm_me ) THEN2403 CALL pvmfinitsend(pvmdataraw, ibuf )2404 CALL pvmfpack(jpvmint,ktab, 1,1,info)2405 IF(info /= 0 ) THEN2406 WRITE(nummpp,*) 'me=',npvm_me,' pvmfpack problem'2407 STOP 'mppisl_int'2408 ENDIF2409 CALL pvmfbcast(opaall,itype+1,info)2410 IF(info /= 0 ) THEN2411 WRITE(nummpp,*) 'me=',npvm_me,' pvmfbcast problem'2412 STOP 'mppisl_int'2413 ENDIF2414 ELSE2415 CALL pvmfrecv(iroot,itype+1,ibuf)2416 CALL pvmfunpack(jpvmint,ktab, 1,1,info)2417 IF(info /= 0 ) THEN2418 WRITE(nummpp,*) 'me=',npvm_me,' pvmfunpack problem'2419 STOP 'mppisl_int'2420 ENDIF2421 ENDIF2422 CALL pvmfbarrier(opaall,npvm_nproc,info)2423 1996 #endif 2424 1997 2425 1998 END SUBROUTINE mppisl_int 2426 2427 SUBROUTINE PvmIsl2( kdtatyp, kx, ky, kdim, knfo )2428 INTEGER , INTENT( in ) :: kdim ! size of others arguments2429 INTEGER , DIMENSION(kdim), INTENT( inout ) :: &2430 kx, &2431 ky2432 INTEGER :: knfo,kdtatyp,ji2433 DO ji = 1, kdim2434 IF(ky(ji) /= 0) kx(ji) = ky(ji)2435 END DO2436 END SUBROUTINE PvmIsl22437 1999 2438 2000 … … 2478 2040 2479 2041 # elif defined key_mpp_mpi 2042 2480 2043 !! * Local variables (MPI version) 2481 2044 INTEGER :: ierror … … 2487 2050 ktab(:) = iwork(:) 2488 2051 2489 # else2490 !! * Local variables (PVM version)2491 INTEGER :: ityd2492 INTEGER :: info,itype,ibuf,iroot2493 EXTERNAL PvmMin2494 2495 itype= 1002496 iroot=02497 ityd=npvm_tids(npvm_me)2498 IF(jpnij == 1) RETURN2499 IF(mppmin_print /= 0 ) THEN2500 WRITE(nummpp,*) 'mppmin_a_int me=',npvm_me,' ityd=',ityd2501 ENDIF2502 CALL pvmfreduce(PvmMin,ktab, kdim, jpvmint, &2503 itype, opaall, iroot, info)2504 IF(iroot == npvm_me ) THEN2505 CALL pvmfinitsend(pvmdataraw, ibuf )2506 CALL pvmfpack(jpvmint,ktab,kdim,1,info)2507 IF(info /= 0 ) THEN2508 WRITE(nummpp,*) 'me=',npvm_me,' pvmfpack problem'2509 STOP 'mppmin_a_int'2510 ENDIF2511 CALL pvmfbcast(opaall,itype+1,info)2512 IF(info /= 0 ) THEN2513 WRITE(nummpp,*) 'me=',npvm_me,' pvmfbcast problem'2514 STOP 'mppmin_a_int'2515 ENDIF2516 ELSE2517 CALL pvmfrecv(iroot,itype+1,ibuf)2518 CALL pvmfunpack(jpvmint,ktab,kdim,1,info)2519 IF(info /= 0 ) THEN2520 WRITE(nummpp,*) 'me=',npvm_me,' pvmfunpack problem'2521 STOP 'mppmin_a_int'2522 ENDIF2523 ENDIF2524 CALL pvmfbarrier(opaall,npvm_nproc,info)2525 2052 #endif 2526 2053 2527 2054 END SUBROUTINE mppmin_a_int 2055 2528 2056 2529 2057 SUBROUTINE mppmin_int( ktab ) … … 2542 2070 2543 2071 #if defined key_mpp_shmem 2072 2544 2073 !! * Local variables (SHMEM version) 2545 2074 INTEGER :: ji … … 2561 2090 2562 2091 # elif defined key_mpp_mpi 2092 2563 2093 !! * Local variables (MPI version) 2564 2094 INTEGER :: ierror, iwork … … 2569 2099 ktab = iwork 2570 2100 2571 # else2572 !! * Local variables (PVM version)2573 INTEGER :: ityd2574 INTEGER :: info,itype,ibuf,iroot2575 EXTERNAL PvmMin2576 2577 itype= 1002578 iroot=02579 ityd=npvm_tids(npvm_me)2580 IF(jpnij == 1) RETURN2581 IF(mppmin_print /= 0 ) THEN2582 WRITE(nummpp,*) 'mppmin_int me=',npvm_me,' ityd=',ityd2583 ENDIF2584 CALL pvmfreduce(PvmMin,ktab, 1, jpvmint, &2585 itype, opaall, iroot, info)2586 IF(iroot == npvm_me ) THEN2587 CALL pvmfinitsend(pvmdataraw, ibuf )2588 CALL pvmfpack(jpvmint,ktab, 1,1,info)2589 IF(info /= 0 ) THEN2590 WRITE(nummpp,*) 'me=',npvm_me,' pvmfpack problem'2591 STOP 'mppmin_int'2592 ENDIF2593 CALL pvmfbcast(opaall,itype+1,info)2594 IF(info /= 0 ) THEN2595 WRITE(nummpp,*) 'me=',npvm_me,' pvmfbcast problem'2596 STOP 'mppmin_int'2597 ENDIF2598 ELSE2599 CALL pvmfrecv(iroot,itype+1,ibuf)2600 CALL pvmfunpack(jpvmint,ktab, 1,1,info)2601 IF(info /= 0 ) THEN2602 WRITE(nummpp,*) 'me=',npvm_me,' pvmfunpack problem'2603 STOP 'mppmin_int'2604 ENDIF2605 ENDIF2606 CALL pvmfbarrier(opaall,npvm_nproc,info)2607 2101 #endif 2608 2102 2609 2103 END SUBROUTINE mppmin_int 2104 2610 2105 2611 2106 SUBROUTINE mppsum_a_int( ktab, kdim ) … … 2621 2116 INTEGER, INTENT(inout), DIMENSION (kdim) :: ktab ! ??? 2622 2117 2623 2624 2118 #if defined key_mpp_shmem 2119 2625 2120 !! * Local variables (SHMEM version) 2626 2121 INTEGER :: ji … … 2652 2147 2653 2148 # elif defined key_mpp_mpi 2149 2654 2150 !! * Local variables (MPI version) 2655 2151 INTEGER :: ierror … … 2661 2157 ktab(:) = iwork(:) 2662 2158 2663 # else2664 !! * Local variables (PVM version)2665 INTEGER :: ityd2666 INTEGER :: info,itype,ibuf,iroot2667 EXTERNAL PvmSum2668 2669 itype= 1002670 iroot=02671 ityd=npvm_tids(npvm_me)2672 IF(jpnij == 1) RETURN2673 IF(mppsum_print /= 0 ) THEN2674 WRITE(nummpp,*) 'mppsum_a_int me=',npvm_me,' ityd=',ityd2675 ENDIF2676 CALL pvmfreduce(PvmSum, ktab, kdim, jpvmint, &2677 itype, opaall, iroot, info)2678 IF(iroot == npvm_me ) THEN2679 CALL pvmfinitsend(pvmdataraw, ibuf )2680 CALL pvmfpack(jpvmint,ktab,kdim,1,info)2681 IF(info /= 0 ) THEN2682 WRITE(nummpp,*) 'me=',npvm_me,' pvmfpack problem'2683 STOP 'mppsum_a_int'2684 ENDIF2685 CALL pvmfbcast(opaall,itype+1,info)2686 IF(info /= 0 ) THEN2687 WRITE(nummpp,*) 'me=',npvm_me,' pvmfbcast problem'2688 STOP 'mppsum_a_int'2689 ENDIF2690 ELSE2691 CALL pvmfrecv(iroot,itype+1,ibuf)2692 CALL pvmfunpack(jpvmint,ktab,kdim,1,info)2693 IF(info /= 0 ) THEN2694 WRITE(nummpp,*) 'me=',npvm_me,' pvmfunpack problem'2695 STOP 'mppsum_a_int'2696 ENDIF2697 ENDIF2698 CALL pvmfbarrier(opaall,npvm_nproc,info)2699 2700 2159 #endif 2701 2160 2702 2161 END SUBROUTINE mppsum_a_int 2162 2703 2163 2704 2164 SUBROUTINE mppsum_int( ktab ) … … 2713 2173 2714 2174 #if defined key_mpp_shmem 2175 2715 2176 !! * Local variables (SHMEM version) 2716 2177 INTEGER, SAVE :: ibool=0 … … 2729 2190 ibool=MOD( ibool,2) 2730 2191 ktab = nistab_shmem(1) 2731 ! 2192 2732 2193 # elif defined key_mpp_mpi 2194 2733 2195 !! * Local variables (MPI version) 2734 2196 INTEGER :: ierror, iwork … … 2738 2200 2739 2201 ktab = iwork 2740 2741 # else2742 !! * Local variables (PVM version)2743 INTEGER :: ityd2744 INTEGER :: info,itype,ibuf,iroot2745 EXTERNAL PvmSum2746 2747 itype= 1002748 iroot=02749 ityd=npvm_tids(npvm_me)2750 IF(jpnij == 1) RETURN2751 IF(mppsum_print /= 0 ) THEN2752 WRITE(nummpp,*) 'mppsum_int me=',npvm_me,' ityd=',ityd2753 ENDIF2754 CALL pvmfreduce(PvmSum, ktab, 1, jpvmint, &2755 itype, opaall, iroot, info)2756 IF(iroot == npvm_me ) THEN2757 CALL pvmfinitsend(pvmdataraw, ibuf )2758 CALL pvmfpack(jpvmint,ktab, 1,1,info)2759 IF(info /= 0 ) THEN2760 WRITE(nummpp,*) 'me=',npvm_me,' pvmfpack problem'2761 STOP 'mppsum_int'2762 ENDIF2763 CALL pvmfbcast(opaall,itype+1,info)2764 IF(info /= 0 ) THEN2765 WRITE(nummpp,*) 'me=',npvm_me,' pvmfbcast problem'2766 STOP 'mppsum_int'2767 ENDIF2768 ELSE2769 CALL pvmfrecv(iroot,itype+1,ibuf)2770 CALL pvmfunpack(jpvmint,ktab, 1,1,info)2771 IF(info /= 0 ) THEN2772 WRITE(nummpp,*) 'me=',npvm_me,' pvmfunpack problem'2773 STOP 'mppsum_int'2774 ENDIF2775 ENDIF2776 CALL pvmfbarrier(opaall,npvm_nproc,info)2777 2202 2778 2203 #endif … … 2797 2222 2798 2223 #if defined key_mpp_shmem 2224 2799 2225 !! * Local variables (SHMEM version) 2800 2226 INTEGER :: ji … … 2834 2260 2835 2261 # elif defined key_mpp_mpi 2262 2836 2263 !! * Local variables (MPI version) 2837 2264 LOGICAL :: lcommute = .TRUE. … … 2844 2271 ptab(:) = zwork(:) 2845 2272 2846 # else2847 !! * Local variables (PVM version)2848 INTEGER :: ityd2849 INTEGER :: info,itype,ibuf,iroot2850 EXTERNAL PvmIsl2851 2852 itype= 1002853 iroot=02854 ityd=npvm_tids(npvm_me)2855 IF(jpnij == 1) RETURN2856 IF(mppisl_print /= 0 ) THEN2857 WRITE(nummpp,*) 'mppisl_a_real me=',npvm_me,' ityd=',ityd2858 ENDIF2859 CALL pvmfreduce(PvmIsl, ptab, kdim, jpvmreal, &2860 itype, opaall, iroot,info)2861 IF(iroot == npvm_me ) THEN2862 CALL pvmfinitsend(pvmdataraw, ibuf )2863 CALL pvmfpack(jpvmreal,ptab,kdim,1,info)2864 IF(info /= 0 ) THEN2865 WRITE(nummpp,*) 'me=',npvm_me,' pvmfpack problem'2866 STOP 'mppisl_a_real'2867 ENDIF2868 CALL pvmfbcast(opaall,itype+1,info)2869 IF(info /= 0 ) THEN2870 WRITE(nummpp,*) 'me=',npvm_me,' pvmfbcast problem'2871 STOP 'mppisl_a_real'2872 ENDIF2873 ELSE2874 CALL pvmfrecv(iroot,itype+1,ibuf)2875 CALL pvmfunpack(jpvmreal,ptab,kdim,1,info)2876 IF(info /= 0 ) THEN2877 WRITE(nummpp,*) 'me=',npvm_me,' pvmfunpack problem'2878 STOP 'mppisl_a_real'2879 ENDIF2880 ENDIF2881 CALL pvmfbarrier(opaall,npvm_nproc,info)2882 2273 #endif 2883 2274 2884 2275 END SUBROUTINE mppisl_a_real 2885 2276 2886 SUBROUTINE mppisl_real( ptab ) 2887 !!---------------------------------------------------------------------- 2888 !! *** routine mppisl_real *** 2889 !! 2890 !! ** Purpose : Massively parallel processors 2891 !! Find the non zero island barotropic stream function value 2892 !! 2893 !! Modifications: 2894 !! ! 93-09 (M. Imbard) 2895 !! ! 96-05 (j. Escobar) 2896 !! ! 98-05 (M. Imbard, J. Escobar, L. Colombet ) SHMEM and MPI 2897 !!---------------------------------------------------------------------- 2898 REAL(wp), INTENT(inout) :: ptab 2277 2278 SUBROUTINE mppisl_real( ptab ) 2279 !!---------------------------------------------------------------------- 2280 !! *** routine mppisl_real *** 2281 !! 2282 !! ** Purpose : Massively parallel processors 2283 !! Find the non zero island barotropic stream function value 2284 !! 2285 !! Modifications: 2286 !! ! 93-09 (M. Imbard) 2287 !! ! 96-05 (j. Escobar) 2288 !! ! 98-05 (M. Imbard, J. Escobar, L. Colombet ) SHMEM and MPI 2289 !!---------------------------------------------------------------------- 2290 REAL(wp), INTENT(inout) :: ptab 2899 2291 2900 2292 #if defined key_mpp_shmem 2901 !! * Local variables (SHMEM version) 2902 INTEGER, SAVE :: ibool=0 2903 2904 wiltab_shmem(1) = ptab 2905 CALL barrier() 2906 IF(ibool == 0 ) THEN 2907 CALL shmem_real8_min_to_all (wi1tab_shmem,wiltab_shmem, 1,0 & 2293 2294 !! * Local variables (SHMEM version) 2295 INTEGER, SAVE :: ibool=0 2296 2297 wiltab_shmem(1) = ptab 2298 CALL barrier() 2299 IF(ibool == 0 ) THEN 2300 CALL shmem_real8_min_to_all (wi1tab_shmem,wiltab_shmem, 1,0 & 2908 2301 ,0,N$PES,wi11wrk_shmem,ni11sync_shmem) 2909 CALL shmem_real8_max_to_all (wi2tab_shmem,wiltab_shmem, 1,0 &2302 CALL shmem_real8_max_to_all (wi2tab_shmem,wiltab_shmem, 1,0 & 2910 2303 ,0,N$PES,wi12wrk_shmem,ni12sync_shmem) 2911 ELSE2912 CALL shmem_real8_min_to_all (wi1tab_shmem,wiltab_shmem, 1,0 &2304 ELSE 2305 CALL shmem_real8_min_to_all (wi1tab_shmem,wiltab_shmem, 1,0 & 2913 2306 ,0,N$PES,wi21wrk_shmem,ni21sync_shmem) 2914 CALL shmem_real8_max_to_all (wi2tab_shmem,wiltab_shmem, 1,0 &2307 CALL shmem_real8_max_to_all (wi2tab_shmem,wiltab_shmem, 1,0 & 2915 2308 ,0,N$PES,wi22wrk_shmem,ni22sync_shmem) 2916 ENDIF2917 CALL barrier()2918 ibool=ibool+12919 ibool=MOD( ibool,2)2920 IF(wi1tab_shmem(1) /= 0. ) THEN2921 ptab = wi1tab_shmem(1)2922 ELSE2923 ptab = wi2tab_shmem(1)2924 ENDIF2309 ENDIF 2310 CALL barrier() 2311 ibool=ibool+1 2312 ibool=MOD( ibool,2) 2313 IF(wi1tab_shmem(1) /= 0. ) THEN 2314 ptab = wi1tab_shmem(1) 2315 ELSE 2316 ptab = wi2tab_shmem(1) 2317 ENDIF 2925 2318 2926 2319 # elif defined key_mpp_mpi 2927 !! * Local variables (MPI version) 2928 LOGICAL :: lcommute = .TRUE. 2929 INTEGER :: mpi_isl, ierror 2930 REAL(wp) :: zwork 2931 2932 CALL mpi_op_create(lc_isl,lcommute,mpi_isl,ierror) 2933 CALL mpi_allreduce(ptab, zwork, 1,mpi_real8 & 2320 2321 !! * Local variables (MPI version) 2322 LOGICAL :: lcommute = .TRUE. 2323 INTEGER :: mpi_isl, ierror 2324 REAL(wp) :: zwork 2325 2326 CALL mpi_op_create(lc_isl,lcommute,mpi_isl,ierror) 2327 CALL mpi_allreduce(ptab, zwork, 1,mpi_real8 & 2934 2328 & ,mpi_isl,mpi_comm_world,ierror) 2935 ptab = zwork 2936 2937 # else 2938 !! * Local variables (PVM version) 2939 INTEGER :: ityd 2940 INTEGER :: info,itype,ibuf,iroot 2941 EXTERNAL PvmIsl 2942 2943 itype= 100 2944 iroot=0 2945 ityd=npvm_tids(npvm_me) 2946 IF(jpnij == 1) RETURN 2947 IF(mppisl_print /= 0 ) THEN 2948 WRITE(nummpp,*) 'mppisl_real me=',npvm_me,' ityd=',ityd 2949 ENDIF 2950 CALL pvmfreduce(PvmIsl, ptab, 1, jpvmreal, & 2951 itype, opaall, iroot,info) 2952 IF(iroot == npvm_me ) THEN 2953 CALL pvmfinitsend(pvmdataraw, ibuf ) 2954 CALL pvmfpack(jpvmreal,ptab, 1,1,info) 2955 IF(info /= 0 ) THEN 2956 WRITE(nummpp,*) 'me=',npvm_me,' pvmfpack problem' 2957 STOP 'mppisl_real' 2958 ENDIF 2959 CALL pvmfbcast(opaall,itype+1,info) 2960 IF(info /= 0 ) THEN 2961 WRITE(nummpp,*) 'me=',npvm_me,' pvmfbcast problem' 2962 STOP 'mppisl_real' 2963 ENDIF 2964 ELSE 2965 CALL pvmfrecv(iroot,itype+1,ibuf) 2966 CALL pvmfunpack(jpvmreal,ptab, 1,1,info) 2967 IF(info /= 0 ) THEN 2968 WRITE(nummpp,*) 'me=',npvm_me,' pvmfunpack problem' 2969 STOP 'mppisl_real' 2970 ENDIF 2971 ENDIF 2972 CALL pvmfbarrier(opaall,npvm_nproc,info) 2973 #endif 2974 2975 END SUBROUTINE mppisl_real 2976 !CCMPPJM end 2977 2978 SUBROUTINE PvmIsl( kdtatyp, px, py, kdim, knfo ) 2979 INTEGER :: kdim 2980 REAL(wp),DIMENSION(kdim) :: px,py 2981 INTEGER :: knfo,kdtatyp,ji 2982 DO ji = 1, kdim 2983 IF(py(ji) /= 0.) px(ji) = py(ji) 2984 END DO 2985 END SUBROUTINE PvmIsl 2329 ptab = zwork 2330 2331 #endif 2332 2333 END SUBROUTINE mppisl_real 2986 2334 2987 2335 2988 2336 FUNCTION lc_isl( py, px, kdim, kdtatyp ) 2989 2337 INTEGER :: kdim 2990 REAL(wp), DIMENSION(kdim) :: px,py2991 INTEGER :: kdtatyp, ji2338 REAL(wp), DIMENSION(kdim) :: px, py 2339 INTEGER :: kdtatyp, ji 2992 2340 INTEGER :: lc_isl 2993 2341 DO ji = 1, kdim 2994 IF( py(ji) /= 0.)px(ji) = py(ji)2342 IF( py(ji) /= 0. ) px(ji) = py(ji) 2995 2343 END DO 2996 2344 lc_isl=0 … … 3011 2359 3012 2360 #if defined key_mpp_shmem 2361 3013 2362 !! * Local variables (SHMEM version) 3014 2363 INTEGER :: ji … … 3040 2389 3041 2390 # elif defined key_mpp_mpi 2391 3042 2392 !! * Local variables (MPI version) 3043 2393 INTEGER :: ierror … … 3048 2398 ptab(:) = zwork(:) 3049 2399 3050 # else3051 !! * Local variables (PVM version)3052 INTEGER :: ityd3053 INTEGER :: info,itype,ibuf,iroot3054 EXTERNAL PvmMax3055 3056 itype= 1003057 iroot=03058 ityd=npvm_tids(npvm_me)3059 IF(jpnij == 1) RETURN3060 IF(mppmax_print /= 0 ) THEN3061 WRITE(nummpp,*) 'mppmax_a_real me=',npvm_me,' ityd=',ityd3062 ENDIF3063 CALL pvmfreduce(PvmMax, ptab, kdim, jpvmreal, &3064 itype, opaall, iroot, info)3065 IF(iroot == npvm_me ) THEN3066 CALL pvmfinitsend(pvmdataraw, ibuf )3067 CALL pvmfpack(jpvmreal,ptab,kdim,1,info)3068 IF(info /= 0 ) THEN3069 WRITE(nummpp,*) 'me=',npvm_me,' pvmfpack problem'3070 STOP 'mppmax_a_real'3071 ENDIF3072 CALL pvmfbcast(opaall,itype+1,info)3073 IF(info /= 0 ) THEN3074 WRITE(nummpp,*) 'me=',npvm_me,' pvmfbcast problem'3075 STOP 'mppmax_a_real'3076 ENDIF3077 ELSE3078 CALL pvmfrecv(iroot,itype+1,ibuf)3079 CALL pvmfunpack(jpvmreal,ptab, 1,1,info)3080 IF(info /= 0 ) THEN3081 WRITE(nummpp,*) 'me=',npvm_me,' pvmfunpack problem'3082 STOP 'mppmax_a_real'3083 ENDIF3084 ENDIF3085 CALL pvmfbarrier(opaall,npvm_nproc,info)3086 3087 2400 #endif 3088 2401 3089 2402 END SUBROUTINE mppmax_a_real 2403 3090 2404 3091 2405 SUBROUTINE mppmax_real( ptab ) … … 3100 2414 3101 2415 #if defined key_mpp_shmem 2416 3102 2417 !! * Local variables (SHMEM version) 3103 2418 INTEGER, SAVE :: ibool=0 … … 3118 2433 3119 2434 # elif defined key_mpp_mpi 2435 3120 2436 !! * Local variables (MPI version) 3121 2437 INTEGER :: ierror … … 3125 2441 ,mpi_max,mpi_comm_world,ierror) 3126 2442 ptab = zwork 3127 3128 # else3129 !! * Local variables (PVM version)3130 INTEGER :: ityd3131 INTEGER :: info,itype,ibuf,iroot3132 EXTERNAL PvmMax3133 3134 itype= 1003135 iroot=03136 ityd=npvm_tids(npvm_me)3137 IF(jpnij == 1) RETURN3138 IF(mppmax_print /= 0 ) THEN3139 WRITE(nummpp,*) 'mppmax_real me=',npvm_me,' ityd=',ityd3140 ENDIF3141 CALL pvmfreduce(PvmMax, ptab, 1, jpvmreal, &3142 itype, opaall, iroot, info)3143 IF(iroot == npvm_me ) THEN3144 CALL pvmfinitsend(pvmdataraw, ibuf )3145 CALL pvmfpack(jpvmreal,ptab, 1,1,info)3146 IF(info /= 0 ) THEN3147 WRITE(nummpp,*) 'me=',npvm_me,' pvmfpack problem'3148 STOP 'mppmax_real'3149 ENDIF3150 CALL pvmfbcast(opaall,itype+1,info)3151 IF(info /= 0 ) THEN3152 WRITE(nummpp,*) 'me=',npvm_me,' pvmfbcast problem'3153 STOP 'mppmax_real'3154 ENDIF3155 ELSE3156 CALL pvmfrecv(iroot,itype+1,ibuf)3157 CALL pvmfunpack(jpvmreal,ptab, 1,1,info)3158 IF(info /= 0 ) THEN3159 WRITE(nummpp,*) 'me=',npvm_me,' pvmfunpack problem'3160 STOP 'mppmax_real'3161 ENDIF3162 ENDIF3163 CALL pvmfbarrier(opaall,npvm_nproc,info)3164 2443 3165 2444 #endif … … 3180 2459 3181 2460 #if defined key_mpp_shmem 2461 3182 2462 !! * Local variables (SHMEM version) 3183 2463 INTEGER :: ji … … 3209 2489 3210 2490 # elif defined key_mpp_mpi 2491 3211 2492 !! * Local variables (MPI version) 3212 2493 INTEGER :: ierror … … 3216 2497 ,mpi_min,mpi_comm_world,ierror) 3217 2498 ptab(:) = zwork(:) 3218 3219 # else3220 !! * Local variables (PVM version)3221 INTEGER :: ityd3222 INTEGER :: info,itype,ibuf,iroot3223 EXTERNAL PvmMin3224 3225 itype= 1003226 iroot=03227 ityd=npvm_tids(npvm_me)3228 IF(jpnij == 1) RETURN3229 IF(mppmin_print /= 0 ) THEN3230 WRITE(nummpp,*) 'mpprmin me=',npvm_me,' ityd=',ityd3231 ENDIF3232 CALL pvmfreduce(PvmMin, ptab, kdim, jpvmreal, &3233 itype, opaall, iroot, info)3234 IF(iroot == npvm_me ) THEN3235 CALL pvmfinitsend(pvmdataraw, ibuf )3236 CALL pvmfpack(jpvmreal,ptab,kdim,1,info)3237 IF(info /= 0 ) THEN3238 WRITE(nummpp,*) 'me=',npvm_me,' pvmfpack problem'3239 STOP 'mpprmin'3240 ENDIF3241 CALL pvmfbcast(opaall,itype+1,info)3242 IF(info /= 0 ) THEN3243 WRITE(nummpp,*) 'me=',npvm_me,' pvmfbcast problem'3244 STOP 'mpprmin'3245 ENDIF3246 ELSE3247 CALL pvmfrecv(iroot,itype+1,ibuf)3248 CALL pvmfunpack(jpvmreal,ptab,kdim,1,info)3249 IF(info /= 0 ) THEN3250 WRITE(nummpp,*) 'me=',npvm_me,' pvmfunpack problem'3251 STOP 'mpprmin'3252 ENDIF3253 ENDIF3254 CALL pvmfbarrier(opaall,npvm_nproc,info)3255 2499 3256 2500 #endif … … 3271 2515 3272 2516 #if defined key_mpp_shmem 2517 3273 2518 !! * Local variables (SHMEM version) 3274 2519 INTEGER, SAVE :: ibool=0 … … 3289 2534 3290 2535 # elif defined key_mpp_mpi 2536 3291 2537 !! * Local variables (MPI version) 3292 2538 INTEGER :: ierror … … 3296 2542 & ,mpi_min,mpi_comm_world,ierror) 3297 2543 ptab = zwork 3298 3299 # else3300 !! * Local variables (PVM version)3301 INTEGER :: ityd3302 INTEGER :: info,itype,ibuf,iroot3303 EXTERNAL PvmMin3304 3305 itype= 1003306 iroot=03307 ityd=npvm_tids(npvm_me)3308 IF(jpnij == 1) RETURN3309 IF(mppmin_print /= 0 ) THEN3310 WRITE(nummpp,*) 'mpprmin me=',npvm_me,' ityd=',ityd3311 ENDIF3312 CALL pvmfreduce(PvmMin, ptab, 1, jpvmreal, &3313 itype, opaall, iroot, info)3314 IF(iroot == npvm_me ) THEN3315 CALL pvmfinitsend(pvmdataraw, ibuf )3316 CALL pvmfpack(jpvmreal,ptab, 1,1,info)3317 IF(info /= 0 ) THEN3318 WRITE(nummpp,*) 'me=',npvm_me,' pvmfpack problem'3319 STOP 'mpprmin'3320 ENDIF3321 CALL pvmfbcast(opaall,itype+1,info)3322 IF(info /= 0 ) THEN3323 WRITE(nummpp,*) 'me=',npvm_me,' pvmfbcast problem'3324 STOP 'mpprmin'3325 ENDIF3326 ELSE3327 CALL pvmfrecv(iroot,itype+1,ibuf)3328 CALL pvmfunpack(jpvmreal,ptab, 1,1,info)3329 IF(info /= 0 ) THEN3330 WRITE(nummpp,*) 'me=',npvm_me,' pvmfunpack problem'3331 STOP 'mpprmin'3332 ENDIF3333 ENDIF3334 CALL pvmfbarrier(opaall,npvm_nproc,info)3335 2544 3336 2545 #endif … … 3351 2560 3352 2561 #if defined key_mpp_shmem 2562 3353 2563 !! * Local variables (SHMEM version) 3354 2564 INTEGER :: ji … … 3380 2590 3381 2591 # elif defined key_mpp_mpi 2592 3382 2593 !! * Local variables (MPI version) 3383 2594 INTEGER :: ierror ! temporary integer … … 3387 2598 & ,mpi_sum,mpi_comm_world,ierror) 3388 2599 ptab(:) = zwork(:) 3389 3390 # else3391 !! * Local variables (PVM version)3392 INTEGER :: ityd3393 INTEGER :: info,itype,ibuf,iroot3394 EXTERNAL PvmSum3395 3396 itype= 1003397 iroot=03398 ityd=npvm_tids(npvm_me)3399 IF(jpnij == 1) RETURN3400 IF(mppsum_print /= 0 ) THEN3401 WRITE(nummpp,*) 'mppsum_a_real me=',npvm_me,' ityd=',ityd3402 ENDIF3403 CALL pvmfreduce(PvmSum, ptab, kdim, jpvmreal, &3404 itype, opaall, iroot, info)3405 IF(iroot == npvm_me ) THEN3406 CALL pvmfinitsend(pvmdataraw, ibuf )3407 CALL pvmfpack(jpvmreal,ptab,kdim,1,info)3408 IF(info /= 0 ) THEN3409 WRITE(nummpp,*) 'me=',npvm_me,' pvmfpack problem'3410 STOP 'mppsum_a_real'3411 ENDIF3412 CALL pvmfbcast(opaall,itype+1,info)3413 IF(info /= 0 ) THEN3414 WRITE(nummpp,*) 'me=',npvm_me,' pvmfbcast problem'3415 STOP 'mppsum_a_real'3416 ENDIF3417 ELSE3418 CALL pvmfrecv(iroot,itype+1,ibuf)3419 CALL pvmfunpack(jpvmreal,ptab,kdim,1,info)3420 IF(info /= 0 ) THEN3421 WRITE(nummpp,*) 'me=',npvm_me,' pvmfunpack problem'3422 STOP 'mppsum_a_real'3423 ENDIF3424 ENDIF3425 CALL pvmfbarrier(opaall,npvm_nproc,info)3426 2600 3427 2601 #endif … … 3441 2615 3442 2616 #if defined key_mpp_shmem 2617 3443 2618 !! * Local variables (SHMEM version) 3444 2619 INTEGER, SAVE :: ibool=0 … … 3459 2634 3460 2635 # elif defined key_mpp_mpi 2636 3461 2637 !! * Local variables (MPI version) 3462 2638 INTEGER :: ierror … … 3467 2643 ptab = zwork 3468 2644 3469 # else3470 !! * Local variables (PVM version)3471 INTEGER :: ityd3472 INTEGER :: info,itype,ibuf,iroot3473 EXTERNAL PvmSum3474 3475 itype= 1003476 iroot=03477 ityd=npvm_tids(npvm_me)3478 IF(jpnij == 1) RETURN3479 IF(mppsum_print /= 0 ) THEN3480 WRITE(nummpp,*) 'mppsum_real me=',npvm_me,' ityd=',ityd3481 ENDIF3482 CALL pvmfreduce(PvmSum, ptab, 1, jpvmreal, &3483 itype, opaall, iroot, info)3484 IF(iroot == npvm_me ) THEN3485 CALL pvmfinitsend(pvmdataraw, ibuf )3486 CALL pvmfpack(jpvmreal,ptab,1,1,info)3487 IF(info /= 0 ) THEN3488 WRITE(nummpp,*) 'me=',npvm_me,' pvmfpack problem'3489 STOP 'mppsum_real'3490 ENDIF3491 CALL pvmfbcast(opaall,itype+1,info)3492 IF(info /= 0 ) THEN3493 WRITE(nummpp,*) 'me=',npvm_me,' pvmfbcast problem'3494 STOP 'mppsum_real'3495 ENDIF3496 ELSE3497 CALL pvmfrecv(iroot,itype+1,ibuf)3498 CALL pvmfunpack(jpvmreal,ptab, 1,1,info)3499 IF(info /= 0 ) THEN3500 WRITE(nummpp,*) 'me=',npvm_me,' pvmfunpack problem'3501 STOP 'mppsum_real'3502 ENDIF3503 ENDIF3504 CALL pvmfbarrier(opaall,npvm_nproc,info)3505 3506 2645 #endif 3507 2646 … … 3518 2657 3519 2658 #if defined key_mpp_shmem 2659 3520 2660 !! * Local variables (SHMEM version) 3521 2661 CALL barrier() 3522 2662 3523 2663 # elif defined key_mpp_mpi 2664 3524 2665 !! * Local variables (MPI version) 3525 2666 INTEGER :: ierror … … 3527 2668 CALL mpi_barrier(mpi_comm_world,ierror) 3528 2669 3529 # else3530 !! * Local variables (PVM version)3531 INTEGER :: info3532 3533 IF(jpnij == 1) RETURN3534 IF(mppsync_print /= 0 ) THEN3535 WRITE(nummpp,*) 'mppsync me=',npvm_me3536 ENDIF3537 CALL pvmfbarrier(opaall,npvm_nproc,info)3538 IF(info /= 0 ) THEN3539 WRITE(nummpp,*) 'me=',npvm_me,' barrier problem'3540 STOP 'mppsync'3541 ENDIF3542 2670 #endif 3543 2671 … … 3552 2680 !! 3553 2681 !!---------------------------------------------------------------------- 2682 !! * Modules used 2683 USE cpl_oce ! ??? 2684 USE dtatem ! ??? 2685 USE dtasal ! ??? 2686 USE dtasst ! ??? 2687 3554 2688 !! * Local declarations 3555 2689 INTEGER :: info … … 3587 2721 CLOSE( numwri ) 3588 2722 CALL mppsync 3589 # 2723 #if defined key_mpp_mpi 3590 2724 CALL mpi_finalize(info) 3591 # else 3592 CALL pvmfexit( info ) 3593 # endif 2725 #endif 3594 2726 3595 2727 END SUBROUTINE mppstop … … 3632 2764 INTEGER :: ji, jj, jk, jl ! dummy loop indices 3633 2765 INTEGER :: & 3634 iipt0, iipt1, i i, ilpt1,& ! temporary integers3635 ijpt0, ijpt1, ij,& ! " "2766 iipt0, iipt1, ilpt1, & ! temporary integers 2767 ijpt0, ijpt1, & ! " " 3636 2768 imigr, iihom, ijhom ! " " 3637 2769 REAL(wp), DIMENSION(jpi,jpj) :: & … … 3726 2858 CALL mpprecv(2,t2we(1,1,2),imigr) 3727 2859 ENDIF 3728 3729 # else3730 !! * (PVM version)3731 3732 imigr=jpreci*jpj*jpbyt3733 3734 IF( nbondi == -1 ) THEN3735 CALL mppsend(2,t2we(1,1,1),imigr,noea,0)3736 CALL mpprecv(1,t2ew(1,1,2),imigr)3737 ELSEIF( nbondi == 0 ) THEN3738 CALL mppsend(1,t2ew(1,1,1),imigr,nowe,0)3739 CALL mppsend(2,t2we(1,1,1),imigr,noea,0)3740 CALL mpprecv(1,t2ew(1,1,2),imigr)3741 CALL mpprecv(2,t2we(1,1,2),imigr)3742 ELSEIF( nbondi == 1 ) THEN3743 CALL mppsend(1,t2ew(1,1,1),imigr,nowe,0)3744 CALL mpprecv(2,t2we(1,1,2),imigr)3745 ENDIF3746 3747 2860 #endif 3748 2861 … … 3813 2926 ENDIF 3814 2927 3815 #else3816 !! * (PVM version)3817 3818 imigr=jprecj*jpi*jpbyt3819 3820 IF( nbondj == -1 ) THEN3821 CALL mppsend( 4, t2sn(1,1,1), imigr, nono, 0 )3822 CALL mpprecv( 3, t2ns(1,1,2), imigr )3823 ELSEIF( nbondj == 0 ) THEN3824 CALL mppsend( 3, t2ns(1,1,1), imigr, noso, 0 )3825 CALL mppsend( 4, t2sn(1,1,1), imigr, nono, 0 )3826 CALL mpprecv( 3, t2ns(1,1,2), imigr )3827 CALL mpprecv( 4, t2sn(1,1,2), imigr )3828 ELSEIF( nbondj == 1 ) THEN3829 CALL mppsend( 3, t2ns(1,1,1), imigr, noso, 0 )3830 CALL mpprecv( 4, t2sn(1,1,2), imigr )3831 ENDIF3832 3833 2928 #endif 3834 2929 … … 3868 2963 END SUBROUTINE mppobc 3869 2964 2965 3870 2966 SUBROUTINE mpp_ini_north 3871 2967 !!---------------------------------------------------------------------- 3872 2968 !! *** routine mpp_ini_north *** 3873 2969 3874 !! ** Purpose : 3875 !! Initialize special communicator for north folding condition 3876 !! together with global variables needed in the mpp folding 3877 !! 3878 !! ** Method : 3879 !! Look for northern processors 3880 !! Put their number in nrank_north 3881 !! Create groups for the world processors and the north processors 3882 !! Create a communicator for northern processors 3883 !! 3884 !! ** input 3885 !! none 3886 !! 2970 !! ** Purpose : Initialize special communicator for north folding 2971 !! condition together with global variables needed in the mpp folding 2972 !! 2973 !! ** Method : - Look for northern processors 2974 !! - Put their number in nrank_north 2975 !! - Create groups for the world processors and the north processors 2976 !! - Create a communicator for northern processors 2977 !! 3887 2978 !! ** output 3888 2979 !! njmppmax = njmpp for northern procs … … 3897 2988 !! ! 03-09 (J.M. Molines, MPI only ) 3898 2989 !!---------------------------------------------------------------------- 3899 3900 2990 #ifdef key_mpp_shmem 3901 2991 IF (lwp) THEN … … 3907 2997 INTEGER :: jproc 3908 2998 INTEGER :: ii,ji 3909 2999 !!---------------------------------------------------------------------- 3910 3000 3911 3001 njmppmax=MAXVAL(njmppt) … … 3929 3019 ! 3930 3020 ii=0 3931 DO ji =1,jpnij3021 DO ji = 1, jpnij 3932 3022 IF ( njmppt(ji) == njmppmax ) THEN 3933 3023 ii=ii+1 … … 3949 3039 ! find proc number in the world of proc 0 in the north 3950 3040 CALL MPI_GROUP_TRANSLATE_RANKS(ngrp_north,1,0,ngrp_world,north_root,ierr) 3951 3952 # else 3953 ! PVM 3954 IF (lwp) THEN 3955 WRITE(numout,*) ' mpp_ini_north not available in PVM' 3956 STOP 3957 ENDIF 3958 #endif 3041 #endif 3042 3959 3043 END SUBROUTINE mpp_ini_north 3960 3044 … … 4022 3106 4023 3107 4024 4025 3108 IF (npolj /= 0 ) THEN 4026 3109 ! Build in proc 0 of ncomm_north the znorthgloio … … 4032 3115 itaille=jpi*jpk*ijpj 4033 3116 CALL MPI_GATHER(znorthloc,itaille,MPI_REAL8,znorthgloio,itaille,MPI_REAL8,0,ncomm_north,ierr) 4034 #else4035 not done : compiler error4036 3117 #endif 4037 3118 … … 4196 3277 CALL MPI_SCATTER(znorthgloio,itaille,MPI_REAL8,znorthloc,itaille,MPI_REAL8,0,ncomm_north,ierr) 4197 3278 ENDIF 4198 #else4199 not done yet in PVM4200 3279 #endif 4201 3280 … … 4283 3362 itaille=jpi*ijpj 4284 3363 CALL MPI_GATHER(znorthloc,itaille,MPI_REAL8,znorthgloio,itaille,MPI_REAL8,0,ncomm_north,ierr) 4285 #else4286 not done : compiler error4287 3364 #endif 4288 3365 … … 4404 3481 CASE DEFAULT ! * closed : the code probably never go through 4405 3482 4406 SELECT CASE ( cd_type)4407 4408 CASE ( 'T' , 'U' , 'V' , 'W' ) ! T-, U-, V-, W-points4409 ztab(:, 1 ) = 0.e04410 ztab(:,ijpj) = 0.e04411 4412 CASE ( 'F' ) ! F-point4413 ztab(:,ijpj) = 0.e04414 4415 CASE ( 'I' ) ! ice U-V point4416 ztab(:, 1 ) = 0.e04417 ztab(:,ijpj) = 0.e04418 4419 END SELECT4420 4421 END SELECT4422 4423 ! End of slab4424 ! ===========4425 4426 !! Scatter back to pt2d4427 DO jr = 1, ndim_rank_north4428 jproc=nrank_north(jr)+14429 ildi=nldit (jproc)4430 ilei=nleit (jproc)4431 iilb=nimppt(jproc)4432 DO jj=1,ijpj4433 DO ji=ildi,ilei4434 znorthgloio(ji,jj,jr)=ztab(ji+iilb-1,jj)4435 END DO4436 END DO4437 END DO4438 4439 ENDIF ! only done on proc 0 of ncomm_north3483 SELECT CASE ( cd_type) 3484 3485 CASE ( 'T' , 'U' , 'V' , 'W' ) ! T-, U-, V-, W-points 3486 ztab(:, 1 ) = 0.e0 3487 ztab(:,ijpj) = 0.e0 3488 3489 CASE ( 'F' ) ! F-point 3490 ztab(:,ijpj) = 0.e0 3491 3492 CASE ( 'I' ) ! ice U-V point 3493 ztab(:, 1 ) = 0.e0 3494 ztab(:,ijpj) = 0.e0 3495 3496 END SELECT 3497 3498 END SELECT 3499 3500 ! End of slab 3501 ! =========== 3502 3503 !! Scatter back to pt2d 3504 DO jr = 1, ndim_rank_north 3505 jproc=nrank_north(jr)+1 3506 ildi=nldit (jproc) 3507 ilei=nleit (jproc) 3508 iilb=nimppt(jproc) 3509 DO jj=1,ijpj 3510 DO ji=ildi,ilei 3511 znorthgloio(ji,jj,jr)=ztab(ji+iilb-1,jj) 3512 END DO 3513 END DO 3514 END DO 3515 3516 ENDIF ! only done on proc 0 of ncomm_north 4440 3517 4441 3518 #ifdef key_mpp_shmem 4442 not done yet in shmem : compiler error3519 not done yet in shmem : compiler error 4443 3520 #elif key_mpp_mpi 4444 IF ( npolj /= 0 ) THEN 4445 itaille=jpi*ijpj 4446 CALL MPI_SCATTER(znorthgloio,itaille,MPI_REAL8,znorthloc,itaille,MPI_REAL8,0,ncomm_north,ierr) 4447 ENDIF 3521 IF ( npolj /= 0 ) THEN 3522 itaille=jpi*ijpj 3523 CALL MPI_SCATTER(znorthgloio,itaille,MPI_REAL8,znorthloc,itaille,MPI_REAL8,0,ncomm_north,ierr) 3524 ENDIF 3525 #endif 3526 3527 ! put in the last ijpj jlines of pt2d znorthloc 3528 DO jj = nlcj - ijpj + 1 , nlcj 3529 ij = jj - nlcj + ijpj 3530 pt2d(:,jj)= znorthloc(:,ij) 3531 END DO 3532 3533 END SUBROUTINE mpp_lbc_north_2d 3534 3535 3536 !!!!! 3537 3538 3539 !! 3540 !! This is valid on IBM machine ONLY. 3541 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -*- Mode: F90 -*- !!!!!!!!!!!!!!!!!!!!!!!!!!!!! 3542 !! mpi_init_opa.f90 : Redefinition du point d'entree MPI_INIT de la bibliotheque 3543 !! MPI afin de faire, en plus de l'initialisation de 3544 !! l'environnement MPI, l'allocation d'une zone tampon 3545 !! qui sera ulterieurement utilisee automatiquement lors 3546 !! de tous les envois de messages par MPI_BSEND 3547 !! 3548 !! Auteur : CNRS/IDRIS 3549 !! Date : Tue Nov 13 12:02:14 2001 3550 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 3551 3552 SUBROUTINE mpi_init_opa(code) 3553 IMPLICIT NONE 3554 # include <mpif.h> 3555 3556 INTEGER :: code,rang 3557 3558 ! La valeur suivante doit etre au moins egale a la taille 3559 ! du plus grand message qui sera transfere dans le programme 3560 ! (de toute facon, il y aura un message d'erreur si cette 3561 ! valeur s'avere trop petite) 3562 INTEGER :: taille_tampon 3563 CHARACTER(len=9) :: taille_tampon_alphanum 3564 REAL(kind=8), ALLOCATABLE, DIMENSION(:) :: tampon 3565 3566 ! Le point d'entree dans la bibliotheque MPI elle-meme 3567 CALL mpi_init(code) 3568 3569 ! La definition de la zone tampon pour les futurs envois 3570 ! par MPI_BSEND (on alloue une fois pour toute cette zone 3571 ! tampon, qui sera automatiquement utilisee lors de chaque 3572 ! appel a MPI_BSEND). 3573 ! La desallocation sera implicite quand on sortira de 3574 ! l'environnement MPI. 3575 3576 ! Recuperation de la valeur de la variable d'environnement 3577 ! BUFFER_LENGTH 3578 ! qui, si elle est definie, doit contenir une valeur superieure 3579 ! a la taille en octets du plus gros message 3580 CALL getenv('BUFFER_LENGTH',taille_tampon_alphanum) 3581 3582 ! Si la variable BUFFER_LENGTH n'est pas positionnee, on lui met par 3583 ! defaut la plus grande valeur de la variable MP_EAGER_LIMIT, soit 3584 ! 65 536 octets 3585 IF (taille_tampon_alphanum == ' ') THEN 3586 taille_tampon = 65536 3587 ELSE 3588 READ(taille_tampon_alphanum,'(i9)') taille_tampon 3589 END IF 3590 3591 ! On est limite en mode d'adressage 32 bits a 1750 Mo pour la zone 3592 ! "data" soit 7 segments, c.-a -d. 1750/8 = 210 Mo 3593 IF (taille_tampon > 210000000) THEN 3594 PRINT *,'Attention la valeur BUFFER_LENGTH doit etre <= 210000000' 3595 CALL mpi_abort(MPI_COMM_WORLD,2,code) 3596 END IF 3597 3598 CALL mpi_comm_rank(MPI_COMM_WORLD,rang,code) 3599 IF (rang == 0 ) PRINT *,'Taille du buffer alloue : ',taille_tampon 3600 3601 ! Allocation du tampon et attachement 3602 ALLOCATE(tampon(taille_tampon)) 3603 CALL mpi_buffer_attach(tampon,taille_tampon,code) 3604 3605 END SUBROUTINE mpi_init_opa 3606 3607 4448 3608 #else 4449 not done yet in PVM 4450 #endif 4451 4452 ! put in the last ijpj jlines of pt2d znorthloc 4453 DO jj = nlcj - ijpj + 1 , nlcj 4454 ij = jj - nlcj + ijpj 4455 pt2d(:,jj)= znorthloc(:,ij) 4456 END DO 4457 4458 END SUBROUTINE mpp_lbc_north_2d 4459 4460 4461 !!!!! 4462 4463 4464 !! 4465 !! This is valid on IBM machine ONLY. 4466 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -*- Mode: F90 -*- !!!!!!!!!!!!!!!!!!!!!!!!!!!!! 4467 !! mpi_init_opa.f90 : Redefinition du point d'entree MPI_INIT de la bibliotheque 4468 !! MPI afin de faire, en plus de l'initialisation de 4469 !! l'environnement MPI, l'allocation d'une zone tampon 4470 !! qui sera ulterieurement utilisee automatiquement lors 4471 !! de tous les envois de messages par MPI_BSEND 4472 !! 4473 !! Auteur : CNRS/IDRIS 4474 !! Date : Tue Nov 13 12:02:14 2001 4475 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 4476 4477 SUBROUTINE mpi_init_opa(code) 4478 IMPLICIT NONE 4479 #include <mpif.h> 4480 4481 INTEGER :: code,rang 4482 4483 ! La valeur suivante doit etre au moins egale a la taille 4484 ! du plus grand message qui sera transfere dans le programme 4485 ! (de toute facon, il y aura un message d'erreur si cette 4486 ! valeur s'avere trop petite) 4487 INTEGER :: taille_tampon 4488 CHARACTER(len=9) :: taille_tampon_alphanum 4489 REAL(kind=8), ALLOCATABLE, DIMENSION(:) :: tampon 4490 4491 ! Le point d'entree dans la bibliotheque MPI elle-meme 4492 CALL mpi_init(code) 4493 4494 ! La definition de la zone tampon pour les futurs envois 4495 ! par MPI_BSEND (on alloue une fois pour toute cette zone 4496 ! tampon, qui sera automatiquement utilisee lors de chaque 4497 ! appel a MPI_BSEND). 4498 ! La desallocation sera implicite quand on sortira de 4499 ! l'environnement MPI. 4500 4501 ! Recuperation de la valeur de la variable d'environnement 4502 ! BUFFER_LENGTH 4503 ! qui, si elle est definie, doit contenir une valeur superieure 4504 ! a la taille en octets du plus gros message 4505 CALL getenv('BUFFER_LENGTH',taille_tampon_alphanum) 4506 4507 ! Si la variable BUFFER_LENGTH n'est pas positionnee, on lui met par 4508 ! defaut la plus grande valeur de la variable MP_EAGER_LIMIT, soit 4509 ! 65 536 octets 4510 IF (taille_tampon_alphanum == ' ') THEN 4511 taille_tampon = 65536 4512 ELSE 4513 READ(taille_tampon_alphanum,'(i9)') taille_tampon 4514 END IF 4515 4516 ! On est limite en mode d'adressage 32 bits a 1750 Mo pour la zone 4517 ! "data" soit 7 segments, c.-a -d. 1750/8 = 210 Mo 4518 IF (taille_tampon > 210000000) THEN 4519 PRINT *,'Attention la valeur BUFFER_LENGTH doit etre <= 210000000' 4520 CALL mpi_abort(MPI_COMM_WORLD,2,code) 4521 END IF 4522 4523 CALL mpi_comm_rank(MPI_COMM_WORLD,rang,code) 4524 IF (rang == 0 ) PRINT *,'Taille du buffer alloue : ',taille_tampon 4525 4526 ! Allocation du tampon et attachement 4527 ALLOCATE(tampon(taille_tampon)) 4528 CALL mpi_buffer_attach(tampon,taille_tampon,code) 4529 4530 END SUBROUTINE mpi_init_opa 4531 4532 4533 #else 4534 !!---------------------------------------------------------------------- 4535 !! Default case share memory computing 4536 !!---------------------------------------------------------------------- 4537 4538 IMPLICIT NONE 4539 PRIVATE 4540 4541 !! * Routine accessibility 4542 PUBLIC mynode 3609 !!---------------------------------------------------------------------- 3610 !! Default case: Dummy module share memory computing 3611 !!---------------------------------------------------------------------- 3612 INTERFACE mpp_sum 3613 MODULE PROCEDURE mpp_sum_a2s, mpp_sum_as, mpp_sum_ai, mpp_sum_s, mpp_sum_i 3614 END INTERFACE 3615 INTERFACE mpp_max 3616 MODULE PROCEDURE mppmax_a_real, mppmax_real 3617 END INTERFACE 3618 INTERFACE mpp_min 3619 MODULE PROCEDURE mppmin_a_int, mppmin_int, mppmin_a_real, mppmin_real 3620 END INTERFACE 3621 INTERFACE mpp_isl 3622 MODULE PROCEDURE mppisl_a_int, mppisl_int, mppisl_a_real, mppisl_real 3623 END INTERFACE 3624 INTERFACE mppobc 3625 MODULE PROCEDURE mppobc_1d, mppobc_2d, mppobc_3d, mppobc_4d 3626 END INTERFACE 3627 3628 LOGICAL, PUBLIC, PARAMETER :: lk_mpp = .FALSE. !: mpp flag 4543 3629 4544 3630 CONTAINS 4545 3631 4546 FUNCTION mynode() RESULT (function_value) 4547 !!---------------------------------------------------------------------- 4548 !! *** routine mynode *** 4549 !! 4550 !! ** Purpose : Find processor unit 4551 !! 4552 !! ** Method : share memory computing, return 0 as unit 4553 !! 4554 !!---------------------------------------------------------------------- 4555 !! * Local variables 4556 INTEGER :: function_value 4557 !!---------------------------------------------------------------------- 4558 function_value = 0 4559 END FUNCTION mynode 4560 4561 #endif 4562 !!---------------------------------------------------------------------- 3632 FUNCTION mynode() RESULT (function_value) 3633 function_value = 0 3634 END FUNCTION mynode 3635 3636 SUBROUTINE mppsync ! Dummy routine 3637 END SUBROUTINE mppsync 3638 3639 SUBROUTINE mpp_sum_as( parr, kdim ) ! Dummy routine 3640 REAL , DIMENSION(:) :: parr 3641 INTEGER :: kdim 3642 WRITE(*,*) 'mpp_sum_as: You should not have seen this print! error?', kdim, parr(1) 3643 END SUBROUTINE mpp_sum_as 3644 3645 SUBROUTINE mpp_sum_a2s( parr, kdim ) ! Dummy routine 3646 REAL , DIMENSION(:,:) :: parr 3647 INTEGER :: kdim 3648 WRITE(*,*) 'mpp_sum_a2s: You should not have seen this print! error?', kdim, parr(1,1) 3649 END SUBROUTINE mpp_sum_a2s 3650 3651 SUBROUTINE mpp_sum_ai( karr, kdim ) ! Dummy routine 3652 INTEGER, DIMENSION(:) :: karr 3653 INTEGER :: kdim 3654 WRITE(*,*) 'mpp_sum_ai: You should not have seen this print! error?', kdim, karr(1) 3655 END SUBROUTINE mpp_sum_ai 3656 3657 SUBROUTINE mpp_sum_s( psca ) ! Dummy routine 3658 REAL :: psca 3659 WRITE(*,*) 'mpp_sum_s: You should not have seen this print! error?', psca 3660 END SUBROUTINE mpp_sum_s 3661 3662 SUBROUTINE mpp_sum_i( kint ) ! Dummy routine 3663 integer :: kint 3664 WRITE(*,*) 'mpp_sum_i: You should not have seen this print! error?', kint 3665 END SUBROUTINE mpp_sum_i 3666 3667 SUBROUTINE mppmax_a_real( parr, kdim ) 3668 REAL , DIMENSION(:) :: parr 3669 INTEGER :: kdim 3670 WRITE(*,*) 'mppmax_a_real: You should not have seen this print! error?', kdim, parr(1) 3671 END SUBROUTINE mppmax_a_real 3672 3673 SUBROUTINE mppmax_real( psca ) 3674 REAL :: psca 3675 WRITE(*,*) 'mppmax_real: You should not have seen this print! error?', psca 3676 END SUBROUTINE mppmax_real 3677 3678 SUBROUTINE mppmin_a_real( parr, kdim ) 3679 REAL , DIMENSION(:) :: parr 3680 INTEGER :: kdim 3681 WRITE(*,*) 'mppmin_a_real: You should not have seen this print! error?', kdim, parr(1) 3682 END SUBROUTINE mppmin_a_real 3683 3684 SUBROUTINE mppmin_real( psca ) 3685 REAL :: psca 3686 WRITE(*,*) 'mppmin_real: You should not have seen this print! error?', psca 3687 END SUBROUTINE mppmin_real 3688 3689 SUBROUTINE mppmin_a_int( karr, kdim ) 3690 INTEGER, DIMENSION(:) :: karr 3691 INTEGER :: kdim 3692 WRITE(*,*) 'mppmin_a_int: You should not have seen this print! error?', kdim, karr(1) 3693 END SUBROUTINE mppmin_a_int 3694 3695 SUBROUTINE mppmin_int( kint ) 3696 INTEGER :: kint 3697 WRITE(*,*) 'mppmin_int: You should not have seen this print! error?', kint 3698 END SUBROUTINE mppmin_int 3699 3700 SUBROUTINE mppobc_1d( parr, kd1, kd2, kl, kk, ktype, kij ) 3701 INTEGER :: kd1, kd2, kl , kk, ktype, kij 3702 REAL, DIMENSION(:) :: parr ! variable array 3703 WRITE(*,*) 'mppobc: You should not have seen this print! error?', & 3704 & parr(1), kd1, kd2, kl, kk, ktype, kij 3705 END SUBROUTINE mppobc_1d 3706 3707 SUBROUTINE mppobc_2d( parr, kd1, kd2, kl, kk, ktype, kij ) 3708 INTEGER :: kd1, kd2, kl , kk, ktype, kij 3709 REAL, DIMENSION(:,:) :: parr ! variable array 3710 WRITE(*,*) 'mppobc: You should not have seen this print! error?', & 3711 & parr(1,1), kd1, kd2, kl, kk, ktype, kij 3712 END SUBROUTINE mppobc_2d 3713 3714 SUBROUTINE mppobc_3d( parr, kd1, kd2, kl, kk, ktype, kij ) 3715 INTEGER :: kd1, kd2, kl , kk, ktype, kij 3716 REAL, DIMENSION(:,:,:) :: parr ! variable array 3717 WRITE(*,*) 'mppobc: You should not have seen this print! error?', & 3718 & parr(1,1,1), kd1, kd2, kl, kk, ktype, kij 3719 END SUBROUTINE mppobc_3d 3720 3721 SUBROUTINE mppobc_4d( parr, kd1, kd2, kl, kk, ktype, kij ) 3722 INTEGER :: kd1, kd2, kl , kk, ktype, kij 3723 REAL, DIMENSION(:,:,:,:) :: parr ! variable array 3724 WRITE(*,*) 'mppobc: You should not have seen this print! error?', & 3725 & parr(1,1,1,1), kd1, kd2, kl, kk, ktype, kij 3726 END SUBROUTINE mppobc_4d 3727 3728 3729 SUBROUTINE mpplnks( karr ) ! Dummy routine 3730 INTEGER, DIMENSION(:,:) :: karr 3731 WRITE(*,*) 'mpplnks: You should not have seen this print! error?', karr(1,1) 3732 END SUBROUTINE mpplnks 3733 3734 SUBROUTINE mppisl_a_int( karr, kdim ) 3735 INTEGER, DIMENSION(:) :: karr 3736 INTEGER :: kdim 3737 WRITE(*,*) 'mppisl_a_int: You should not have seen this print! error?', kdim, karr(1) 3738 END SUBROUTINE mppisl_a_int 3739 3740 SUBROUTINE mppisl_int( kint ) 3741 INTEGER :: kint 3742 WRITE(*,*) 'mppisl_int: You should not have seen this print! error?', kint 3743 END SUBROUTINE mppisl_int 3744 3745 SUBROUTINE mppisl_a_real( parr, kdim ) 3746 REAL , DIMENSION(:) :: parr 3747 INTEGER :: kdim 3748 WRITE(*,*) 'mppisl_a_real: You should not have seen this print! error?', kdim, parr(1) 3749 END SUBROUTINE mppisl_a_real 3750 3751 SUBROUTINE mppisl_real( psca ) 3752 REAL :: psca 3753 WRITE(*,*) 'mppisl_real: You should not have seen this print! error?', psca 3754 END SUBROUTINE mppisl_real 3755 #endif 3756 !!---------------------------------------------------------------------- 4563 3757 END MODULE lib_mpp
Note: See TracChangeset
for help on using the changeset viewer.