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 700 for trunk/NEMO/LIM_SRC – NEMO

Changeset 700 for trunk/NEMO/LIM_SRC


Ignore:
Timestamp:
2007-10-09T14:24:27+02:00 (17 years ago)
Author:
smasson
Message:

sbc(1): bugfix on wind stress computation #2

Location:
trunk/NEMO/LIM_SRC
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMO/LIM_SRC/icestp.F90

    r699 r700  
    2121   USE flx_oce         ! forcings variables 
    2222   USE dom_ice 
    23    USE cpl_oce 
    2423   USE daymod 
    2524   USE phycst          ! Define parameters for the routines 
     
    4847   !!----------------------------------------------------- 
    4948   !!   LIM 2.0,  UCL-LOCEAN-IPSL (2005)  
    50    !! $Id$ 
     49   !! $Header$  
    5150   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
    5251   !!----------------------------------------------------- 
     
    7170 
    7271      INTEGER                      ::   ji, jj   ! dummy loop indices 
    73       REAL(wp), DIMENSION(jpi,jpj) ::   zsss_io, zsss2_io, zsss3_io          ! tempory workspaces 
     72      REAL(wp), DIMENSION(jpi,jpj) ::   zsss_io, zsss2_io, zsss3_io   ! tempory workspaces 
     73      REAL(wp)                     ::   zmult                         ! tempory workspaces 
    7474      !!---------------------------------------------------------------------- 
    7575 
    7676      IF( kt == nit000 ) THEN 
    77          IF( lk_cpl ) THEN 
    78             IF(lwp) WRITE(numout,*) 
    79             IF(lwp) WRITE(numout,*) 'ice_stp : Louvain la Neuve Ice Model (LIM)' 
    80             IF(lwp) WRITE(numout,*) '~~~~~~~   coupled case' 
    81          ELSE 
    82             IF(lwp) WRITE(numout,*) 
    83             IF(lwp) WRITE(numout,*) 'ice_stp : Louvain la Neuve Ice Model (LIM)'  
    84             IF(lwp) WRITE(numout,*) '~~~~~~~   forced case using bulk formulea' 
    85          ENDIF 
    86          !  Initialize fluxes fields 
     77         IF(lwp) WRITE(numout,*) 
     78         IF(lwp) WRITE(numout,*) 'ice_stp : Louvain la Neuve Ice Model (LIM)' 
     79          !  Initialize fluxes fields 
    8780         gtaux(:,:) = 0.e0 
    8881         gtauy(:,:) = 0.e0 
     
    9790      !    cumulate fields 
    9891      ! 
    99       sst_io(:,:) = sst_io(:,:) + tn(:,:,1) + rt0 
     92      sst_io(:,:) = sst_io(:,:) + tn(:,:,1) 
    10093      sss_io(:,:) = sss_io(:,:) + sn(:,:,1) 
    10194 
    10295  
    103       ! vectors at F-point 
     96      ! surface ocean current at I-point (from U-, V-points) 
    10497      DO jj = 2, jpj 
    10598         DO ji = fs_2, jpi   ! vector opt. 
    106             u_io(ji,jj) = u_io(ji,jj) + 0.5 * ( un(ji-1,jj  ,1) + un(ji-1,jj-1,1) ) 
    107             v_io(ji,jj) = v_io(ji,jj) + 0.5 * ( vn(ji  ,jj-1,1) + vn(ji-1,jj-1,1) ) 
     99            u_io (ji,jj) = u_io(ji,jj) + un(ji-1,jj  ,1) + un(ji-1,jj-1,1) 
     100            v_io (ji,jj) = v_io(ji,jj) + vn(ji  ,jj-1,1) + vn(ji-1,jj-1,1) 
    108101         END DO 
    109102      END DO 
     
    113106          
    114107         ! The LIM model is going to be call 
    115          sst_io(:,:) = sst_io(:,:) / FLOAT( nfice ) * tmask(:,:,1) 
    116          sss_io(:,:) = sss_io(:,:) / FLOAT( nfice ) 
     108         zmult = 1. / REAL( nfice, wp ) 
     109         sst_io(:,:) = zmult * sst_io(:,:) * tmask(:,:,1) + rt0 
     110         sss_io(:,:) = zmult * sss_io(:,:) 
    117111 
    118112         ! stress from ocean U- and V-points to ice U,V point 
     113         zmult = 0.5 * zmult 
    119114         DO jj = 2, jpj 
    120115            DO ji = fs_2, jpi   ! vector opt. 
    121                gtaux(ji,jj) = 0.5 * ( taux(ji-1,jj  ) + taux(ji-1,jj-1) ) 
    122                gtauy(ji,jj) = 0.5 * ( tauy(ji  ,jj-1) + tauy(ji-1,jj-1) ) 
    123                u_io  (ji,jj) = u_io(ji,jj) / FLOAT( nfice ) 
    124                v_io  (ji,jj) = v_io(ji,jj) / FLOAT( nfice ) 
     116               ! ice/atmosphere stress at I-point (from U-, V-points) 
     117               gtaux(ji,jj) = 0.5 * ( taux_ice(ji-1,jj  ) + taux_ice(ji-1,jj-1) )  
     118               gtauy(ji,jj) = 0.5 * ( tauy_ice(ji  ,jj-1) + tauy_ice(ji-1,jj-1) ) 
     119                
     120               u_io (ji,jj) = zmult * u_io(ji,jj) 
     121               v_io (ji,jj) = zmult * v_io(ji,jj) 
    125122            END DO 
    126123         END DO 
     
    168165!!gm      END DO 
    169166!!gm 
    170       zsss_io (:,:) = SQRT( sss_io(:,:) )  
    171       zsss2_io(:,:) =  sss_io(:,:) *  sss_io(:,:) 
    172       zsss3_io(:,:) = zsss_io(:,:) * zsss_io(:,:) * zsss_io(:,:) 
    173  
    174       DO jj = 1, jpj 
    175          DO ji = 1, jpi 
    176             tfu(ji,jj)  = ABS ( rt0 - 0.0575       *   sss_io(ji,jj)   & 
    177                &                    + 1.710523e-03 * zsss3_io(ji,jj)   & 
    178                &                    - 2.154996e-04 * zsss2_io(ji,jj) ) * tms(ji,jj) 
     167         zsss_io (:,:) = SQRT( sss_io(:,:) )  
     168         zsss2_io(:,:) =  sss_io(:,:) *  sss_io(:,:) 
     169         zsss3_io(:,:) = zsss_io(:,:) * zsss_io(:,:) * zsss_io(:,:) 
     170          
     171         DO jj = 1, jpj 
     172            DO ji = 1, jpi 
     173               tfu(ji,jj)  = ABS ( rt0 - 0.0575       *   sss_io(ji,jj)   & 
     174                    &                    + 1.710523e-03 * zsss3_io(ji,jj)   & 
     175                    &                    - 2.154996e-04 * zsss2_io(ji,jj) ) * tms(ji,jj) 
     176            END DO 
    179177         END DO 
    180       END DO 
    181     
    182178          
    183179 
     
    196192 
    197193         !                                                           !-----------------------! 
    198          CALL lim_rst_opn( kt )                                   ! Open Ice restart file ! 
     194         CALL lim_rst_opn( kt )                                      ! Open Ice restart file ! 
    199195         !                                                           !-----------------------! 
    200196 
     
    240236 
    241237         IF( MOD( kt + nfice -1, ninfo ) == 0 .OR. ntmoy == 1 )  THEN        !-----------------! 
    242             CALL lim_dia( kt )                                    ! Ice Diagnostics ! 
     238            CALL lim_dia( kt )                                       ! Ice Diagnostics ! 
    243239         ENDIF                                                       !-----------------! 
    244240 
     
    248244 
    249245         !                                                           !------------------------! 
    250          IF( lrst_ice ) CALL lim_rst_write( kt )                  ! Write Ice restart file ! 
     246         IF( lrst_ice ) CALL lim_rst_write( kt )                     ! Write Ice restart file ! 
    251247         !                                                           !------------------------! 
    252248 
     
    262258         fr2_i0  (:,:) = 0.e0 
    263259         evap    (:,:) = 0.e0 
    264 #if defined key_coupled  
    265          rrunoff (:,:) = 0.e0 
    266          calving (:,:) = 0.e0 
    267 #else 
     260#if ! defined key_coupled  
    268261         qla_ice (:,:) = 0.e0 
    269262         dqla_ice(:,:) = 0.e0 
  • trunk/NEMO/LIM_SRC/limflx.F90

    r699 r700  
    3939   !!---------------------------------------------------------------------- 
    4040   !!   LIM 2.0,  UCL-LOCEAN-IPSL (2005)  
    41    !! $Id$ 
     41   !! $Header$  
    4242   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt  
    4343   !!---------------------------------------------------------------------- 
     
    106106      DO jj = 1, jpj 
    107107         DO ji = 1, jpi 
    108             zinda   = 1.0 - MAX( rzero , SIGN( rone , - ( 1.0 - pfrld(ji,jj) ) ) ) 
    109             ifvt    = zinda  *  MAX( rzero , SIGN( rone, -phicif(ji,jj) ) ) 
    110             i1mfr   = 1.0 - MAX( rzero , SIGN( rone ,  - ( 1.0 - frld(ji,jj) ) ) ) 
    111             idfr    = 1.0 - MAX( rzero , SIGN( rone , frld(ji,jj) - pfrld(ji,jj) ) ) 
    112             iflt    = zinda  * (1 - i1mfr) * (1 - ifvt ) 
    113             ial     = ifvt   * i1mfr + ( 1 - ifvt ) * idfr 
    114             iadv    = ( 1  - i1mfr ) * zinda 
    115             ifral   = ( 1  - i1mfr * ( 1 - ial ) )    
     108!!sm            zinda   = 1.0 - MAX( rzero , SIGN( rone , - ( 1.0 - pfrld(ji,jj) ) ) ) 
     109!!sm            ifvt    = zinda  *  MAX( rzero , SIGN( rone, -phicif(ji,jj) ) ) 
     110!!sm            i1mfr   = 1.0 - MAX( rzero , SIGN( rone ,  - ( 1.0 - frld(ji,jj) ) ) ) 
     111!!sm            idfr    = 1.0 - MAX( rzero , SIGN( rone , frld(ji,jj) - pfrld(ji,jj) ) ) 
     112 
     113            zinda   = 1.0 - AINT( pfrld(ji,jj) )                   !   = 0. if pure ocean else 1. (at previous time) 
     114 
     115            i1mfr   = 1.0 - AINT(  frld(ji,jj) )                   !   = 0. if pure ocean else 1. (at current  time) 
     116 
     117            IF( phicif(ji,jj) <= 0. ) THEN   ;   ifvt = zinda      !   = 1. if (snow and no ice at previous time) else 0. ??? 
     118            ELSE                             ;   ifvt = 0. 
     119            ENDIF 
     120 
     121            IF( frld(ji,jj) >= pfrld(ji,jj) ) THEN   ;   idfr = 0.  !   = 0. if lead fraction increases from previous to current 
     122            ELSE                                     ;   idfr = 1.    
     123            ENDIF 
     124 
     125            iflt    = zinda  * (1 - i1mfr) * (1 - ifvt )    !   = 1. if ice (not only snow) at previous and pure ocean at current 
     126 
     127            ial     = ifvt   * i1mfr    +    ( 1 - ifvt ) * idfr 
     128!                 snow no ice   ice         ice or nothing  lead fraction increases 
     129!                 at previous   now           at previous 
     130!                -> ice aera increases  ???         -> ice aera decreases ??? 
     131 
     132            iadv    = ( 1  - i1mfr ) * zinda   
     133!                     pure ocean      ice at 
     134!                     at current      previous 
     135!                        -> = 1. if ice disapear between previous and current 
     136 
     137            ifral   = ( 1  - i1mfr * ( 1 - ial ) )   
     138!                            ice at     ??? 
     139!                            current          
     140!                         -> ??? 
     141  
    116142            ifrdv   = ( 1  - ifral * ( 1 - ial ) ) * iadv  
     143!                                                    ice disapear                            
     144! 
     145! 
    117146            z1mthcm =   1. - thcm(ji,jj)        
    118147            !   computation the solar flux at ocean surface 
     
    179208      !-----------------------------------------------! 
    180209 
    181       ftaux (:,:) = - tio_u(:,:) * rau0   ! taux ( ice: N/m2/rau0, ocean: N/m2 ) 
    182       ftauy (:,:) = - tio_v(:,:) * rau0   ! tauy ( ice: N/m2/rau0, ocean: N/m2 )                 
    183210      freeze(:,:) = 1.0 - frld(:,:)       ! Sea ice cover             
    184211      tn_ice(:,:) = sist(:,:)             ! Ice surface temperature                       
     
    201228         CALL prt_ctl(tab2d_1=fsolar, clinfo1=' lim_flx: fsolar : ', tab2d_2=fnsolar, clinfo2=' fnsolar : ') 
    202229         CALL prt_ctl(tab2d_1=fmass , clinfo1=' lim_flx: fmass  : ', tab2d_2=fsalt  , clinfo2=' fsalt   : ') 
    203          CALL prt_ctl(tab2d_1=ftaux , clinfo1=' lim_flx: ftaux  : ', tab2d_2=ftauy  , clinfo2=' ftauy   : ') 
    204230         CALL prt_ctl(tab2d_1=freeze, clinfo1=' lim_flx: freeze : ', tab2d_2=tn_ice , clinfo2=' tn_ice  : ') 
    205231      ENDIF  
  • trunk/NEMO/LIM_SRC/limhdf.F90

    r699 r700  
    3434   !!---------------------------------------------------------------------- 
    3535   !!   LIM 2.0,  UCL-LOCEAN-IPSL (2005)  
    36    !! $Id$ 
     36   !! $Header$  
    3737   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt  
    3838   !!---------------------------------------------------------------------- 
  • trunk/NEMO/LIM_SRC/limrhg.F90

    r699 r700  
    44   !!   Ice rheology :  performs sea ice rheology 
    55   !!====================================================================== 
     6   !! History :   0.0  !  93-12  (M.A. Morales Maqueda.)  Original code 
     7   !!             1.0  !  94-12  (H. Goosse)  
     8   !!             2.0  !  03-12  (C. Ethe, G. Madec)  F90, mpp 
     9   !!             3.0  !  07-06  (S. Masson, G. Madec)  ice/atmosphere stress 
     10   !!                             provided at I-point in forced and coupled mode 
     11   !!---------------------------------------------------------------------- 
    612#if defined key_ice_lim 
    713   !!---------------------------------------------------------------------- 
     
    3339   !!---------------------------------------------------------------------- 
    3440   !!   LIM 2.0,  UCL-LOCEAN-IPSL (2005)  
    35    !! $Id$ 
     41   !! $Header$  
    3642   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt  
    3743   !!---------------------------------------------------------------------- 
     
    5056      !! ** Action  : - compute u_ice, v_ice the sea-ice velocity 
    5157      !! 
    52       !! History : 
    53       !!   0.0  !  93-12  (M.A. Morales Maqueda.)  Original code 
    54       !!   1.0  !  94-12  (H. Goosse)  
    55       !!   2.0  !  03-12  (C. Ethe, G. Madec)  F90, mpp 
    5658      !!------------------------------------------------------------------- 
    57       ! * Arguments 
    5859      INTEGER, INTENT(in) ::   k_j1 ,  &  ! southern j-index for ice computation 
    5960         &                     k_jpj      ! northern j-index for ice computation 
    6061 
    61       ! * Local variables 
    6262      INTEGER ::   ji, jj              ! dummy loop indices 
    6363 
     
    7777         zresm, zunw, zvnw, zur, zvr, zmod, za, zac, & 
    7878         zmpzas, zstms, zindu, zindu1, zusdtp, zmassdt, zcorlal,  & 
    79          ztrace2, zdeter, zdelta, zsang, zmask, zdgp, zdgi, zdiag 
     79         ztrace2, zdeter, zdelta, zsang, zmask, zdgp, zdgi, zdiag, zic 
    8080      REAL(wp),DIMENSION(jpi,jpj) ::   & 
    8181         zpresh, zfrld, zmass, zcorl,     & 
     
    9292      zv0(:,:) = v_ice(:,:) 
    9393 
    94       ! Ice mass, ice strength, and wind stress at the center            | 
    95       ! of the grid squares.                                             | 
     94      ! masked Ice mass, ice strength, Ice-cover fraction and Lead faction  at T-point  
    9695      !------------------------------------------------------------------- 
    9796 
     
    10099            za1(ji,jj)    = tms(ji,jj) * ( rhosn * hsnm(ji,jj) + rhoic * hicm(ji,jj) ) 
    101100            zpresh(ji,jj) = tms(ji,jj) *  pstarh * hicm(ji,jj) * EXP( -c_rhg * frld(ji,jj) ) 
    102 #if defined key_lim_cp1 && defined key_coupled 
    103             zb1(ji,jj)    = tms(ji,jj) * gtaux(ji,jj) * ( 1.0 - frld(ji,jj) ) 
    104             zb2(ji,jj)    = tms(ji,jj) * gtauy(ji,jj) * ( 1.0 - frld(ji,jj) ) 
    105 #else 
    106             zb1(ji,jj)    = tms(ji,jj) * ( 1.0 - frld(ji,jj) ) 
    107             zb2(ji,jj)    = tms(ji,jj) * ( 1.0 - frld(ji,jj) ) 
    108 #endif 
     101 
     102            zb1(ji,jj)    = tms(ji,jj) * ( 1.0 - frld(ji,jj) )     
     103            zb2(ji,jj)    = tms(ji,jj) *         frld(ji,jj)       
    109104         END DO 
    110105      END DO 
    111106 
    112  
    113       !--------------------------------------------------------------------------- 
    114       !  Wind stress, coriolis and mass terms at the corners of the grid squares | 
    115       !  Gradient of ice strenght.                                               | 
     107      !  Wind stress, coriolis, mass and Gradient of ice strenght at I-point 
    116108      !--------------------------------------------------------------------------- 
    117109          
     
    122114            zusw  = 1.0 / MAX( zstms, epsd ) 
    123115 
    124             zt11 = tms(ji  ,jj  ) * frld(ji  ,jj  )  
    125             zt12 = tms(ji-1,jj  ) * frld(ji-1,jj  )  
    126             zt21 = tms(ji  ,jj-1) * frld(ji  ,jj-1)  
    127             zt22 = tms(ji-1,jj-1) * frld(ji-1,jj-1) 
    128  
    129             ! Leads area. 
    130             zfrld(ji,jj) =  (  zt11 * wght(ji,jj,2,2) + zt12 * wght(ji,jj,1,2)   & 
    131                &             + zt21 * wght(ji,jj,2,1) + zt22 * wght(ji,jj,1,1) ) * zusw 
     116            ! Leads area at I-point 
     117            zfrld(ji,jj) = ( zb2(ji,jj  ) * wght(ji,jj,2,2) + zb2(ji-1,jj  ) * wght(ji,jj,1,2)   & 
     118               &           + zb2(ji,jj-1) * wght(ji,jj,2,1) + zb2(ji-1,jj-1) * wght(ji,jj,1,1) ) * zusw 
     119 
     120            ! Ice cover area at I-point 
     121            zic          = ( zb1(ji,jj  ) * wght(ji,jj,2,2) + zb1(ji-1,jj  ) * wght(ji,jj,1,2)   & 
     122               &           + zb1(ji,jj-1) * wght(ji,jj,2,1) + zb1(ji-1,jj-1) * wght(ji,jj,1,1) ) * zusw 
     123 
     124            ! Wind stress. 
     125            ztagnx = zic * gtaux(ji,jj) 
     126            ztagny = zic * gtauy(ji,jj) 
    132127 
    133128            ! Mass and coriolis coeff. 
     
    135130               &           + za1(ji,jj-1) * wght(ji,jj,2,1) + za1(ji-1,jj-1) * wght(ji,jj,1,1) ) * zusw 
    136131            zcorl(ji,jj) = zmass(ji,jj) * fcor(ji,jj) 
    137  
    138             ! Wind stress. 
    139 #if defined key_lim_cp1 && defined key_coupled 
    140             ztagnx = ( zb1(ji,jj  ) * wght(ji,jj,2,2) + zb1(ji-1,jj  ) * wght(ji,jj,1,2)   & 
    141                &     + zb1(ji,jj-1) * wght(ji,jj,2,1) + zb1(ji-1,jj-1) * wght(ji,jj,1,1) ) * zusw 
    142             ztagny = ( zb2(ji,jj  ) * wght(ji,jj,2,2) + zb2(ji-1,jj  ) * wght(ji,jj,1,2)   & 
    143                &     + zb2(ji,jj-1) * wght(ji,jj,2,1) + zb2(ji-1,jj-1) * wght(ji,jj,1,1) ) * zusw 
    144 #else 
    145             ztagnx = ( zb1(ji,jj  ) * wght(ji,jj,2,2) + zb1(ji-1,jj  ) * wght(ji,jj,1,2)   & 
    146                &     + zb1(ji,jj-1) * wght(ji,jj,2,1) + zb1(ji-1,jj-1) * wght(ji,jj,1,1) ) * zusw * gtaux(ji,jj) 
    147             ztagny = ( zb2(ji,jj  ) * wght(ji,jj,2,2) + zb2(ji-1,jj  ) * wght(ji,jj,1,2)   & 
    148                &     + zb2(ji,jj-1) * wght(ji,jj,2,1) + zb2(ji-1,jj-1) * wght(ji,jj,1,1) ) * zusw * gtauy(ji,jj) 
    149 #endif 
    150132 
    151133            ! Gradient of ice strength 
     
    162144            ! Computation of the velocity field taking into account the ice-ice interaction.                                  
    163145            ! Terms that are independent of the velocity field. 
    164             za1ct(ji,jj) = ztagnx - zcorl(ji,jj) * v_oce(ji,jj) - zgphsx 
    165             za2ct(ji,jj) = ztagny + zcorl(ji,jj) * u_oce(ji,jj) - zgphsy 
     146            za1ct(ji,jj) = ztagnx - zcorl(ji,jj) * v_io(ji,jj) - zgphsx 
     147            za2ct(ji,jj) = ztagny + zcorl(ji,jj) * u_io(ji,jj) - zgphsy 
    166148         END DO 
    167149      END DO 
     
    403385               zsang  = SIGN( 1.e0, fcor(1,jj) ) * sangvg   ! only the sinus changes its sign with the hemisphere 
    404386               DO ji = 2, jpim1 
    405                  zur     = u_ice(ji,jj) - u_oce(ji,jj) 
    406                  zvr     = v_ice(ji,jj) - v_oce(ji,jj) 
     387                 zur     = u_ice(ji,jj) - u_io(ji,jj) 
     388                 zvr     = v_ice(ji,jj) - v_io(ji,jj) 
    407389                 zmod    = SQRT( zur * zur + zvr * zvr) * ( 1.0 - zfrld(ji,jj) ) 
    408390                 za      = rhoco * zmod 
     
    413395 
    414396                  za1(ji,jj) =  zmassdt * zu0(ji,jj) + zcorlal * zv0(ji,jj) + za1ct(ji,jj)   & 
    415                      &        + za * ( cangvg * u_oce(ji,jj) - zsang * v_oce(ji,jj) ) 
     397                     &        + za * ( cangvg * u_io(ji,jj) - zsang * v_io(ji,jj) ) 
    416398 
    417399                  za2(ji,jj) =  zmassdt * zv0(ji,jj) - zcorlal * zu0(ji,jj) + za2ct(ji,jj)   & 
    418                      &        + za * ( cangvg * v_oce(ji,jj) + zsang * u_oce(ji,jj) ) 
     400                     &        + za * ( cangvg * v_io(ji,jj) + zsang * u_io(ji,jj) ) 
    419401 
    420402                  zb1(ji,jj)  = zmassdt + zac - zc1u(ji,jj) 
Note: See TracChangeset for help on using the changeset viewer.