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

Changeset 14750


Ignore:
Timestamp:
2021-04-26T19:18:53+02:00 (3 years ago)
Author:
smueller
Message:

Upgrade of internal subroutine zdf_osm_velocity_rotation and a short section of subroutine zdf_osm to a streamlined generic procedure (ticket #2353)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2021/dev_r14122_HPC-08_Mueller_OSMOSIS_streamlining/src/OCE/ZDF/zdfosm.F90

    r14748 r14750  
    156156   INTEGER :: idebug = 236 
    157157   INTEGER :: jdebug = 228 
     158 
     159   INTERFACE zdf_osm_velocity_rotation 
     160      !!--------------------------------------------------------------------- 
     161      !!              ***  INTERFACE zdf_velocity_rotation  *** 
     162      !!--------------------------------------------------------------------- 
     163      MODULE PROCEDURE zdf_osm_velocity_rotation_2d 
     164      MODULE PROCEDURE zdf_osm_velocity_rotation_3d 
     165   END INTERFACE 
    158166 
    159167   !! * Substitutions 
     
    666674      END IF 
    667675#endif 
    668       ! Velocity components in frame aligned with surface stress. 
    669       CALL zdf_osm_velocity_rotation( zcos_wind, zsin_wind, zu_ml, zv_ml, zdu_ml, zdv_ml ) 
    670       CALL zdf_osm_velocity_rotation( zcos_wind, zsin_wind, zu_bl, zv_bl, zdu_bl, zdv_bl ) 
     676      ! Velocity components in frame aligned with surface stress 
     677      CALL zdf_osm_velocity_rotation( zu_ml,  zv_ml,  zcos_wind, zsin_wind ) 
     678      CALL zdf_osm_velocity_rotation( zdu_ml, zdv_ml, zcos_wind, zsin_wind ) 
     679      CALL zdf_osm_velocity_rotation( zu_bl,  zv_bl,  zcos_wind, zsin_wind ) 
     680      CALL zdf_osm_velocity_rotation( zdu_bl, zdv_bl, zcos_wind, zsin_wind ) 
    671681#ifdef key_osm_debug 
    672682      IF(narea==nn_narea_db) THEN 
     
    900910      END IF 
    901911#endif 
    902  
    903       ! rotate mean currents and changes onto wind align co-ordinates 
    904  
    905       CALL zdf_osm_velocity_rotation( zcos_wind, zsin_wind, zu_ml, zv_ml, zdu_ml, zdv_ml ) 
    906       CALL zdf_osm_velocity_rotation( zcos_wind, zsin_wind, zu_bl, zv_bl, zdu_bl, zdv_bl ) 
     912      ! Rotate mean currents and changes onto wind aligned co-ordinates 
     913      CALL zdf_osm_velocity_rotation( zu_ml,  zv_ml,  zcos_wind, zsin_wind ) 
     914      CALL zdf_osm_velocity_rotation( zdu_ml, zdv_ml, zcos_wind, zsin_wind ) 
     915      CALL zdf_osm_velocity_rotation( zu_bl,  zv_bl,  zcos_wind, zsin_wind ) 
     916      CALL zdf_osm_velocity_rotation( zdu_bl, zdv_bl, zcos_wind, zsin_wind ) 
    907917#ifdef key_osm_debug 
    908918      IF(narea==nn_narea_db) THEN 
     
    968978      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    969979 
    970  
    971  
    972       ! rotate non-gradient velocity terms back to model reference frame 
    973  
    974       DO_2D( 0, 0, 0, 0 ) 
    975          DO jk = 2, ibld(ji,jj) 
    976             ztemp = ghamu(ji,jj,jk) 
    977             ghamu(ji,jj,jk) = ghamu(ji,jj,jk) * zcos_wind(ji,jj) - ghamv(ji,jj,jk) * zsin_wind(ji,jj) 
    978             ghamv(ji,jj,jk) = ghamv(ji,jj,jk) * zcos_wind(ji,jj) + ztemp * zsin_wind(ji,jj) 
    979          END DO 
    980       END_2D 
     980      ! Rotate non-gradient velocity terms back to model reference frame 
     981      CALL zdf_osm_velocity_rotation( ghamu, ghamv, zcos_wind, zsin_wind, .FALSE., 2, ibld ) 
    981982 
    982983      ! KPP-style Ri# mixing 
     
    16581659 
    16591660 
    1660       SUBROUTINE zdf_osm_velocity_rotation( zcos_w, zsin_w, zu, zv, zdu, zdv ) 
    1661          !!--------------------------------------------------------------------- 
    1662          !!                   ***  ROUTINE zdf_velocity_rotation  *** 
    1663          !! 
    1664          !! ** Purpose : Rotates frame of reference of averaged velocity components. 
    1665          !! 
    1666          !! ** Method  : The velocity components are rotated into frame specified by zcos_w and zsin_w 
    1667          !! 
    1668          !!---------------------------------------------------------------------- 
    1669           
    1670          REAL(wp), DIMENSION(jpi,jpj) :: zcos_w, zsin_w       ! Cos and Sin of rotation angle 
    1671          REAL(wp), DIMENSION(jpi,jpj) :: zu, zv               ! Components of current 
    1672          REAL(wp), DIMENSION(jpi,jpj) :: zdu, zdv             ! Change in velocity components across pycnocline 
    1673  
    1674          INTEGER :: ji, jj 
    1675          REAL(wp) :: ztemp 
    1676  
    1677          IF( ln_timing ) CALL timing_start('zdf_osm_vr') 
    1678          DO_2D( 0, 0, 0, 0 ) 
    1679             ztemp = zu(ji,jj) 
    1680             zu(ji,jj) = zu(ji,jj) * zcos_w(ji,jj) + zv(ji,jj) * zsin_w(ji,jj) 
    1681             zv(ji,jj) = zv(ji,jj) * zcos_w(ji,jj) - ztemp * zsin_w(ji,jj) 
    1682             ztemp = zdu(ji,jj) 
    1683             zdu(ji,jj) = zdu(ji,jj) * zcos_w(ji,jj) + zdv(ji,jj) * zsin_w(ji,jj) 
    1684             zdv(ji,jj) = zdv(ji,jj) * zcos_w(ji,jj) - ztemp * zsin_w(ji,jj) 
    1685          END_2D 
    1686          IF( ln_timing ) CALL timing_stop('zdf_osm_vr') 
    1687       END SUBROUTINE zdf_osm_velocity_rotation 
    1688  
    16891661      SUBROUTINE zdf_osm_osbl_state_fk( lpyc, lflux, lmle, zwb_fk ) 
    16901662         !!--------------------------------------------------------------------- 
     
    26832655      ! 
    26842656   END SUBROUTINE zdf_osm_vertical_average 
     2657 
     2658   SUBROUTINE zdf_osm_velocity_rotation_2d( pu, pv, pcos_w, psin_w, fwd ) 
     2659      !!--------------------------------------------------------------------- 
     2660      !!            ***  ROUTINE zdf_velocity_rotation_2d  *** 
     2661      !! 
     2662      !! ** Purpose : Rotates frame of reference of velocity components pu and 
     2663      !!              pv (2d) 
     2664      !! 
     2665      !! ** Method : The velocity components are rotated into (fwd=.TRUE.) or 
     2666      !!             from (fwd=.FALSE.) the frame specified by pcos_w and psin_w 
     2667      !! 
     2668      !!----------------------------------------------------------------------       
     2669      REAL(wp),           INTENT(inout), DIMENSION(jpi,jpj) ::   pu, pv           ! Components of current 
     2670      REAL(wp),           INTENT(in   ), DIMENSION(jpi,jpj) ::   pcos_w, psin_w   ! Cos and sin of rotation angle 
     2671      LOGICAL,  OPTIONAL, INTENT(in   )                     ::   fwd              ! Forward (default) or reverse rotation 
     2672      ! 
     2673      INTEGER  ::   ji, jj       ! Loop indices 
     2674      REAL(wp) ::   ztmp, zfwd   ! Auxiliary variables 
     2675      ! 
     2676      IF( ln_timing ) CALL timing_start('zdf_osm_vr') 
     2677      ! 
     2678      zfwd = 1.0_wp 
     2679      IF( PRESENT(fwd) .AND. ( fwd==.FALSE. ) ) zfwd = -1.0_wp 
     2680      DO_2D( 0, 0, 0, 0 ) 
     2681         ztmp      = pu(ji,jj) 
     2682         pu(ji,jj) = pu(ji,jj) * pcos_w(ji,jj) + zfwd * pv(ji,jj) * psin_w(ji,jj) 
     2683         pv(ji,jj) = pv(ji,jj) * pcos_w(ji,jj) - zfwd * ztmp      * psin_w(ji,jj) 
     2684      END_2D 
     2685      ! 
     2686      IF( ln_timing ) CALL timing_stop('zdf_osm_vr') 
     2687      ! 
     2688   END SUBROUTINE zdf_osm_velocity_rotation_2d 
     2689 
     2690   SUBROUTINE zdf_osm_velocity_rotation_3d( pu, pv, pcos_w, psin_w, fwd, ktop, knlev ) 
     2691      !!--------------------------------------------------------------------- 
     2692      !!            ***  ROUTINE zdf_velocity_rotation_3d  *** 
     2693      !! 
     2694      !! ** Purpose : Rotates frame of reference of velocity components pu and 
     2695      !!              pv (3d) 
     2696      !! 
     2697      !! ** Method : The velocity components are rotated into (fwd=.TRUE.) or 
     2698      !!             from (fwd=.FALSE.) the frame specified by pcos_w and 
     2699      !!             psin_w; optionally, the rotation can be restricted at each 
     2700      !!             water column to span from the a minimum index ktop to the 
     2701      !!             depth index specified in array knlev 
     2702      !! 
     2703      !!----------------------------------------------------------------------       
     2704      REAL(wp),           INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pu, pv           ! Components of current 
     2705      REAL(wp),           INTENT(in   ), DIMENSION(jpi,jpj)     ::   pcos_w, psin_w   ! Cos and sin of rotation angle 
     2706      LOGICAL,  OPTIONAL, INTENT(in   )                         ::   fwd              ! Forward (default) or reverse rotation 
     2707      INTEGER,  OPTIONAL, INTENT(in   )                         ::   ktop             ! Minimum depth index 
     2708      INTEGER,  OPTIONAL, INTENT(in   ), DIMENSION(jpi,jpj)     ::   knlev            ! Array of maximum depth indices 
     2709      !  
     2710      INTEGER  ::   ji, jj, jk, jktop, jkmax   ! Loop indices 
     2711      REAL(wp) ::   ztmp, zfwd                 ! Auxiliary variables 
     2712      LOGICAL  ::   llkbot                     ! Auxiliary variable 
     2713      ! 
     2714      IF( ln_timing ) CALL timing_start('zdf_osm_vr') 
     2715      ! 
     2716      zfwd = 1.0_wp 
     2717      IF( PRESENT(fwd) .AND. ( fwd==.FALSE. ) ) zfwd = -1.0_wp 
     2718      jktop = 1 
     2719      IF( PRESENT(ktop) ) jktop = ktop 
     2720      IF( PRESENT(knlev) ) THEN 
     2721         jkmax = 0 
     2722         DO_2D( 0, 0, 0, 0 ) 
     2723            IF ( knlev(ji,jj) > jkmax ) jkmax = knlev(ji,jj) 
     2724         END_2D 
     2725         llkbot = .FALSE. 
     2726      ELSE 
     2727         jkmax = jpk 
     2728         llkbot = .TRUE. 
     2729      END IF 
     2730      DO_3D( 0, 0, 0, 0, jktop, jkmax ) 
     2731         IF ( llkbot .OR. knlev(ji,jj) >= jk ) THEN 
     2732            ztmp         = pu(ji,jj,jk) 
     2733            pu(ji,jj,jk) = pu(ji,jj,jk) * pcos_w(ji,jj) + zfwd * pv(ji,jj,jk) * psin_w(ji,jj) 
     2734            pv(ji,jj,jk) = pv(ji,jj,jk) * pcos_w(ji,jj) - zfwd * ztmp         * psin_w(ji,jj) 
     2735         END IF 
     2736      END_3D 
     2737      ! 
     2738      IF( ln_timing ) CALL timing_stop('zdf_osm_vr') 
     2739      ! 
     2740   END SUBROUTINE zdf_osm_velocity_rotation_3d 
    26852741 
    26862742   SUBROUTINE zdf_osm_fgr_terms( Kmm, kbld, kmld, kp_ext, ldconv, ldpyc, k_ddh, phbl, phml, pdh, pdhdt, phol, pshear,             & 
Note: See TracChangeset for help on using the changeset viewer.