New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 3096 – NEMO

Changeset 3096


Ignore:
Timestamp:
2011-11-14T16:54:42+01:00 (12 years ago)
Author:
acc
Message:

Branch dev_NOC_UKMO_MERGE #890. Undid some changes to fully reinstate OBC code

Location:
branches/2011/dev_NOC_UKMO_MERGE/NEMOGCM/NEMO/OPA_SRC
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/2011/dev_NOC_UKMO_MERGE/NEMOGCM/NEMO/OPA_SRC/FLO/floblk.F90

    r3094 r3096  
    345345      ! more time.       
    346346# if defined key_obc 
    347 !!!!!!!! NEED TO SORT THIS OUT !!!!!!!! 
    348 !!$      DO jfl = 1, jpnfl 
    349 !!$         IF( lp_obc_east ) THEN 
    350 !!$            IF( jped <=  zgjfl(jfl) .AND. zgjfl(jfl) <= jpef .AND. nieob-1 <=  zgifl(jfl) ) THEN 
    351 !!$               zgifl (jfl) = INT(zgifl(jfl)) + 0.5 
    352 !!$               zgjfl (jfl) = INT(zgjfl(jfl)) + 0.5 
    353 !!$               zagefl(jfl) = rdt 
    354 !!$            END IF 
    355 !!$         END IF 
    356 !!$         IF( lp_obc_west ) THEN 
    357 !!$            IF( jpwd <= zgjfl(jfl) .AND. zgjfl(jfl) <= jpwf .AND. niwob >=  zgifl(jfl) ) THEN 
    358 !!$               zgifl (jfl) = INT(zgifl(jfl)) + 0.5 
    359 !!$               zgjfl (jfl) = INT(zgjfl(jfl)) + 0.5 
    360 !!$               zagefl(jfl) = rdt 
    361 !!$            END IF 
    362 !!$         END IF 
    363 !!$         IF( lp_obc_north ) THEN 
    364 !!$            IF( jpnd <=  zgifl(jfl) .AND. zgifl(jfl) <= jpnf .AND. njnob-1 >=  zgjfl(jfl) ) THEN 
    365 !!$               zgifl (jfl) = INT(zgifl(jfl)) + 0.5 
    366 !!$               zgjfl (jfl) = INT(zgjfl(jfl)) + 0.5 
    367 !!$               zagefl(jfl) = rdt 
    368 !!$            END IF 
    369 !!$         END IF 
    370 !!$         IF( lp_obc_south ) THEN 
    371 !!$            IF( jpsd <=  zgifl(jfl) .AND. zgifl(jfl) <= jpsf .AND.  njsob >= zgjfl(jfl) ) THEN 
    372 !!$               zgifl (jfl) = INT(zgifl(jfl)) + 0.5 
    373 !!$               zgjfl (jfl) = INT(zgjfl(jfl)) + 0.5 
    374 !!$               zagefl(jfl) = rdt 
    375 !!$            END IF 
    376 !!$         END IF 
    377 !!$      END DO 
     347      DO jfl = 1, jpnfl 
     348         IF( lp_obc_east ) THEN 
     349            IF( jped <=  zgjfl(jfl) .AND. zgjfl(jfl) <= jpef .AND. nieob-1 <=  zgifl(jfl) ) THEN 
     350               zgifl (jfl) = INT(zgifl(jfl)) + 0.5 
     351               zgjfl (jfl) = INT(zgjfl(jfl)) + 0.5 
     352               zagefl(jfl) = rdt 
     353            END IF 
     354         END IF 
     355         IF( lp_obc_west ) THEN 
     356            IF( jpwd <= zgjfl(jfl) .AND. zgjfl(jfl) <= jpwf .AND. niwob >=  zgifl(jfl) ) THEN 
     357               zgifl (jfl) = INT(zgifl(jfl)) + 0.5 
     358               zgjfl (jfl) = INT(zgjfl(jfl)) + 0.5 
     359               zagefl(jfl) = rdt 
     360            END IF 
     361         END IF 
     362         IF( lp_obc_north ) THEN 
     363            IF( jpnd <=  zgifl(jfl) .AND. zgifl(jfl) <= jpnf .AND. njnob-1 >=  zgjfl(jfl) ) THEN 
     364               zgifl (jfl) = INT(zgifl(jfl)) + 0.5 
     365               zgjfl (jfl) = INT(zgjfl(jfl)) + 0.5 
     366               zagefl(jfl) = rdt 
     367            END IF 
     368         END IF 
     369         IF( lp_obc_south ) THEN 
     370            IF( jpsd <=  zgifl(jfl) .AND. zgifl(jfl) <= jpsf .AND.  njsob >= zgjfl(jfl) ) THEN 
     371               zgifl (jfl) = INT(zgifl(jfl)) + 0.5 
     372               zgjfl (jfl) = INT(zgjfl(jfl)) + 0.5 
     373               zagefl(jfl) = rdt 
     374            END IF 
     375         END IF 
     376      END DO 
    378377#endif 
    379378 
  • branches/2011/dev_NOC_UKMO_MERGE/NEMOGCM/NEMO/OPA_SRC/LBC/lib_mpp.F90

    r3094 r3096  
    4747   !!   mppsync       : 
    4848   !!   mppstop       : 
     49   !!   mppobc        : variant of mpp_lnk for open boundary condition 
    4950   !!   mpp_ini_north : initialisation of north fold 
    5051   !!   mpp_lbc_north : north fold processors gathering 
     
    6364   PUBLIC   mpp_min, mpp_max, mpp_sum, mpp_minloc, mpp_maxloc 
    6465   PUBLIC   mpp_lnk_3d, mpp_lnk_3d_gather, mpp_lnk_2d, mpp_lnk_2d_e 
    65    PUBLIC   mpp_ini_ice, mpp_ini_znl 
     66   PUBLIC   mppobc, mpp_ini_ice, mpp_ini_znl 
    6667   PUBLIC   mppsize 
    6768   PUBLIC   lib_mpp_alloc   ! Called in nemogcm.F90 
     
    17251726   END SUBROUTINE mppstop 
    17261727 
     1728 
     1729   SUBROUTINE mppobc( ptab, kd1, kd2, kl, kk, ktype, kij , kumout) 
     1730      !!---------------------------------------------------------------------- 
     1731      !!                  ***  routine mppobc  *** 
     1732      !!  
     1733      !! ** Purpose :   Message passing manadgement for open boundary 
     1734      !!     conditions array 
     1735      !! 
     1736      !! ** Method  :   Use mppsend and mpprecv function for passing mask 
     1737      !!       between processors following neighboring subdomains. 
     1738      !!       domain parameters 
     1739      !!                    nlci   : first dimension of the local subdomain 
     1740      !!                    nlcj   : second dimension of the local subdomain 
     1741      !!                    nbondi : mark for "east-west local boundary" 
     1742      !!                    nbondj : mark for "north-south local boundary" 
     1743      !!                    noea   : number for local neighboring processors  
     1744      !!                    nowe   : number for local neighboring processors 
     1745      !!                    noso   : number for local neighboring processors 
     1746      !!                    nono   : number for local neighboring processors 
     1747      !! 
     1748      !!---------------------------------------------------------------------- 
     1749      USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released 
     1750      USE wrk_nemo, ONLY:   ztab => wrk_2d_1 
     1751      ! 
     1752      INTEGER , INTENT(in   )                     ::   kd1, kd2   ! starting and ending indices 
     1753      INTEGER , INTENT(in   )                     ::   kl         ! index of open boundary 
     1754      INTEGER , INTENT(in   )                     ::   kk         ! vertical dimension 
     1755      INTEGER , INTENT(in   )                     ::   ktype      ! define north/south or east/west cdt 
     1756      !                                                           !  = 1  north/south  ;  = 2  east/west 
     1757      INTEGER , INTENT(in   )                     ::   kij        ! horizontal dimension 
     1758      INTEGER , INTENT(in   )                     ::   kumout     ! ocean.output logical unit 
     1759      REAL(wp), INTENT(inout), DIMENSION(kij,kk)  ::   ptab       ! variable array 
     1760      ! 
     1761      INTEGER ::   ji, jj, jk, jl        ! dummy loop indices 
     1762      INTEGER ::   iipt0, iipt1, ilpt1   ! local integers 
     1763      INTEGER ::   ijpt0, ijpt1          !   -       - 
     1764      INTEGER ::   imigr, iihom, ijhom   !   -       - 
     1765      INTEGER ::   ml_req1, ml_req2, ml_err    ! for key_mpi_isend 
     1766      INTEGER ::   ml_stat(MPI_STATUS_SIZE)    ! for key_mpi_isend 
     1767      !!---------------------------------------------------------------------- 
     1768 
     1769      IF( wrk_in_use(2, 1) ) THEN 
     1770         WRITE(kumout, cform_err) 
     1771         WRITE(kumout,*) 'mppobc : requested workspace array unavailable' 
     1772         CALL mppstop 
     1773      ENDIF 
     1774 
     1775      ! boundary condition initialization 
     1776      ! --------------------------------- 
     1777      ztab(:,:) = 0.e0 
     1778      ! 
     1779      IF( ktype==1 ) THEN                                  ! north/south boundaries 
     1780         iipt0 = MAX( 1, MIN(kd1 - nimpp+1, nlci     ) ) 
     1781         iipt1 = MAX( 0, MIN(kd2 - nimpp+1, nlci - 1 ) ) 
     1782         ilpt1 = MAX( 1, MIN(kd2 - nimpp+1, nlci     ) ) 
     1783         ijpt0 = MAX( 1, MIN(kl  - njmpp+1, nlcj     ) ) 
     1784         ijpt1 = MAX( 0, MIN(kl  - njmpp+1, nlcj - 1 ) ) 
     1785      ELSEIF( ktype==2 ) THEN                              ! east/west boundaries 
     1786         iipt0 = MAX( 1, MIN(kl  - nimpp+1, nlci     ) ) 
     1787         iipt1 = MAX( 0, MIN(kl  - nimpp+1, nlci - 1 ) ) 
     1788         ijpt0 = MAX( 1, MIN(kd1 - njmpp+1, nlcj     ) ) 
     1789         ijpt1 = MAX( 0, MIN(kd2 - njmpp+1, nlcj - 1 ) ) 
     1790         ilpt1 = MAX( 1, MIN(kd2 - njmpp+1, nlcj     ) ) 
     1791      ELSE 
     1792         WRITE(kumout, cform_err) 
     1793         WRITE(kumout,*) 'mppobc : bad ktype' 
     1794         CALL mppstop 
     1795      ENDIF 
     1796       
     1797      ! Communication level by level 
     1798      ! ---------------------------- 
     1799!!gm Remark : this is very time consumming!!! 
     1800      !                                         ! ------------------------ ! 
     1801      DO jk = 1, kk                             !   Loop over the levels   ! 
     1802         !                                      ! ------------------------ ! 
     1803         ! 
     1804         IF( ktype == 1 ) THEN                               ! north/south boundaries 
     1805            DO jj = ijpt0, ijpt1 
     1806               DO ji = iipt0, iipt1 
     1807                  ztab(ji,jj) = ptab(ji,jk) 
     1808               END DO 
     1809            END DO 
     1810         ELSEIF( ktype == 2 ) THEN                           ! east/west boundaries 
     1811            DO jj = ijpt0, ijpt1 
     1812               DO ji = iipt0, iipt1 
     1813                  ztab(ji,jj) = ptab(jj,jk) 
     1814               END DO 
     1815            END DO 
     1816         ENDIF 
     1817 
     1818 
     1819         ! 1. East and west directions 
     1820         ! --------------------------- 
     1821         ! 
     1822         IF( nbondi /= 2 ) THEN         ! Read Dirichlet lateral conditions 
     1823            iihom = nlci-nreci 
     1824            DO jl = 1, jpreci 
     1825               t2ew(:,jl,1) = ztab(jpreci+jl,:) 
     1826               t2we(:,jl,1) = ztab(iihom +jl,:) 
     1827            END DO 
     1828         ENDIF 
     1829         ! 
     1830         !                              ! Migrations 
     1831         imigr=jpreci*jpj 
     1832         ! 
     1833         IF( nbondi == -1 ) THEN 
     1834            CALL mppsend( 2, t2we(1,1,1), imigr, noea, ml_req1 ) 
     1835            CALL mpprecv( 1, t2ew(1,1,2), imigr ) 
     1836            IF(l_isend)   CALL mpi_wait( ml_req1, ml_stat, ml_err ) 
     1837         ELSEIF( nbondi == 0 ) THEN 
     1838            CALL mppsend( 1, t2ew(1,1,1), imigr, nowe, ml_req1 ) 
     1839            CALL mppsend( 2, t2we(1,1,1), imigr, noea, ml_req2 ) 
     1840            CALL mpprecv( 1, t2ew(1,1,2), imigr ) 
     1841            CALL mpprecv( 2, t2we(1,1,2), imigr ) 
     1842            IF(l_isend)   CALL mpi_wait( ml_req1, ml_stat, ml_err ) 
     1843            IF(l_isend)   CALL mpi_wait( ml_req2, ml_stat, ml_err ) 
     1844         ELSEIF( nbondi == 1 ) THEN 
     1845            CALL mppsend( 1, t2ew(1,1,1), imigr, nowe, ml_req1 ) 
     1846            CALL mpprecv( 2, t2we(1,1,2), imigr ) 
     1847            IF(l_isend) CALL mpi_wait( ml_req1, ml_stat, ml_err ) 
     1848         ENDIF 
     1849         ! 
     1850         !                              ! Write Dirichlet lateral conditions 
     1851         iihom = nlci-jpreci 
     1852         ! 
     1853         IF( nbondi == 0 .OR. nbondi == 1 ) THEN 
     1854            DO jl = 1, jpreci 
     1855               ztab(jl,:) = t2we(:,jl,2) 
     1856            END DO 
     1857         ENDIF 
     1858         IF( nbondi == -1 .OR. nbondi == 0 ) THEN 
     1859            DO jl = 1, jpreci 
     1860               ztab(iihom+jl,:) = t2ew(:,jl,2) 
     1861            END DO 
     1862         ENDIF 
     1863 
     1864 
     1865         ! 2. North and south directions 
     1866         ! ----------------------------- 
     1867         ! 
     1868         IF( nbondj /= 2 ) THEN         ! Read Dirichlet lateral conditions 
     1869            ijhom = nlcj-nrecj 
     1870            DO jl = 1, jprecj 
     1871               t2sn(:,jl,1) = ztab(:,ijhom +jl) 
     1872               t2ns(:,jl,1) = ztab(:,jprecj+jl) 
     1873            END DO 
     1874         ENDIF 
     1875         ! 
     1876         !                              ! Migrations 
     1877         imigr = jprecj * jpi 
     1878         ! 
     1879         IF( nbondj == -1 ) THEN 
     1880            CALL mppsend( 4, t2sn(1,1,1), imigr, nono, ml_req1 ) 
     1881            CALL mpprecv( 3, t2ns(1,1,2), imigr ) 
     1882            IF(l_isend) CALL mpi_wait( ml_req1, ml_stat, ml_err ) 
     1883         ELSEIF( nbondj == 0 ) THEN 
     1884            CALL mppsend( 3, t2ns(1,1,1), imigr, noso, ml_req1 ) 
     1885            CALL mppsend( 4, t2sn(1,1,1), imigr, nono, ml_req2 ) 
     1886            CALL mpprecv( 3, t2ns(1,1,2), imigr ) 
     1887            CALL mpprecv( 4, t2sn(1,1,2), imigr ) 
     1888            IF( l_isend )   CALL mpi_wait( ml_req1, ml_stat, ml_err ) 
     1889            IF( l_isend )   CALL mpi_wait( ml_req2, ml_stat, ml_err ) 
     1890         ELSEIF( nbondj == 1 ) THEN 
     1891            CALL mppsend( 3, t2ns(1,1,1), imigr, noso, ml_req1 ) 
     1892            CALL mpprecv( 4, t2sn(1,1,2), imigr) 
     1893            IF( l_isend )   CALL mpi_wait( ml_req1, ml_stat, ml_err ) 
     1894         ENDIF 
     1895         ! 
     1896         !                              ! Write Dirichlet lateral conditions 
     1897         ijhom = nlcj - jprecj 
     1898         IF( nbondj == 0 .OR. nbondj == 1 ) THEN 
     1899            DO jl = 1, jprecj 
     1900               ztab(:,jl) = t2sn(:,jl,2) 
     1901            END DO 
     1902         ENDIF 
     1903         IF( nbondj == 0 .OR. nbondj == -1 ) THEN 
     1904            DO jl = 1, jprecj 
     1905               ztab(:,ijhom+jl) = t2ns(:,jl,2) 
     1906            END DO 
     1907         ENDIF 
     1908         IF( ktype==1 .AND. kd1 <= jpi+nimpp-1 .AND. nimpp <= kd2 ) THEN 
     1909            DO jj = ijpt0, ijpt1            ! north/south boundaries 
     1910               DO ji = iipt0,ilpt1 
     1911                  ptab(ji,jk) = ztab(ji,jj)   
     1912               END DO 
     1913            END DO 
     1914         ELSEIF( ktype==2 .AND. kd1 <= jpj+njmpp-1 .AND. njmpp <= kd2 ) THEN 
     1915            DO jj = ijpt0, ilpt1            ! east/west boundaries 
     1916               DO ji = iipt0,iipt1 
     1917                  ptab(jj,jk) = ztab(ji,jj)  
     1918               END DO 
     1919            END DO 
     1920         ENDIF 
     1921         ! 
     1922      END DO 
     1923      ! 
     1924      IF( wrk_not_released(2, 1) ) THEN 
     1925         WRITE(kumout, cform_err) 
     1926         WRITE(kumout,*) 'mppobc : failed to release workspace array' 
     1927         CALL mppstop 
     1928      ENDIF 
     1929      ! 
     1930   END SUBROUTINE mppobc 
     1931    
     1932 
    17271933   SUBROUTINE mpp_comm_free( kcom ) 
    17281934      !!---------------------------------------------------------------------- 
     
    22822488      MODULE PROCEDURE mppmin_a_int, mppmin_int, mppmin_a_real, mppmin_real 
    22832489   END INTERFACE 
     2490   INTERFACE mppobc 
     2491      MODULE PROCEDURE mppobc_1d, mppobc_2d, mppobc_3d, mppobc_4d 
     2492   END INTERFACE 
    22842493   INTERFACE mpp_minloc 
    22852494      MODULE PROCEDURE mpp_minloc2d ,mpp_minloc3d 
     
    23942603      WRITE(*,*) 'mppmin_int: You should not have seen this print! error?', kint, kcom 
    23952604   END SUBROUTINE mppmin_int 
     2605 
     2606   SUBROUTINE mppobc_1d( parr, kd1, kd2, kl, kk, ktype, kij, knum ) 
     2607      INTEGER  ::   kd1, kd2, kl , kk, ktype, kij, knum 
     2608      REAL, DIMENSION(:) ::   parr           ! variable array 
     2609      WRITE(*,*) 'mppobc: You should not have seen this print! error?', parr(1), kd1, kd2, kl, kk, ktype, kij, knum 
     2610   END SUBROUTINE mppobc_1d 
     2611 
     2612   SUBROUTINE mppobc_2d( parr, kd1, kd2, kl, kk, ktype, kij, knum ) 
     2613      INTEGER  ::   kd1, kd2, kl , kk, ktype, kij, knum 
     2614      REAL, DIMENSION(:,:) ::   parr           ! variable array 
     2615      WRITE(*,*) 'mppobc: You should not have seen this print! error?', parr(1,1), kd1, kd2, kl, kk, ktype, kij, knum 
     2616   END SUBROUTINE mppobc_2d 
     2617 
     2618   SUBROUTINE mppobc_3d( parr, kd1, kd2, kl, kk, ktype, kij, knum ) 
     2619      INTEGER  ::   kd1, kd2, kl , kk, ktype, kij, knum 
     2620      REAL, DIMENSION(:,:,:) ::   parr           ! variable array 
     2621      WRITE(*,*) 'mppobc: You should not have seen this print! error?', parr(1,1,1), kd1, kd2, kl, kk, ktype, kij, knum 
     2622   END SUBROUTINE mppobc_3d 
     2623 
     2624   SUBROUTINE mppobc_4d( parr, kd1, kd2, kl, kk, ktype, kij, knum ) 
     2625      INTEGER  ::   kd1, kd2, kl , kk, ktype, kij, knum 
     2626      REAL, DIMENSION(:,:,:,:) ::   parr           ! variable array 
     2627      WRITE(*,*) 'mppobc: You should not have seen this print! error?', parr(1,1,1,1), kd1, kd2, kl, kk, ktype, kij, knum 
     2628   END SUBROUTINE mppobc_4d 
    23962629 
    23972630   SUBROUTINE mpp_minloc2d( ptab, pmask, pmin, ki, kj ) 
  • branches/2011/dev_NOC_UKMO_MERGE/NEMOGCM/NEMO/OPA_SRC/OBC/obcdta.F90

    r2722 r3096  
    12371237         WRITE(*,*) 'obc_dta: You should not have seen this print! error?', kt 
    12381238      END SUBROUTINE obc_dta 
     1239      !!----------------------------------------------------------------------------- 
     1240      !!   Default option 
     1241      !!----------------------------------------------------------------------------- 
     1242      SUBROUTINE obc_dta_bt ( kt, kbt )     ! Empty routine 
     1243         INTEGER,INTENT(in) :: kt 
     1244         INTEGER, INTENT( in ) ::   kbt     ! barotropic ocean time-step index 
     1245         WRITE(*,*) 'obc_dta_bt: You should not have seen this print! error?', kt 
     1246         WRITE(*,*) 'obc_dta_bt: You should not have seen this print! error?', kbt 
     1247      END SUBROUTINE obc_dta_bt 
    12391248#endif 
    12401249   !!============================================================================== 
Note: See TracChangeset for help on using the changeset viewer.