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 888 for trunk/NEMO/LIM_SRC_2/limdyn_2.F90 – NEMO

Ignore:
Timestamp:
2008-04-11T19:05:03+02:00 (16 years ago)
Author:
ctlod
Message:

merge dev_001_SBC branche with the trunk to include the New Surface Module package, see ticket: #113

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMO/LIM_SRC_2/limdyn_2.F90

    r823 r888  
    44   !!   Sea-Ice dynamics :   
    55   !!====================================================================== 
     6   !! History :   1.0  !  01-04  (LIM)  Original code 
     7   !!             2.0  !  02-08  (C. Ethe, G. Madec)  F90, mpp 
     8   !!             2.0  !  03-08  (C. Ethe) add lim_dyn_init 
     9   !!             2.0  !  06-07  (G. Madec)  Surface module 
     10   !!--------------------------------------------------------------------- 
    611#if defined key_lim2 
    712   !!---------------------------------------------------------------------- 
     
    1116   !!    lim_dyn_init_2 : initialization and namelist read 
    1217   !!---------------------------------------------------------------------- 
    13    !! * Modules used 
    14    USE phycst 
    15    USE in_out_manager  ! I/O manager 
    16    USE dom_ice_2 
    17    USE dom_oce         ! ocean space and time domain 
    18    USE ice_2 
    19    USE ice_oce 
    20    USE iceini_2 
    21    USE limistate_2 
    22    USE limrhg_2        ! ice rheology 
    23    USE lbclnk 
    24    USE lib_mpp 
    25    USE prtctl          ! Print control 
     18   USE dom_oce        ! ocean space and time domain 
     19   USE sbc_oce        ! 
     20   USE phycst         ! 
     21   USE ice_2          ! 
     22   USE ice_oce        ! 
     23   USE dom_ice_2      ! 
     24   USE iceini_2       ! 
     25   USE limistate_2    ! 
     26   USE limrhg_2       ! ice rheology 
     27 
     28   USE lbclnk         ! 
     29   USE lib_mpp        ! 
     30   USE in_out_manager ! I/O manager 
     31   USE prtctl         ! Print control 
    2632 
    2733   IMPLICIT NONE 
    2834   PRIVATE 
    2935 
    30    !! * Accessibility 
    31    PUBLIC lim_dyn_2  ! routine called by ice_step 
     36   PUBLIC   lim_dyn_2 ! routine called by sbc_ice_lim 
    3237 
    3338   !! * Module variables 
    3439   REAL(wp)  ::  rone    = 1.e0   ! constant value 
    3540 
    36    !!---------------------------------------------------------------------- 
    37    !!   LIM 2.0,  UCL-LOCEAN-IPSL (2005)  
    38    !! $Header$  
    39    !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt  
     41#  include "vectopt_loop_substitute.h90" 
     42   !!---------------------------------------------------------------------- 
     43   !!   LIM 2.0,  UCL-LOCEAN-IPSL (2006)  
     44   !! $ Id: $ 
     45   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
    4046   !!---------------------------------------------------------------------- 
    4147 
     
    4652      !!               ***  ROUTINE lim_dyn_2  *** 
    4753      !!                
    48       !! ** Purpose :   compute ice velocity and ocean-ice stress 
     54      !! ** Purpose :   compute ice velocity and ocean-ice friction velocity 
    4955      !!                 
    5056      !! ** Method  :  
     
    5258      !! ** Action  : - Initialisation 
    5359      !!              - Call of the dynamic routine for each hemisphere 
    54       !!              - computation of the stress at the ocean surface          
     60      !!              - computation of the friction velocity at the sea-ice base 
    5561      !!              - treatment of the case if no ice dynamic 
    56       !! History : 
    57       !!   1.0  !  01-04  (LIM)  Original code 
    58       !!   2.0  !  02-08  (C. Ethe, G. Madec)  F90, mpp 
    5962      !!--------------------------------------------------------------------- 
    6063      INTEGER, INTENT(in) ::   kt     ! number of iteration 
    61  
    62       INTEGER ::   ji, jj             ! dummy loop indices 
    63       INTEGER ::   i_j1, i_jpj        ! Starting/ending j-indices for rheology 
    64       REAL(wp) ::   & 
    65          ztairx, ztairy,           &  ! tempory scalars 
    66          zsang , zmod,             & 
    67          ztglx , ztgly ,           & 
    68          zt11, zt12, zt21, zt22 ,  & 
    69          zustm, zsfrld, zsfrldm4,  & 
    70          zu_ice, zv_ice, ztair2 
    71       REAL(wp),DIMENSION(jpj) ::   & 
    72          zind,                     &  ! i-averaged indicator of sea-ice 
    73          zmsk                         ! i-averaged of tmask 
     64      !! 
     65      INTEGER  ::   ji, jj             ! dummy loop indices 
     66      INTEGER  ::   i_j1, i_jpj        ! Starting/ending j-indices for rheology 
     67      REAL(wp) ::   zcoef              ! temporary scalar 
     68      REAL(wp), DIMENSION(jpj)     ::   zind           ! i-averaged indicator of sea-ice 
     69      REAL(wp), DIMENSION(jpj)     ::   zmsk           ! i-averaged of tmask 
     70      REAL(wp), DIMENSION(jpi,jpj) ::   zu_io, zv_io   ! ice-ocean velocity 
    7471      !!--------------------------------------------------------------------- 
    7572 
    76       IF( kt == nit000  )   CALL lim_dyn_init_2   ! Initialization (first time-step only) 
     73      IF( kt == nit000 )   CALL lim_dyn_init_2   ! Initialization (first time-step only) 
    7774       
    78       IF ( ln_limdyn ) THEN 
    79  
     75      IF( ln_limdyn ) THEN 
     76         ! 
    8077         ! Mean ice and snow thicknesses.           
    8178         hsnm(:,:)  = ( 1.0 - frld(:,:) ) * hsnif(:,:) 
    8279         hicm(:,:)  = ( 1.0 - frld(:,:) ) * hicif(:,:) 
    83  
    84          u_oce(:,:)  = u_io(:,:) * tmu(:,:) 
    85          v_oce(:,:)  = v_io(:,:) * tmu(:,:) 
    86         
    87          !                                         ! Rheology (ice dynamics) 
    88          !                                         ! ======== 
     80         ! 
     81         !                                     ! Rheology (ice dynamics) 
     82         !                                     ! ======== 
    8983          
    9084         !  Define the j-limits where ice rheology is computed 
     
    9488            i_j1 = 1    
    9589            i_jpj = jpj 
    96             IF(ln_ctl)    THEN 
    97                CALL prt_ctl_info('lim_dyn  :    i_j1 = ', ivar1=i_j1, clinfo2=' ij_jpj = ', ivar2=i_jpj) 
    98             ENDIF 
     90            IF(ln_ctl)   CALL prt_ctl_info( 'lim_dyn  :    i_j1 = ', ivar1=i_j1, clinfo2=' ij_jpj = ', ivar2=i_jpj ) 
    9991            CALL lim_rhg_2( i_j1, i_jpj ) 
    100  
     92            ! 
    10193         ELSE                                 ! optimization of the computational area 
    102  
     94            ! 
    10395            DO jj = 1, jpj 
    10496               zind(jj) = SUM( frld (:,jj  ) )   ! = FLOAT(jpj) if ocean everywhere on a j-line 
    10597               zmsk(jj) = SUM( tmask(:,jj,1) )   ! = 0          if land  everywhere on a j-line 
    106    !!i         write(numout,*) narea, 'limdyn' , jj, zind(jj), zmsk(jj) 
    107             END DO 
    108  
     98            END DO 
     99            ! 
    109100            IF( l_jeq ) THEN                     ! local domain include both hemisphere 
    110101               !                                 ! Rheology is computed in each hemisphere 
     
    118109               i_j1 = MAX( 1, i_j1-1 ) 
    119110               IF(ln_ctl)   WRITE(numout,*) 'lim_dyn : NH i_j1 = ', i_j1, ' ij_jpj = ', i_jpj 
    120      
     111               !  
    121112               CALL lim_rhg_2( i_j1, i_jpj ) 
    122      
     113               !  
    123114               ! Southern hemisphere 
    124115               i_j1  =  1  
     
    129120               i_jpj = MIN( jpj, i_jpj+2 ) 
    130121               IF(ln_ctl)   WRITE(numout,*) 'lim_dyn : SH i_j1 = ', i_j1, ' ij_jpj = ', i_jpj 
    131      
     122               !  
    132123               CALL lim_rhg_2( i_j1, i_jpj ) 
    133      
     124               !  
    134125            ELSE                                 ! local domain extends over one hemisphere only 
    135126               !                                 ! Rheology is computed only over the ice cover 
     
    148139     
    149140               IF(ln_ctl)   WRITE(numout,*) 'lim_dyn : one hemisphere: i_j1 = ', i_j1, ' ij_jpj = ', i_jpj 
    150      
     141               !  
    151142               CALL lim_rhg_2( i_j1, i_jpj ) 
    152  
     143               ! 
    153144            ENDIF 
    154  
     145            ! 
    155146         ENDIF 
    156147 
    157          IF(ln_ctl)   THEN  
    158             CALL prt_ctl(tab2d_1=u_oce , clinfo1=' lim_dyn  : u_oce :', tab2d_2=v_oce , clinfo2=' v_oce :') 
    159             CALL prt_ctl(tab2d_1=u_ice , clinfo1=' lim_dyn  : u_ice :', tab2d_2=v_ice , clinfo2=' v_ice :') 
    160          ENDIF 
    161           
    162          !                                         ! Ice-Ocean stress 
    163          !                                         ! ================ 
     148         IF(ln_ctl)   CALL prt_ctl(tab2d_1=ui_ice , clinfo1=' lim_dyn  : ui_ice :', tab2d_2=vi_ice , clinfo2=' vi_ice :') 
     149          
     150         ! computation of friction velocity 
     151         ! -------------------------------- 
     152         ! ice-ocean velocity at U & V-points (ui_ice vi_ice at I-point ; ssu_m, ssv_m at U- & V-points) 
     153          
     154         DO jj = 1, jpjm1 
     155            DO ji = 1, fs_jpim1   ! vector opt. 
     156               zu_io(ji,jj) = 0.5 * ( ui_ice(ji+1,jj+1) + ui_ice(ji+1,jj  ) ) - ssu_m(ji,jj) 
     157               zv_io(ji,jj) = 0.5 * ( vi_ice(ji+1,jj+1) + vi_ice(ji  ,jj+1) ) - ssv_m(ji,jj) 
     158            END DO 
     159         END DO 
     160         ! frictional velocity at T-point 
    164161         DO jj = 2, jpjm1 
    165             zsang  = SIGN(1.e0, gphif(1,jj-1) ) * sangvg 
    166             DO ji = 2, jpim1 
    167                ! computation of wind stress over ocean in X and Y direction 
    168 #if defined key_coupled && defined key_lim_cp1 
    169                ztairx =  frld(ji-1,jj  ) * gtaux(ji-1,jj  ) + frld(ji,jj  ) * gtaux(ji,jj  )      & 
    170                   &    + frld(ji-1,jj-1) * gtaux(ji-1,jj-1) + frld(ji,jj-1) * gtaux(ji,jj-1) 
    171  
    172                ztairy =  frld(ji-1,jj  ) * gtauy(ji-1,jj  ) + frld(ji,jj  ) * gtauy(ji,jj  )      & 
    173                   &    + frld(ji-1,jj-1) * gtauy(ji-1,jj-1) + frld(ji,jj-1) * gtauy(ji,jj-1) 
    174 #else 
    175                zsfrld  = frld(ji,jj) + frld(ji-1,jj) + frld(ji-1,jj-1) + frld(ji,jj-1) 
    176                ztairx  = zsfrld * gtaux(ji,jj) 
    177                ztairy  = zsfrld * gtauy(ji,jj) 
    178 #endif 
    179                zsfrldm4 = 4 - frld(ji,jj) - frld(ji-1,jj) - frld(ji-1,jj-1) - frld(ji,jj-1) 
    180                zu_ice   = u_ice(ji,jj) - u_oce(ji,jj) 
    181                zv_ice   = v_ice(ji,jj) - v_oce(ji,jj) 
    182                zmod     = SQRT( zu_ice * zu_ice + zv_ice * zv_ice )  
    183                ztglx   = zsfrldm4 * rhoco * zmod * ( cangvg * zu_ice - zsang * zv_ice )  
    184                ztgly   = zsfrldm4 * rhoco * zmod * ( cangvg * zv_ice + zsang * zu_ice )  
    185  
    186                tio_u(ji,jj) = - ( ztairx + 1.0 * ztglx ) / ( 4 * rau0 ) 
    187                tio_v(ji,jj) = - ( ztairy + 1.0 * ztgly ) / ( 4 * rau0 ) 
     162            DO ji = fs_2, fs_jpim1   ! vector opt. 
     163               ust2s(ji,jj) = 0.5 * cw                                                          & 
     164                  &         * (  zu_io(ji,jj) * zu_io(ji,jj) + zu_io(ji-1,jj) * zu_io(ji-1,jj)   & 
     165                  &            + zv_io(ji,jj) * zv_io(ji,jj) + zv_io(ji,jj-1) * zv_io(ji,jj-1)   ) * tms(ji,jj) 
    188166            END DO 
    189167         END DO 
    190           
    191          ! computation of friction velocity 
     168         ! 
     169      ELSE      ! no ice dynamics : transmit directly the atmospheric stress to the ocean 
     170         ! 
     171         zcoef = SQRT( 0.5 ) / rau0 
    192172         DO jj = 2, jpjm1 
    193             DO ji = 2, jpim1 
    194  
    195                zu_ice   = u_ice(ji-1,jj-1) - u_oce(ji-1,jj-1) 
    196                zv_ice   = v_ice(ji-1,jj-1) - v_oce(ji-1,jj-1) 
    197                zt11  = rhoco * ( zu_ice * zu_ice + zv_ice * zv_ice ) 
    198  
    199                zu_ice   = u_ice(ji-1,jj) - u_oce(ji-1,jj) 
    200                zv_ice   = v_ice(ji-1,jj) - v_oce(ji-1,jj) 
    201                zt12  = rhoco * ( zu_ice * zu_ice + zv_ice * zv_ice )  
    202  
    203                zu_ice   = u_ice(ji,jj-1) - u_oce(ji,jj-1) 
    204                zv_ice   = v_ice(ji,jj-1) - v_oce(ji,jj-1) 
    205                zt21  = rhoco * ( zu_ice * zu_ice + zv_ice * zv_ice )  
    206  
    207                zu_ice   = u_ice(ji,jj) - u_oce(ji,jj) 
    208                zv_ice   = v_ice(ji,jj) - v_oce(ji,jj) 
    209                zt22  = rhoco * ( zu_ice * zu_ice + zv_ice * zv_ice )  
    210  
    211                ztair2 = gtaux(ji,jj) * gtaux(ji,jj) + gtauy(ji,jj) * gtauy(ji,jj) 
    212  
    213                zustm =  ( 1 - frld(ji,jj) ) * 0.25 * ( zt11 + zt12 + zt21 + zt22 )        & 
    214                   &  +        frld(ji,jj)   * SQRT( ztair2 ) 
    215  
    216                ust2s(ji,jj) = ( zustm / rau0 ) * ( rone + sdvt(ji,jj) ) * tms(ji,jj) 
     173            DO ji = fs_2, fs_jpim1   ! vector opt. 
     174               ust2s(ji,jj) = zcoef * tms(ji,jj) * SQRT(  utau(ji,jj) * utau(ji,jj) + utau(ji-1,jj) * utau(ji-1,jj)   & 
     175                  &                                     + vtau(ji,jj) * vtau(ji,jj) + vtau(ji,jj-1) * vtau(ji,jj-1) ) 
    217176            END DO 
    218177         END DO 
    219  
    220        ELSE      ! no ice dynamics : transmit directly the atmospheric stress to the ocean 
    221                      
    222           DO jj = 2, jpjm1 
    223              DO ji = 2, jpim1 
    224 #if defined key_coupled && defined key_lim_cp1 
    225                 tio_u(ji,jj) = - (  gtaux(ji  ,jj  ) + gtaux(ji-1,jj  )       & 
    226                    &              + gtaux(ji-1,jj-1) + gtaux(ji  ,jj-1) ) / ( 4 * rau0 ) 
    227  
    228                 tio_v(ji,jj) = - (  gtauy(ji  ,jj )  + gtauy(ji-1,jj  )       & 
    229                    &              + gtauy(ji-1,jj-1) + gtauy(ji  ,jj-1) ) / ( 4 * rau0 ) 
    230 #else 
    231                 tio_u(ji,jj) = - gtaux(ji,jj) / rau0 
    232                 tio_v(ji,jj) = - gtauy(ji,jj) / rau0  
    233 #endif 
    234                 ztair2       = gtaux(ji,jj) * gtaux(ji,jj) + gtauy(ji,jj) * gtauy(ji,jj) 
    235                 zustm        = SQRT( ztair2  ) 
    236  
    237                 ust2s(ji,jj) = ( zustm / rau0 ) * ( rone + sdvt(ji,jj) ) * tms(ji,jj) 
    238             END DO 
    239          END DO 
    240  
     178         ! 
    241179      ENDIF 
    242  
     180      ! 
    243181      CALL lbc_lnk( ust2s, 'T',  1. )   ! T-point 
    244       CALL lbc_lnk( tio_u, 'I', -1. )   ! I-point (i.e. ice U-V point) 
    245       CALL lbc_lnk( tio_v, 'I', -1. )   ! I-point (i.e. ice U-V point) 
    246  
    247       IF(ln_ctl) THEN  
    248             CALL prt_ctl(tab2d_1=tio_u , clinfo1=' lim_dyn  : tio_u :', tab2d_2=tio_v , clinfo2=' tio_v :') 
    249             CALL prt_ctl(tab2d_1=ust2s , clinfo1=' lim_dyn  : ust2s :') 
    250       ENDIF 
     182      ! 
     183      IF(ln_ctl)   CALL prt_ctl(tab2d_1=ust2s , clinfo1=' lim_dyn  : ust2s :') 
    251184 
    252185   END SUBROUTINE lim_dyn_2 
     
    257190      !!                  ***  ROUTINE lim_dyn_init_2  *** 
    258191      !! 
    259       !! ** Purpose : Physical constants and parameters linked to the ice 
    260       !!      dynamics 
    261       !! 
    262       !! ** Method  :  Read the namicedyn namelist and check the ice-dynamic 
    263       !!       parameter values called at the first timestep (nit000) 
     192      !! ** Purpose :   Physical constants and parameters linked to the ice 
     193      !!              dynamics 
     194      !! 
     195      !! ** Method  :   Read the namicedyn namelist and check the ice-dynamic 
     196      !!              parameter values 
    264197      !! 
    265198      !! ** input   :   Namelist namicedyn 
    266       !! 
    267       !! history : 
    268       !!  8.5  ! 03-08 (C. Ethe) original code 
    269199      !!------------------------------------------------------------------- 
    270200      NAMELIST/namicedyn/ epsd, alpha,     & 
     
    273203      !!------------------------------------------------------------------- 
    274204 
    275       ! Define the initial parameters 
    276       ! ------------------------- 
    277  
    278       ! Read Namelist namicedyn 
    279       REWIND ( numnam_ice ) 
     205      REWIND ( numnam_ice )                       ! Read Namelist namicedyn 
    280206      READ   ( numnam_ice  , namicedyn ) 
    281       IF(lwp) THEN 
     207 
     208      IF(lwp) THEN                                ! Control print 
    282209         WRITE(numout,*) 
    283210         WRITE(numout,*) 'lim_dyn_init_2: ice parameters for ice dynamics ' 
     
    291218         WRITE(numout,*) '       maximum value for the residual of relaxation     resl   = ', resl 
    292219         WRITE(numout,*) '       drag coefficient for oceanic stress              cw     = ', cw 
    293          WRITE(numout,*) '       turning angle for oceanic stress                 angvg  = ', angvg 
     220         WRITE(numout,*) '       turning angle for oceanic stress                 angvg  = ', angvg, ' degrees' 
    294221         WRITE(numout,*) '       first bulk-rheology parameter                    pstar  = ', pstar 
    295222         WRITE(numout,*) '       second bulk-rhelogy parameter                    c_rhg  = ', c_rhg 
     
    303230      usecc2 = 1.0 / ( ecc * ecc ) 
    304231      rhoco  = rau0 * cw 
    305       angvg  = angvg * rad 
     232      angvg  = angvg * rad      ! convert angvg from degree to radian 
    306233      sangvg = SIN( angvg ) 
    307234      cangvg = COS( angvg ) 
    308235      pstarh = pstar / 2.0 
    309       sdvt(:,:) = 0.e0 
    310  
    311       !  Diffusion coefficients. 
    312       ahiu(:,:) = ahi0 * umask(:,:,1) 
     236      ! 
     237      ahiu(:,:) = ahi0 * umask(:,:,1)            ! Ice eddy Diffusivity coefficients. 
    313238      ahiv(:,:) = ahi0 * vmask(:,:,1) 
    314  
     239      ! 
    315240   END SUBROUTINE lim_dyn_init_2 
    316241 
Note: See TracChangeset for help on using the changeset viewer.