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 13357 for NEMO/branches/2020/tickets_icb_1900/src/OCE/ICB/icbutl.F90 – NEMO

Ignore:
Timestamp:
2020-07-30T13:20:57+02:00 (4 years ago)
Author:
mathiot
Message:

ticket #1900: add changes for Merino 2016 works. Results unchanged if flag ln_M2016 is set to .false. . Remaining step: test ln_M2016 = .true.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/tickets_icb_1900/src/OCE/ICB/icbutl.F90

    r13265 r13357  
    1919   !!---------------------------------------------------------------------- 
    2020   USE par_oce                             ! ocean parameters 
     21   USE oce,    ONLY: ts, uu, vv 
    2122   USE dom_oce                             ! ocean domain 
    2223   USE in_out_manager                      ! IO parameters 
     
    3435   PRIVATE 
    3536 
     37   INTERFACE icb_utl_bilin_h 
     38      MODULE PROCEDURE icb_utl_bilin_2d_h, icb_utl_bilin_3d_h 
     39   END INTERFACE 
     40 
    3641   PUBLIC   icb_utl_copy          ! routine called in icbstp module 
     42   PUBLIC   icb_utl_getkb         ! routine called in icbdyn and icbthm modules 
    3743   PUBLIC   icb_utl_interp        ! routine called in icbdyn, icbthm modules 
    3844   PUBLIC   icb_utl_bilin_h       ! routine called in icbdyn module 
     
    5662CONTAINS 
    5763 
    58    SUBROUTINE icb_utl_copy() 
     64   SUBROUTINE icb_utl_copy( Kmm ) 
    5965      !!---------------------------------------------------------------------- 
    6066      !!                  ***  ROUTINE icb_utl_copy  *** 
     
    6470      !! ** Method  : - blah blah 
    6571      !!---------------------------------------------------------------------- 
     72      REAL(wp), DIMENSION(0:jpi+1,0:jpj+1) :: ztmp 
    6673#if defined key_si3 
    6774      REAL(wp), DIMENSION(jpi,jpj) :: zssh_lead_m    !    ocean surface (ssh_m) if ice is not embedded 
    6875      !                                              !    ocean surface in leads if ice is embedded    
    6976#endif 
     77      INTEGER :: jk   ! vertical loop index 
     78      INTEGER :: Kmm  ! ocean time levelindex 
     79      ! 
    7080      ! copy nemo forcing arrays into iceberg versions with extra halo 
    7181      ! only necessary for variables not on T points 
    7282      ! and ssh which is used to calculate gradients 
    73  
    74       uo_e(1:jpi,1:jpj) = ssu_m(:,:) * umask(:,:,1) 
    75       vo_e(1:jpi,1:jpj) = ssv_m(:,:) * vmask(:,:,1) 
    76       tt_e(1:jpi,1:jpj) = sst_m(:,:) 
    77       fr_e(1:jpi,1:jpj) = fr_i (:,:) 
    78       ua_e(1:jpi,1:jpj) = utau (:,:) * umask(:,:,1) ! maybe mask useless because mask applied in sbcblk 
    79       va_e(1:jpi,1:jpj) = vtau (:,:) * vmask(:,:,1) ! maybe mask useless because mask applied in sbcblk 
    80       ! 
    81       CALL lbc_lnk_icb( 'icbutl', uo_e, 'U', -1._wp, 1, 1 ) 
    82       CALL lbc_lnk_icb( 'icbutl', vo_e, 'V', -1._wp, 1, 1 ) 
     83      ! 
     84      ! surface forcing 
     85      ! 
     86      ssu_e(1:jpi,1:jpj) = ssu_m(:,:) * umask(:,:,1) 
     87      ssv_e(1:jpi,1:jpj) = ssv_m(:,:) * vmask(:,:,1) 
     88      sst_e(1:jpi,1:jpj) = sst_m(:,:) 
     89      fr_e (1:jpi,1:jpj) = fr_i (:,:) 
     90      ua_e (1:jpi,1:jpj) = utau (:,:) * umask(:,:,1) ! maybe mask useless because mask applied in sbcblk 
     91      va_e (1:jpi,1:jpj) = vtau (:,:) * vmask(:,:,1) ! maybe mask useless because mask applied in sbcblk 
     92      ! 
     93      CALL lbc_lnk_icb( 'icbutl', ssu_e, 'U', -1._wp, 1, 1 ) 
     94      CALL lbc_lnk_icb( 'icbutl', ssv_e, 'V', -1._wp, 1, 1 ) 
    8395      CALL lbc_lnk_icb( 'icbutl', ua_e, 'U', -1._wp, 1, 1 ) 
    8496      CALL lbc_lnk_icb( 'icbutl', va_e, 'V', -1._wp, 1, 1 ) 
     
    98110#endif 
    99111      ! 
     112      ! (PM) could be improve with a 3d lbclnk gathering both variables 
     113      ! should be done once extra haloe generalised 
     114      IF ( ln_M2016 ) THEN 
     115         DO jk = 1,jpk 
     116            ! uoce 
     117            ztmp(1:jpi,1:jpj) = uu(:,:,jk,Kmm) 
     118            CALL lbc_lnk_icb( 'icbutl', ztmp, 'U', -1._wp, 1, 1 ) 
     119            uoce_e(:,:,jk) = ztmp(:,:) 
     120            ! 
     121            ! voce 
     122            ztmp(1:jpi,1:jpj) = vv(:,:,jk,Kmm) 
     123            CALL lbc_lnk_icb( 'icbutl', ztmp, 'V', -1._wp, 1, 1 ) 
     124            voce_e(:,:,jk) = ztmp(:,:) 
     125         END DO 
     126         toce_e(1:jpi,1:jpj,1:jpk) = ts(:,:,:,1,Kmm) 
     127         e3t_e (1:jpi,1:jpj,1:jpk) = e3t(:,:,:,Kmm) 
     128      END IF 
     129      ! 
    100130   END SUBROUTINE icb_utl_copy 
    101131 
    102132 
    103    SUBROUTINE icb_utl_interp( pi, pj, pe1, puo, pui, pua, pssh_i,   & 
    104       &                               pe2, pvo, pvi, pva, pssh_j,   & 
    105       &                               psst, pcn, phi, pff, plon, plat) 
     133   SUBROUTINE icb_utl_interp( pi, pj, pe1, pssu, pui, pua, pssh_i,     & 
     134      &                               pe2, pssv, pvi, pva, pssh_j,     & 
     135      &                               psst, pcn, phi, pff, plon, plat, & 
     136      &                               ptoce, puoce, pvoce, pe3t       ) 
    106137      !!---------------------------------------------------------------------- 
    107138      !!                  ***  ROUTINE icb_utl_interp  *** 
     
    122153      REAL(wp), INTENT(in   ) ::   pi , pj                        ! position in (i,j) referential 
    123154      REAL(wp), INTENT(  out), OPTIONAL ::   pe1, pe2                       ! i- and j scale factors 
    124       REAL(wp), INTENT(  out), OPTIONAL ::   puo, pvo, pui, pvi, pua, pva   ! ocean, ice and wind speeds 
     155      REAL(wp), INTENT(  out), OPTIONAL ::   pssu, pssv, pui, pvi, pua, pva   ! ocean, ice and wind speeds 
    125156      REAL(wp), INTENT(  out), OPTIONAL ::   pssh_i, pssh_j                 ! ssh i- & j-gradients 
    126157      REAL(wp), INTENT(  out), OPTIONAL ::   psst, pcn, phi, pff            ! SST, ice concentration, ice thickness, Coriolis 
    127158      REAL(wp), INTENT(  out), OPTIONAL ::   plat, plon                     ! position 
     159      REAL(wp), DIMENSION(jpk), INTENT(  out), OPTIONAL ::   ptoce, puoce, pvoce, pe3t   ! 3D variables 
    128160      ! 
    129161      REAL(wp), DIMENSION(4) :: zwT  , zwU  , zwV  , zwF   ! interpolation weight 
     
    147179      IF ( PRESENT(plat) ) plat= icb_utl_bilin_h( rlat_e, iiT, ijT, zwT, .false. ) 
    148180      ! 
    149       IF ( PRESENT(puo ) ) puo  = icb_utl_bilin_h( uo_e, iiU, ijU, zwU        , .false. )         ! ocean velocities 
    150       IF ( PRESENT(pvo ) ) pvo  = icb_utl_bilin_h( vo_e, iiV, ijV, zwV        , .false. )         ! 
    151       IF ( PRESENT(psst) ) psst = icb_utl_bilin_h( tt_e, iiT, ijT, zwT * zmskT, .false. ) ! sst 
    152       IF ( PRESENT(pcn ) ) pcn  = icb_utl_bilin_h( fr_e, iiT, ijT, zwT * zmskT, .false. ) ! ice concentration 
    153       IF ( PRESENT(pff ) ) pff  = icb_utl_bilin_h( ff_e, iiF, ijF, zwF        , .false. )         ! Coriolis parameter 
     181      IF ( PRESENT(pssu) ) pssu = icb_utl_bilin_h( ssu_e, iiU, ijU, zwU        , .false. )         ! ocean velocities 
     182      IF ( PRESENT(pssv) ) pssv = icb_utl_bilin_h( ssv_e, iiV, ijV, zwV        , .false. )         ! 
     183      IF ( PRESENT(psst) ) psst = icb_utl_bilin_h( sst_e, iiT, ijT, zwT * zmskT, .false. ) ! sst 
     184      IF ( PRESENT(pcn ) ) pcn  = icb_utl_bilin_h( fr_e , iiT, ijT, zwT * zmskT, .false. ) ! ice concentration 
     185      IF ( PRESENT(pff ) ) pff  = icb_utl_bilin_h( ff_e , iiF, ijF, zwF        , .false. )         ! Coriolis parameter 
    154186      ! 
    155187      IF ( PRESENT(pua) .AND. PRESENT(pva) ) THEN 
     
    188220            &       icb_utl_bilin_h( ssh_e, iiTm, ijTm, zwTm*zmskTm, .false. )  ) / ( 0.2_wp * pe2 ) 
    189221      END IF 
     222      ! 
     223      ! 3d interpolation 
     224      IF ( PRESENT(puoce) .AND. PRESENT(pvoce) ) THEN 
     225         puoce(:) = icb_utl_bilin_h( uoce_e , iiU, ijU, zwU ) 
     226         pvoce(:) = icb_utl_bilin_h( voce_e , iiV, ijV, zwV ) 
     227      END IF 
     228      IF ( PRESENT(ptoce) ) ptoce(:) = icb_utl_bilin_h( toce_e , iiT, ijT, zwT * zmskT ) 
     229      IF ( PRESENT(pe3t)  ) pe3t(:)  = e3t_e(iiT,ijT,:)    ! as in Nacho tarball need to be fix once we are able to reproduce Nacho results 
    190230      ! 
    191231   END SUBROUTINE icb_utl_interp 
     
    291331   END SUBROUTINE icb_utl_pos 
    292332 
    293    REAL(wp) FUNCTION icb_utl_bilin_h( pfld, pii, pij, pw, pllon ) 
     333   REAL(wp) FUNCTION icb_utl_bilin_2d_h( pfld, pii, pij, pw, pllon ) 
    294334      !!---------------------------------------------------------------------- 
    295335      !!                  ***  FUNCTION icb_utl_bilin  *** 
     
    321361      ! 
    322362      ! compute interpolated value 
    323       icb_utl_bilin_h = ( zdat(1)*pw(1) + zdat(2)*pw(2) + zdat(3)*pw(3) + zdat(4)*pw(4) ) / MAX(1.e-20, pw(1)+pw(2)+pw(3)+pw(4))  
    324       ! 
    325       IF( pllon .AND. icb_utl_bilin_h > 180._wp ) icb_utl_bilin_h = icb_utl_bilin_h - 360._wp 
    326       ! 
    327    END FUNCTION icb_utl_bilin_h 
     363      icb_utl_bilin_2d_h = ( zdat(1)*pw(1) + zdat(2)*pw(2) + zdat(3)*pw(3) + zdat(4)*pw(4) ) / MAX(1.e-20, pw(1)+pw(2)+pw(3)+pw(4))  
     364      ! 
     365      IF( pllon .AND. icb_utl_bilin_2d_h > 180._wp ) icb_utl_bilin_2d_h = icb_utl_bilin_2d_h - 360._wp 
     366      ! 
     367   END FUNCTION icb_utl_bilin_2d_h 
     368 
     369   FUNCTION icb_utl_bilin_3d_h( pfld, pii, pij, pw ) 
     370      !!---------------------------------------------------------------------- 
     371      !!                  ***  FUNCTION icb_utl_bilin  *** 
     372      !! 
     373      !! ** Purpose :   bilinear interpolation at berg location depending on the grid-point type 
     374      !!                this version deals with extra halo points 
     375      !! 
     376      !!       !!gm  CAUTION an optional argument should be added to handle 
     377      !!             the slip/no-slip conditions  ==>>> to be done later 
     378      !! 
     379      !!---------------------------------------------------------------------- 
     380      REAL(wp), DIMENSION(0:jpi+1,0:jpj+1, jpk), INTENT(in) ::   pfld      ! field to be interpolated 
     381      REAL(wp), DIMENSION(4)                   , INTENT(in) ::   pw        ! weight 
     382      INTEGER ,                                  INTENT(in) ::   pii, pij  ! bottom left corner 
     383      REAL(wp), DIMENSION(jpk) :: icb_utl_bilin_3d_h 
     384      ! 
     385      REAL(wp), DIMENSION(4,jpk) :: zdat ! input data 
     386      !!---------------------------------------------------------------------- 
     387      ! 
     388      ! data 
     389      zdat(1,:) = pfld(pii  ,pij  ,:) 
     390      zdat(2,:) = pfld(pii+1,pij  ,:) 
     391      zdat(3,:) = pfld(pii  ,pij+1,:) 
     392      zdat(4,:) = pfld(pii+1,pij+1,:) 
     393      ! 
     394      ! compute interpolated value 
     395      icb_utl_bilin_3d_h(:) = ( zdat(1,:)*pw(1) + zdat(2,:)*pw(2) + zdat(3,:)*pw(3) + zdat(4,:)*pw(4) ) / MAX(1.e-20, pw(1)+pw(2)+pw(3)+pw(4))  
     396      ! 
     397   END FUNCTION icb_utl_bilin_3d_h 
    328398 
    329399   REAL(wp) FUNCTION icb_utl_bilin_e( pet, peu, pev, pef, pi, pj ) 
     
    405475   END FUNCTION icb_utl_bilin_e 
    406476 
     477   SUBROUTINE icb_utl_getkb( kb, pe3, pD ) 
     478      !!---------------------------------------------------------------------- 
     479      !!                ***  ROUTINE icb_utl_getkb         *** 
     480      !! 
     481      !! ** Purpose :   compute the latest level affected by icb 
     482      !! 
     483      !!---------------------------------------------------------------------- 
     484      INTEGER, INTENT(out)               :: kb 
     485      REAL(wp), DIMENSION(:), INTENT(in) :: pe3 
     486      REAL(wp),               INTENT(in) :: pD 
     487      !! 
     488      INTEGER  :: jk 
     489      REAL(wp) :: zdepw 
     490      !! 
     491      zdepw = 0.0 
     492      kb = 1 
     493      DO WHILE ( zdepw <  pD) 
     494         zdepw = zdepw + pe3(kb) 
     495         kb = kb + 1 
     496      END DO 
     497      kb = kb - 1 
     498   END SUBROUTINE 
    407499 
    408500   SUBROUTINE icb_utl_add( bergvals, ptvals ) 
     
    593685      WRITE(numicb, 9200) kt, berg%number(1), & 
    594686                   pt%xi, pt%yj, pt%lon, pt%lat, pt%uvel, pt%vvel,  & 
    595                    pt%uo, pt%vo, pt%ua, pt%va, pt%ui, pt%vi 
     687                   pt%ssu, pt%ssv, pt%ua, pt%va, pt%ui, pt%vi 
    596688      CALL flush( numicb ) 
    597689 9200 FORMAT(5x,i5,2x,i10,6(2x,2f10.4)) 
     
    619711         WRITE(numicb,'(a," pe=(",i3,")")' ) cd_label, narea 
    620712         WRITE(numicb,'(a8,4x,a6,12x,a5,15x,a7,19x,a3,17x,a5,17x,a5,17x,a5)' )   & 
    621             &         'timestep', 'number', 'xi,yj','lon,lat','u,v','uo,vo','ua,va','ui,vi' 
     713            &         'timestep', 'number', 'xi,yj','lon,lat','u,v','ssu,ssv','ua,va','ui,vi' 
    622714      ENDIF 
    623715      DO WHILE( ASSOCIATED(this) ) 
Note: See TracChangeset for help on using the changeset viewer.