Changeset 14750
- Timestamp:
- 2021-04-26T19:18:53+02:00 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2021/dev_r14122_HPC-08_Mueller_OSMOSIS_streamlining/src/OCE/ZDF/zdfosm.F90
r14748 r14750 156 156 INTEGER :: idebug = 236 157 157 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 158 166 159 167 !! * Substitutions … … 666 674 END IF 667 675 #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 ) 671 681 #ifdef key_osm_debug 672 682 IF(narea==nn_narea_db) THEN … … 900 910 END IF 901 911 #endif 902 903 ! rotate mean currents and changes onto wind align co-ordinates904 905 CALL zdf_osm_velocity_rotation( z cos_wind, zsin_wind, zu_ml, zv_ml, zdu_ml, zdv_ml)906 CALL zdf_osm_velocity_rotation( z cos_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 ) 907 917 #ifdef key_osm_debug 908 918 IF(narea==nn_narea_db) THEN … … 968 978 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 969 979 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 ) 981 982 982 983 ! KPP-style Ri# mixing … … 1658 1659 1659 1660 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_w1667 !!1668 !!----------------------------------------------------------------------1669 1670 REAL(wp), DIMENSION(jpi,jpj) :: zcos_w, zsin_w ! Cos and Sin of rotation angle1671 REAL(wp), DIMENSION(jpi,jpj) :: zu, zv ! Components of current1672 REAL(wp), DIMENSION(jpi,jpj) :: zdu, zdv ! Change in velocity components across pycnocline1673 1674 INTEGER :: ji, jj1675 REAL(wp) :: ztemp1676 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_2D1686 IF( ln_timing ) CALL timing_stop('zdf_osm_vr')1687 END SUBROUTINE zdf_osm_velocity_rotation1688 1689 1661 SUBROUTINE zdf_osm_osbl_state_fk( lpyc, lflux, lmle, zwb_fk ) 1690 1662 !!--------------------------------------------------------------------- … … 2683 2655 ! 2684 2656 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 2685 2741 2686 2742 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.