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 8878 for branches/UKMO/dev_r8126_LIM3_couple/NEMOGCM/NEMO/OPA_SRC/SBC/sbccpl.F90 – NEMO

Ignore:
Timestamp:
2017-12-01T14:51:50+01:00 (6 years ago)
Author:
frrh
Message:

Merge in http://fcm3/projects/NEMO.xm/log/branches/UKMO/dev_r8183_GC_couple_pkg
revisions 8731:8734 inclusive

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/dev_r8126_LIM3_couple/NEMOGCM/NEMO/OPA_SRC/SBC/sbccpl.F90

    r8877 r8878  
    210210      ALLOCATE( a_i(jpi,jpj,1) , STAT=ierr(2) )  ! used in sbcice_if.F90 (done here as there is no sbc_ice_if_init) 
    211211#endif 
    212       ALLOCATE( xcplmask(jpi,jpj,0:nn_cplmodel) , STAT=ierr(3) ) 
     212      !ALLOCATE( xcplmask(jpi,jpj,0:nn_cplmodel) , STAT=ierr(3) ) 
     213      ! Hardwire only two models as nn_cplmodel has not been read in 
     214      ! from the namelist yet. 
     215      ALLOCATE( xcplmask(jpi,jpj,0:2) , STAT=ierr(3) )    
    213216      ! 
    214217      IF( .NOT. ln_apr_dyn ) ALLOCATE( ssh_ib(jpi,jpj), ssh_ibb(jpi,jpj), apr(jpi, jpj), STAT=ierr(4) )  
     
    318321 
    319322      !                                   ! allocate sbccpl arrays 
    320       IF( sbc_cpl_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'sbc_cpl_alloc : unable to allocate arrays' ) 
     323      !IF( sbc_cpl_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'sbc_cpl_alloc : unable to allocate arrays' ) 
    321324      
    322325      ! ================================ ! 
     
    382385         srcv(jpr_otx2:jpr_otz2)%clgrid  = 'V'        !           and           V-point 
    383386         srcv(jpr_itx1:jpr_itz1)%clgrid  = 'F'        ! ice components given at F-point 
    384          srcv(jpr_otx1:jpr_otz2)%laction = .TRUE.     ! receive oce components on grid 1 & 2 
     387         !srcv(jpr_otx1:jpr_otz2)%laction = .TRUE.     ! receive oce components on grid 1 & 2 
     388! Currently needed for HadGEM3 - but shouldn't affect anyone else for the moment 
     389         srcv(jpr_otx1)%laction = .TRUE.  
     390         srcv(jpr_oty1)%laction = .TRUE. 
     391! 
    385392         srcv(jpr_itx1:jpr_itz1)%laction = .TRUE.     ! receive ice components on grid 1 only 
    386393      CASE( 'T,I' )  
     
    984991      LOGICAL  ::   llnewtx, llnewtau      ! update wind stress components and module?? 
    985992      INTEGER  ::   ji, jj, jn             ! dummy loop indices 
    986       INTEGER  ::   isec                   ! number of seconds since nit000 (assuming rdt did not change since nit000) 
     993      INTEGER  ::   isec                   ! number of seconds since nit000 (assuming rdttra did not change since nit000) 
     994      INTEGER  ::   ikchoix 
    987995      REAL(wp) ::   zcumulneg, zcumulpos   ! temporary scalars      
    988996      REAL(wp) ::   zcoef                  ! temporary scalar 
     
    990998      REAL(wp) ::   zcdrag = 1.5e-3        ! drag coefficient 
    991999      REAL(wp) ::   zzx, zzy               ! temporary variables 
    992       REAL(wp), POINTER, DIMENSION(:,:) ::   ztx, zty, zmsk, zemp, zqns, zqsr 
     1000      REAL(wp), POINTER, DIMENSION(:,:) ::   ztx, zty, zmsk, zemp, zqns, zqsr, ztx2, zty2 
    9931001      !!---------------------------------------------------------------------- 
    9941002      ! 
    9951003      IF( nn_timing == 1 )   CALL timing_start('sbc_cpl_rcv') 
    9961004      ! 
    997       CALL wrk_alloc( jpi,jpj,   ztx, zty, zmsk, zemp, zqns, zqsr ) 
     1005      CALL wrk_alloc( jpi,jpj, ztx, zty, zmsk, zemp, zqns, zqsr, ztx2, zty2 ) 
    9981006      ! 
    9991007      IF( ln_mixcpl )   zmsk(:,:) = 1. - xcplmask(:,:,0) 
     
    10331041            IF( TRIM( sn_rcv_tau%clvor ) == 'eastward-northward' ) THEN   ! 2 components oriented along the local grid 
    10341042               !                                                       ! (geographical to local grid -> rotate the components) 
    1035                CALL rot_rep( frcv(jpr_otx1)%z3(:,:,1), frcv(jpr_oty1)%z3(:,:,1), srcv(jpr_otx1)%clgrid, 'en->i', ztx )    
    1036                IF( srcv(jpr_otx2)%laction ) THEN 
    1037                   CALL rot_rep( frcv(jpr_otx2)%z3(:,:,1), frcv(jpr_oty2)%z3(:,:,1), srcv(jpr_otx2)%clgrid, 'en->j', zty )    
    1038                ELSE 
    1039                   CALL rot_rep( frcv(jpr_otx1)%z3(:,:,1), frcv(jpr_oty1)%z3(:,:,1), srcv(jpr_otx1)%clgrid, 'en->j', zty )   
     1043               IF( srcv(jpr_otx1)%clgrid == 'U' .AND. (.NOT. srcv(jpr_otx2)%laction) ) THEN 
     1044                  ! Temporary code for HadGEM3 - will be removed eventually. 
     1045        ! Only applies when we have only taux on U grid and tauy on V grid 
     1046             DO jj=2,jpjm1 
     1047                DO ji=2,jpim1 
     1048                     ztx(ji,jj)=0.25*vmask(ji,jj,1)                & 
     1049                        *(frcv(jpr_otx1)%z3(ji,jj,1)+frcv(jpr_otx1)%z3(ji-1,jj,1)    & 
     1050                        +frcv(jpr_otx1)%z3(ji,jj+1,1)+frcv(jpr_otx1)%z3(ji-1,jj+1,1)) 
     1051                     zty(ji,jj)=0.25*umask(ji,jj,1)                & 
     1052                        *(frcv(jpr_oty1)%z3(ji,jj,1)+frcv(jpr_oty1)%z3(ji+1,jj,1)    & 
     1053                        +frcv(jpr_oty1)%z3(ji,jj-1,1)+frcv(jpr_oty1)%z3(ji+1,jj-1,1)) 
     1054                ENDDO 
     1055             ENDDO 
     1056                    
     1057             ikchoix = 1 
     1058             CALL repcmo (frcv(jpr_otx1)%z3(:,:,1),zty,ztx,frcv(jpr_oty1)%z3(:,:,1),ztx2,zty2,ikchoix) 
     1059             CALL lbc_lnk (ztx2,'U', -1. ) 
     1060             CALL lbc_lnk (zty2,'V', -1. ) 
     1061             frcv(jpr_otx1)%z3(:,:,1)=ztx2(:,:) 
     1062             frcv(jpr_oty1)%z3(:,:,1)=zty2(:,:) 
     1063          ELSE 
     1064             CALL rot_rep( frcv(jpr_otx1)%z3(:,:,1), frcv(jpr_oty1)%z3(:,:,1), srcv(jpr_otx1)%clgrid, 'en->i', ztx )    
     1065             frcv(jpr_otx1)%z3(:,:,1) = ztx(:,:)      ! overwrite 1st component on the 1st grid 
     1066             IF( srcv(jpr_otx2)%laction ) THEN 
     1067                CALL rot_rep( frcv(jpr_otx2)%z3(:,:,1), frcv(jpr_oty2)%z3(:,:,1), srcv(jpr_otx2)%clgrid, 'en->j', zty )    
     1068             ELSE 
     1069                CALL rot_rep( frcv(jpr_otx1)%z3(:,:,1), frcv(jpr_oty1)%z3(:,:,1), srcv(jpr_otx1)%clgrid, 'en->j', zty )  
     1070             ENDIF 
     1071          frcv(jpr_oty1)%z3(:,:,1) = zty(:,:)      ! overwrite 2nd component on the 2nd grid   
    10401072               ENDIF 
    1041                frcv(jpr_otx1)%z3(:,:,1) = ztx(:,:)      ! overwrite 1st component on the 1st grid 
    1042                frcv(jpr_oty1)%z3(:,:,1) = zty(:,:)      ! overwrite 2nd component on the 2nd grid 
    10431073            ENDIF 
    10441074            !                               
     
    13111341      ENDIF 
    13121342      ! 
    1313       CALL wrk_dealloc( jpi,jpj,   ztx, zty, zmsk, zemp, zqns, zqsr ) 
     1343      CALL wrk_dealloc( jpi,jpj, ztx, zty, zmsk, zemp, zqns, zqsr, ztx2, zty2 ) 
    13141344      ! 
    13151345      IF( nn_timing == 1 )   CALL timing_stop('sbc_cpl_rcv') 
     
    19782008      ! 
    19792009      INTEGER ::   ji, jj, jl   ! dummy loop indices 
     2010      INTEGER ::   ikchoix 
    19802011      INTEGER ::   isec, info   ! local integer 
    19812012      REAL(wp) ::   zumax, zvmax 
     
    21562187         !                                                  j+1   j     -----V---F 
    21572188         ! surface velocity always sent from T point                     !       | 
    2158          !                                                        j      |   T   U 
     2189         ! [except for HadGEM3]                                   j      |   T   U 
    21592190         !                                                               |       | 
    21602191         !                                                   j    j-1   -I-------| 
     
    21682199            SELECT CASE( TRIM( sn_snd_crt%cldes ) ) 
    21692200            CASE( 'oce only'             )      ! C-grid ==> T 
    2170                DO jj = 2, jpjm1 
    2171                   DO ji = fs_2, fs_jpim1   ! vector opt. 
    2172                      zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj  ,1) ) 
    2173                      zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji  ,jj-1,1) )  
     2201               IF ( TRIM( sn_snd_crt%clvgrd ) == 'T' ) THEN 
     2202                  DO jj = 2, jpjm1 
     2203                     DO ji = fs_2, fs_jpim1   ! vector opt. 
     2204                        zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj  ,1) ) 
     2205                        zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji  ,jj-1,1) )  
     2206                     END DO 
    21742207                  END DO 
    2175                END DO 
     2208               ELSE 
     2209! Temporarily Changed for UKV 
     2210                  DO jj = 2, jpjm1 
     2211                     DO ji = 2, jpim1 
     2212                        zotx1(ji,jj) = un(ji,jj,1) 
     2213                        zoty1(ji,jj) = vn(ji,jj,1) 
     2214                     END DO 
     2215                  END DO 
     2216               ENDIF  
    21762217            CASE( 'weighted oce and ice' )    
    21772218               SELECT CASE ( cp_ice_msh ) 
     
    22322273                  END DO 
    22332274               CASE( 'F' )                      ! Ocean on C grid, Ice on F-point (B-grid) ==> T 
    2234                   DO jj = 2, jpjm1 
    2235                      DO ji = 2, jpim1   ! NO vector opt. 
    2236                         zotx1(ji,jj) = 0.5  * ( un(ji,jj,1)      + un(ji-1,jj  ,1) ) * zfr_l(ji,jj)   &    
    2237                            &         + 0.25 * ( u_ice(ji-1,jj-1) + u_ice(ji,jj-1)                     & 
    2238                            &                  + u_ice(ji-1,jj  ) + u_ice(ji,jj  )  ) *  fr_i(ji,jj) 
    2239                         zoty1(ji,jj) = 0.5  * ( vn(ji,jj,1)      + vn(ji  ,jj-1,1) ) * zfr_l(ji,jj)   &  
    2240                            &         + 0.25 * ( v_ice(ji-1,jj-1) + v_ice(ji,jj-1)                     & 
    2241                            &                  + v_ice(ji-1,jj  ) + v_ice(ji,jj  )  ) *  fr_i(ji,jj) 
     2275                  IF ( TRIM( sn_snd_crt%clvgrd ) == 'T' ) THEN 
     2276                     DO jj = 2, jpjm1 
     2277                        DO ji = 2, jpim1   ! NO vector opt. 
     2278                           zotx1(ji,jj) = 0.5  * ( un(ji,jj,1)      + un(ji-1,jj,1) ) * zfr_l(ji,jj)   &    
     2279                                &         + 0.25 * ( u_ice(ji-1,jj-1) + u_ice(ji,jj-1)                     & 
     2280                                &                  + u_ice(ji-1,jj  ) + u_ice(ji,jj  )  ) *  fr_i(ji,jj) 
     2281                           zoty1(ji,jj) = 0.5  * ( vn(ji,jj,1)      + vn(ji,jj-1,1) ) * zfr_l(ji,jj)   & 
     2282                                &         + 0.25 * ( v_ice(ji-1,jj-1) + v_ice(ji,jj-1)                     & 
     2283                                &                  + v_ice(ji-1,jj  ) + v_ice(ji,jj  )  ) *  fr_i(ji,jj) 
     2284                        END DO 
    22422285                     END DO 
    2243                   END DO 
     2286#if defined key_cice 
     2287                  ELSE 
     2288! Temporarily Changed for HadGEM3 
     2289                     DO jj = 2, jpjm1 
     2290                        DO ji = 2, jpim1   ! NO vector opt. 
     2291                           zotx1(ji,jj) = (1.0-fr_iu(ji,jj)) * un(ji,jj,1)             & 
     2292                                &              + fr_iu(ji,jj) * 0.5 * ( u_ice(ji,jj-1) + u_ice(ji,jj) )  
     2293                           zoty1(ji,jj) = (1.0-fr_iv(ji,jj)) * vn(ji,jj,1)             & 
     2294                                &              + fr_iv(ji,jj) * 0.5 * ( v_ice(ji-1,jj) + v_ice(ji,jj) )  
     2295                        END DO 
     2296                     END DO 
     2297#endif 
     2298                  ENDIF 
    22442299               END SELECT 
    22452300            END SELECT 
     
    22512306         IF( TRIM( sn_snd_crt%clvor ) == 'eastward-northward' ) THEN             ! Rotation of the components 
    22522307            !                                                                     ! Ocean component 
    2253             CALL rot_rep( zotx1, zoty1, ssnd(jps_ocx1)%clgrid, 'ij->e', ztmp1 )       ! 1st component  
    2254             CALL rot_rep( zotx1, zoty1, ssnd(jps_ocx1)%clgrid, 'ij->n', ztmp2 )       ! 2nd component  
    2255             zotx1(:,:) = ztmp1(:,:)                                                   ! overwrite the components  
    2256             zoty1(:,:) = ztmp2(:,:) 
    2257             IF( ssnd(jps_ivx1)%laction ) THEN                                     ! Ice component 
    2258                CALL rot_rep( zitx1, zity1, ssnd(jps_ivx1)%clgrid, 'ij->e', ztmp1 )    ! 1st component  
    2259                CALL rot_rep( zitx1, zity1, ssnd(jps_ivx1)%clgrid, 'ij->n', ztmp2 )    ! 2nd component  
    2260                zitx1(:,:) = ztmp1(:,:)                                                ! overwrite the components  
    2261                zity1(:,:) = ztmp2(:,:) 
    2262             ENDIF 
     2308            IF ( TRIM( sn_snd_crt%clvgrd ) == 'T' ) THEN 
     2309               CALL rot_rep( zotx1, zoty1, ssnd(jps_ocx1)%clgrid, 'ij->e', ztmp1 )       ! 1st component 
     2310               CALL rot_rep( zotx1, zoty1, ssnd(jps_ocx1)%clgrid, 'ij->n', ztmp2 )       ! 2nd component 
     2311               zotx1(:,:) = ztmp1(:,:)                                                   ! overwrite the components 
     2312               zoty1(:,:) = ztmp2(:,:) 
     2313               IF( ssnd(jps_ivx1)%laction ) THEN                                  ! Ice component 
     2314                  CALL rot_rep( zitx1, zity1, ssnd(jps_ivx1)%clgrid, 'ij->e', ztmp1 )    ! 1st component 
     2315                  CALL rot_rep( zitx1, zity1, ssnd(jps_ivx1)%clgrid, 'ij->n', ztmp2 )    ! 2nd component 
     2316                  zitx1(:,:) = ztmp1(:,:)                                                ! overwrite the components 
     2317                  zity1(:,:) = ztmp2(:,:) 
     2318               ENDIF 
     2319            ELSE 
     2320               ! Temporary code for HadGEM3 - will be removed eventually. 
     2321               ! Only applies when we want uvel on U grid and vvel on V grid 
     2322               ! Rotate U and V onto geographic grid before sending. 
     2323 
     2324               DO jj=2,jpjm1 
     2325                  DO ji=2,jpim1 
     2326                     ztmp1(ji,jj)=0.25*vmask(ji,jj,1)                  & 
     2327                          *(zotx1(ji,jj)+zotx1(ji-1,jj)    & 
     2328                          +zotx1(ji,jj+1)+zotx1(ji-1,jj+1)) 
     2329                     ztmp2(ji,jj)=0.25*umask(ji,jj,1)                  & 
     2330                          *(zoty1(ji,jj)+zoty1(ji+1,jj)    & 
     2331                          +zoty1(ji,jj-1)+zoty1(ji+1,jj-1)) 
     2332                  ENDDO 
     2333               ENDDO 
     2334                
     2335               ! Ensure any N fold and wrap columns are updated 
     2336               CALL lbc_lnk(ztmp1, 'V', -1.0) 
     2337               CALL lbc_lnk(ztmp2, 'U', -1.0) 
     2338                
     2339               ikchoix = -1 
     2340               CALL repcmo (zotx1,ztmp2,ztmp1,zoty1,zotx1,zoty1,ikchoix) 
     2341           ENDIF 
    22632342         ENDIF 
    22642343         ! 
Note: See TracChangeset for help on using the changeset viewer.