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 7139 – NEMO

Changeset 7139


Ignore:
Timestamp:
2016-10-27T15:21:12+02:00 (7 years ago)
Author:
jcastill
Message:

Changes as in branch UKMO/dev_r5107_hadgem3_cplfld@5592

Location:
branches/UKMO/r5936_hadgem3_cplfld/NEMOGCM/NEMO/OPA_SRC/SBC
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/r5936_hadgem3_cplfld/NEMOGCM/NEMO/OPA_SRC/SBC/geo2ocean.F90

    r7138 r7139  
    5151 
    5252   SUBROUTINE repcmo ( pxu1, pyu1, pxv1, pyv1,   & 
    53                        px2 , py2 ) 
     53                       px2 , py2, kchoix ) 
    5454      !!---------------------------------------------------------------------- 
    5555      !!                  ***  ROUTINE repcmo  *** 
     
    6767      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   px2          ! i-componante (defined at u-point) 
    6868      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   py2          ! j-componante (defined at v-point) 
    69       !!---------------------------------------------------------------------- 
    70        
    71       ! Change from geographic to stretched coordinate 
    72       ! ---------------------------------------------- 
    73       CALL rot_rep( pxu1, pyu1, 'U', 'en->i',px2 ) 
    74       CALL rot_rep( pxv1, pyv1, 'V', 'en->j',py2 ) 
     69      INTEGER, INTENT( IN )                       ::   kchoix       ! type of transformation  
     70                                                                    ! = 1 change from geographic to model grid.  
     71                                                                    ! =-1 change from model to geographic grid  
     72      !!---------------------------------------------------------------------- 
     73       
     74      SELECT CASE (kchoix)  
     75      CASE ( 1)  
     76        ! Change from geographic to stretched coordinate  
     77        ! ----------------------------------------------  
     78       
     79        CALL rot_rep( pxu1, pyu1, 'U', 'en->i',px2 )  
     80        CALL rot_rep( pxv1, pyv1, 'V', 'en->j',py2 )  
     81      CASE (-1)  
     82        ! Change from stretched to geographic coordinate  
     83        ! ----------------------------------------------  
     84       
     85        CALL rot_rep( pxu1, pyu1, 'U', 'ij->e',px2 )  
     86        CALL rot_rep( pxv1, pyv1, 'V', 'ij->n',py2 )  
     87      END SELECT  
    7588       
    7689   END SUBROUTINE repcmo 
  • branches/UKMO/r5936_hadgem3_cplfld/NEMOGCM/NEMO/OPA_SRC/SBC/sbccpl.F90

    r7138 r7139  
    337337         srcv(jpr_otx2:jpr_otz2)%clgrid  = 'V'        !           and           V-point 
    338338         srcv(jpr_itx1:jpr_itz1)%clgrid  = 'F'        ! ice components given at F-point 
    339          srcv(jpr_otx1:jpr_otz2)%laction = .TRUE.     ! receive oce components on grid 1 & 2 
     339         !srcv(jpr_otx1:jpr_otz2)%laction = .TRUE.     ! receive oce components on grid 1 & 2 
     340         ! Currently needed for HadGEM3 - but shouldn't affect anyone else for the moment 
     341         srcv(jpr_otx1)%laction = .TRUE.  
     342         srcv(jpr_oty1)%laction = .TRUE. 
     343         ! 
    340344         srcv(jpr_itx1:jpr_itz1)%laction = .TRUE.     ! receive ice components on grid 1 only 
    341345      CASE( 'T,I' )  
     
    845849      INTEGER  ::   ji, jj, jn             ! dummy loop indices 
    846850      INTEGER  ::   isec                   ! number of seconds since nit000 (assuming rdttra did not change since nit000) 
     851      INTEGER  ::   ikchoix 
    847852      REAL(wp) ::   zcumulneg, zcumulpos   ! temporary scalars      
    848853      REAL(wp) ::   zcoef                  ! temporary scalar 
     
    850855      REAL(wp) ::   zcdrag = 1.5e-3        ! drag coefficient 
    851856      REAL(wp) ::   zzx, zzy               ! temporary variables 
    852       REAL(wp), POINTER, DIMENSION(:,:) ::   ztx, zty, zmsk, zemp, zqns, zqsr 
     857      REAL(wp), POINTER, DIMENSION(:,:) ::   ztx, zty, ztx2, zty2, zmsk, zemp, zqns, zqsr 
    853858      !!---------------------------------------------------------------------- 
    854859      ! 
    855860      IF( nn_timing == 1 )  CALL timing_start('sbc_cpl_rcv') 
    856861      ! 
    857       CALL wrk_alloc( jpi,jpj, ztx, zty, zmsk, zemp, zqns, zqsr ) 
     862      CALL wrk_alloc( jpi,jpj, ztx, zty, ztx2, zty2, zmsk, zemp, zqns, zqsr ) 
    858863      ! 
    859864      IF( ln_mixcpl )   zmsk(:,:) = 1. - xcplmask(:,:,0) 
     
    893898            IF( TRIM( sn_rcv_tau%clvor ) == 'eastward-northward' ) THEN   ! 2 components oriented along the local grid 
    894899               !                                                       ! (geographical to local grid -> rotate the components) 
    895                CALL rot_rep( frcv(jpr_otx1)%z3(:,:,1), frcv(jpr_oty1)%z3(:,:,1), srcv(jpr_otx1)%clgrid, 'en->i', ztx )    
    896                IF( srcv(jpr_otx2)%laction ) THEN 
    897                   CALL rot_rep( frcv(jpr_otx2)%z3(:,:,1), frcv(jpr_oty2)%z3(:,:,1), srcv(jpr_otx2)%clgrid, 'en->j', zty )    
    898                ELSE   
    899                   CALL rot_rep( frcv(jpr_otx1)%z3(:,:,1), frcv(jpr_oty1)%z3(:,:,1), srcv(jpr_otx1)%clgrid, 'en->j', zty )   
     900               IF( srcv(jpr_otx1)%clgrid == 'U' .AND. (.NOT. srcv(jpr_otx2)%laction) ) THEN  
     901                  ! Temporary code for HadGEM3 - will be removed eventually.  
     902                  ! Only applies when we have only taux on U grid and tauy on V grid  
     903                  DO jj=2,jpjm1  
     904                     DO ji=2,jpim1  
     905                        ztx(ji,jj)=0.25*vmask(ji,jj,1) &  
     906                           *(frcv(jpr_otx1)%z3(ji,jj,1)+frcv(jpr_otx1)%z3(ji-1,jj,1)    &  
     907                           +frcv(jpr_otx1)%z3(ji,jj+1,1)+frcv(jpr_otx1)%z3(ji-1,jj+1,1))  
     908                        zty(ji,jj)=0.25*umask(ji,jj,1) &  
     909                           *(frcv(jpr_oty1)%z3(ji,jj,1)+frcv(jpr_oty1)%z3(ji+1,jj,1)    &  
     910                           +frcv(jpr_oty1)%z3(ji,jj-1,1)+frcv(jpr_oty1)%z3(ji+1,jj-1,1))  
     911                     ENDDO  
     912                  ENDDO  
     913                             
     914                  ikchoix = 1  
     915                  CALL repcmo(frcv(jpr_otx1)%z3(:,:,1),zty,ztx,frcv(jpr_oty1)%z3(:,:,1),ztx2,zty2,ikchoix)  
     916                  CALL lbc_lnk (ztx2,'U', -1. )  
     917                  CALL lbc_lnk (zty2,'V', -1. )  
     918                  frcv(jpr_otx1)%z3(:,:,1)=ztx2(:,:)  
     919                  frcv(jpr_oty1)%z3(:,:,1)=zty2(:,:)  
     920               ELSE  
     921                  CALL rot_rep( frcv(jpr_otx1)%z3(:,:,1), frcv(jpr_oty1)%z3(:,:,1), srcv(jpr_otx1)%clgrid, 'en->i', ztx )     
     922                  frcv(jpr_otx1)%z3(:,:,1) = ztx(:,:)      ! overwrite 1st component on the 1st grid  
     923                  IF( srcv(jpr_otx2)%laction ) THEN  
     924                     CALL rot_rep( frcv(jpr_otx2)%z3(:,:,1), frcv(jpr_oty2)%z3(:,:,1), srcv(jpr_otx2)%clgrid, 'en->j', zty )     
     925                  ELSE  
     926                     CALL rot_rep( frcv(jpr_otx1)%z3(:,:,1), frcv(jpr_oty1)%z3(:,:,1), srcv(jpr_otx1)%clgrid, 'en->j', zty )   
     927                  ENDIF  
     928                  frcv(jpr_oty1)%z3(:,:,1) = zty(:,:)      ! overwrite 2nd component on the 2nd grid   
    900929               ENDIF 
    901                frcv(jpr_otx1)%z3(:,:,1) = ztx(:,:)      ! overwrite 1st component on the 1st grid 
    902                frcv(jpr_oty1)%z3(:,:,1) = zty(:,:)      ! overwrite 2nd component on the 2nd grid 
    903930            ENDIF 
    904931            !                               
     
    11071134      ENDIF 
    11081135      ! 
    1109       CALL wrk_dealloc( jpi,jpj, ztx, zty, zmsk, zemp, zqns, zqsr ) 
     1136      CALL wrk_dealloc( jpi,jpj, ztx, zty, ztx2, zty2, zmsk, zemp, zqns, zqsr ) 
    11101137      ! 
    11111138      IF( nn_timing == 1 )  CALL timing_stop('sbc_cpl_rcv') 
     
    17021729      ! 
    17031730      INTEGER ::   ji, jj, jl   ! dummy loop indices 
     1731      INTEGER ::   ikchoix 
    17041732      INTEGER ::   isec, info   ! local integer 
    17051733      REAL(wp) ::   zumax, zvmax 
     
    17301758            ! 
    17311759            SELECT CASE( sn_snd_temp%cldes) 
     1760            CASE( 'none'         )       ! nothing to do 
    17321761            CASE( 'oce only'             )   ;   ztmp1(:,:) =   ztmp1(:,:) + rt0 
    17331762            CASE( 'oce and ice'          )   ;   ztmp1(:,:) =   ztmp1(:,:) + rt0 
     
    18541883         !                                                  j+1   j     -----V---F 
    18551884         ! surface velocity always sent from T point                     !       | 
    1856          !                                                        j      |   T   U 
     1885         ! [except for HadGEM3]                                   j      |   T   U 
    18571886         !                                                               |       | 
    18581887         !                                                   j    j-1   -I-------| 
     
    18661895            SELECT CASE( TRIM( sn_snd_crt%cldes ) ) 
    18671896            CASE( 'oce only'             )      ! C-grid ==> T 
    1868                DO jj = 2, jpjm1 
    1869                   DO ji = fs_2, fs_jpim1   ! vector opt. 
    1870                      zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj  ,1) ) 
    1871                      zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji  ,jj-1,1) )  
    1872                   END DO 
    1873                END DO 
     1897               IF ( TRIM( sn_snd_crt%clvgrd ) == 'T' ) THEN  
     1898                  DO jj = 2, jpjm1  
     1899                     DO ji = fs_2, fs_jpim1   ! vector opt.  
     1900                        zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj  ,1) )  
     1901                        zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji,jj-1,1) )   
     1902                     END DO  
     1903                  END DO  
     1904               ELSE  
     1905                  ! Temporarily Changed for UKV  
     1906                  DO jj = 2, jpjm1  
     1907                     DO ji = 2, jpim1  
     1908                        zotx1(ji,jj) = un(ji,jj,1)  
     1909                        zoty1(ji,jj) = vn(ji,jj,1)  
     1910                     END DO  
     1911                  END DO  
     1912               ENDIF   
    18741913            CASE( 'weighted oce and ice' )    
    18751914               SELECT CASE ( cp_ice_msh ) 
     
    18951934                  END DO 
    18961935               CASE( 'F' )                      ! Ocean on C grid, Ice on F-point (B-grid) ==> T 
    1897                   DO jj = 2, jpjm1 
    1898                      DO ji = 2, jpim1   ! NO vector opt. 
    1899                         zotx1(ji,jj) = 0.5  * ( un(ji,jj,1)      + un(ji-1,jj  ,1) ) * zfr_l(ji,jj)   
    1900                         zoty1(ji,jj) = 0.5  * ( vn(ji,jj,1)      + vn(ji  ,jj-1,1) ) * zfr_l(ji,jj)   
    1901                         zitx1(ji,jj) = 0.25 * ( u_ice(ji-1,jj-1) + u_ice(ji,jj-1)                     & 
    1902                            &                  + u_ice(ji-1,jj  ) + u_ice(ji,jj  )  ) *  fr_i(ji,jj) 
    1903                         zity1(ji,jj) = 0.25 * ( v_ice(ji-1,jj-1) + v_ice(ji,jj-1)                     & 
    1904                            &                  + v_ice(ji-1,jj  ) + v_ice(ji,jj  )  ) *  fr_i(ji,jj) 
    1905                      END DO 
    1906                   END DO 
     1936                  IF ( TRIM( sn_snd_crt%clvgrd ) == 'T' ) THEN  
     1937                     DO jj = 2, jpjm1  
     1938                        DO ji = 2, jpim1   ! NO vector opt.  
     1939                           zotx1(ji,jj) = 0.5  * ( un(ji,jj,1) + un(ji-1,jj,1) ) * zfr_l(ji,jj)   &     
     1940                                  &       + 0.25 * ( u_ice(ji-1,jj-1) + u_ice(ji,jj-1)                     &  
     1941                                  &                + u_ice(ji-1,jj  ) + u_ice(ji,jj  )  ) *  fr_i(ji,jj)  
     1942                           zoty1(ji,jj) = 0.5  * ( vn(ji,jj,1) + vn(ji,jj-1,1) ) * zfr_l(ji,jj)   &  
     1943                                  &       + 0.25 * ( v_ice(ji-1,jj-1) + v_ice(ji,jj-1)                     &  
     1944                                  &                + v_ice(ji-1,jj  ) + v_ice(ji,jj  )  ) *  fr_i(ji,jj)  
     1945                        END DO  
     1946                     END DO  
     1947#if defined key_cice  
     1948                  ELSE  
     1949                     ! Temporarily Changed for HadGEM3  
     1950                     DO jj = 2, jpjm1  
     1951                        DO ji = 2, jpim1   ! NO vector opt.  
     1952                           zotx1(ji,jj) = (1.0-fr_iu(ji,jj)) * un(ji,jj,1)             &  
     1953                                &              + fr_iu(ji,jj) * 0.5 * ( u_ice(ji,jj-1) + u_ice(ji,jj) )   
     1954                           zoty1(ji,jj) = (1.0-fr_iv(ji,jj)) * vn(ji,jj,1)             &  
     1955                                &              + fr_iv(ji,jj) * 0.5 * ( v_ice(ji-1,jj) + v_ice(ji,jj) )   
     1956                        END DO  
     1957                     END DO  
     1958#endif  
     1959                  ENDIF  
    19071960               END SELECT 
    19081961               CALL lbc_lnk( zitx1, 'T', -1. )   ;   CALL lbc_lnk( zity1, 'T', -1. ) 
     
    19492002         IF( TRIM( sn_snd_crt%clvor ) == 'eastward-northward' ) THEN             ! Rotation of the components 
    19502003            !                                                                     ! Ocean component 
    1951             CALL rot_rep( zotx1, zoty1, ssnd(jps_ocx1)%clgrid, 'ij->e', ztmp1 )       ! 1st component  
    1952             CALL rot_rep( zotx1, zoty1, ssnd(jps_ocx1)%clgrid, 'ij->n', ztmp2 )       ! 2nd component  
    1953             zotx1(:,:) = ztmp1(:,:)                                                   ! overwrite the components  
    1954             zoty1(:,:) = ztmp2(:,:) 
    1955             IF( ssnd(jps_ivx1)%laction ) THEN                                     ! Ice component 
    1956                CALL rot_rep( zitx1, zity1, ssnd(jps_ivx1)%clgrid, 'ij->e', ztmp1 )    ! 1st component  
    1957                CALL rot_rep( zitx1, zity1, ssnd(jps_ivx1)%clgrid, 'ij->n', ztmp2 )    ! 2nd component  
    1958                zitx1(:,:) = ztmp1(:,:)                                                ! overwrite the components  
    1959                zity1(:,:) = ztmp2(:,:) 
    1960             ENDIF 
     2004            IF ( TRIM( sn_snd_crt%clvgrd ) == 'T' ) THEN  
     2005               CALL rot_rep( zotx1, zoty1, ssnd(jps_ocx1)%clgrid, 'ij->e', ztmp1 )       ! 1st component  
     2006               CALL rot_rep( zotx1, zoty1, ssnd(jps_ocx1)%clgrid, 'ij->n', ztmp2 )       ! 2nd component  
     2007               zotx1(:,:) = ztmp1(:,:)                                                   ! overwrite the components  
     2008               zoty1(:,:) = ztmp2(:,:)  
     2009               IF( ssnd(jps_ivx1)%laction ) THEN                                  ! Ice component  
     2010                  CALL rot_rep( zitx1, zity1, ssnd(jps_ivx1)%clgrid, 'ij->e', ztmp1 )    ! 1st component  
     2011                  CALL rot_rep( zitx1, zity1, ssnd(jps_ivx1)%clgrid, 'ij->n', ztmp2 )    ! 2nd component  
     2012                  zitx1(:,:) = ztmp1(:,:)                                                ! overwrite the components  
     2013                  zity1(:,:) = ztmp2(:,:)  
     2014               ENDIF  
     2015            ELSE  
     2016               ! Temporary code for HadGEM3 - will be removed eventually.  
     2017               ! Only applies when we want uvel on U grid and vvel on V grid  
     2018               ! Rotate U and V onto geographic grid before sending.  
     2019         
     2020               DO jj=2,jpjm1  
     2021                  DO ji=2,jpim1  
     2022                     ztmp1(ji,jj)=0.25*vmask(ji,jj,1)      &  
     2023                          *(zotx1(ji,jj)+zotx1(ji-1,jj)    &  
     2024                          +zotx1(ji,jj+1)+zotx1(ji-1,jj+1))  
     2025                     ztmp2(ji,jj)=0.25*umask(ji,jj,1)      &  
     2026                          *(zoty1(ji,jj)+zoty1(ji+1,jj)    &  
     2027                          +zoty1(ji,jj-1)+zoty1(ji+1,jj-1))  
     2028                  ENDDO  
     2029               ENDDO  
     2030                 
     2031               ! Ensure any N fold and wrap columns are updated  
     2032               CALL lbc_lnk(ztmp1, 'V', -1.0)  
     2033               CALL lbc_lnk(ztmp2, 'U', -1.0)  
     2034                 
     2035               ikchoix = -1  
     2036               CALL repcmo(zotx1,ztmp2,ztmp1,zoty1,zotx1,zoty1,ikchoix)  
     2037           ENDIF  
    19612038         ENDIF 
    19622039         ! 
Note: See TracChangeset for help on using the changeset viewer.