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

Changeset 4278


Ignore:
Timestamp:
2013-11-20T10:46:31+01:00 (10 years ago)
Author:
davestorkey
Message:

Add LIM3 BDY capability.

Location:
branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC
Files:
1 added
1 deleted
4 edited

Legend:

Unmodified
Added
Removed
  • branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC/BDY/bdy_oce.F90

    r4267 r4278  
    88   !!            3.3  !  2010-09  (D. Storkey) add ice boundary conditions 
    99   !!            3.4  !  2011     (D. Storkey) rewrite in preparation for OBC-BDY merge 
     10   !!            3.6  !  2012-01  (C. Rousset) add ice boundary conditions for lim3 
    1011   !!---------------------------------------------------------------------- 
    1112#if defined key_bdy  
     
    6263      REAL(wp), POINTER, DIMENSION(:)     ::  hicif 
    6364      REAL(wp), POINTER, DIMENSION(:)     ::  hsnif 
     65#elif defined key_lim3 
     66      LOGICAL                         ::  ll_a_i 
     67      LOGICAL                         ::  ll_ht_i 
     68      LOGICAL                         ::  ll_ht_s 
     69      REAL, POINTER, DIMENSION(:,:)   ::  a_i   !: now ice leads fraction climatology 
     70      REAL, POINTER, DIMENSION(:,:)   ::  ht_i  !: Now ice  thickness climatology 
     71      REAL, POINTER, DIMENSION(:,:)   ::  ht_s  !: now snow thickness 
    6472#endif 
    6573   END TYPE OBC_DATA 
  • branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC/BDY/bdydta.F90

    r4254 r4278  
    1111   !!            3.3  !  2010-09  (D.Storkey) add ice boundary conditions 
    1212   !!            3.4  !  2011     (D. Storkey) rewrite in preparation for OBC-BDY merge 
     13   !!            3.6  !  2012-01  (C. Rousset) add ice boundary conditions for lim3 
    1314   !!---------------------------------------------------------------------- 
    1415#if defined key_bdy 
     
    3233#if defined key_lim2 
    3334   USE ice_2 
     35#elif defined key_lim3 
     36   USE par_ice 
     37   USE ice 
     38   USE limcat_1D          ! redistribute ice input into categories 
    3439#endif 
    3540   USE sbcapr 
     
    5055 
    5156   TYPE(MAP_POINTER), ALLOCATABLE, DIMENSION(:) :: nbmap_ptr   ! array of pointers to nbmap 
     57 
     58#if defined key_lim3 
     59   LOGICAL :: ll_bdylim3                  ! determine whether ice input is lim2 (F) or lim3 (T) type 
     60   INTEGER :: jfld_hti, jfld_hts, jfld_ai ! indices of ice thickness, snow thickness and concentration in bf structure 
     61#endif 
    5262 
    5363#  include "domzgr_substitute.h90" 
     
    7888                                                        ! etc. 
    7989      !! 
    80       INTEGER     ::  ib_bdy, jfld, jstart, jend, ib, ii, ij, ik, igrd  ! local indices 
     90      INTEGER     ::  ib_bdy, jfld, jstart, jend, ib, ii, ij, ik, igrd, jl  ! local indices 
    8191      INTEGER,          DIMENSION(jpbgrd) ::   ilen1  
    8292      INTEGER, POINTER, DIMENSION(:)      ::   nblen, nblenrim  ! short cuts 
     
    213223                  END DO  
    214224               END IF 
     225            ENDIF 
     226#elif defined key_lim3 
     227            IF( nn_ice_lim_dta(ib_bdy) .eq. 0 ) THEN  
     228               ilen1(:) = nblen(:) 
     229               IF( dta%ll_a_i ) THEN 
     230                  igrd = 1    
     231                  DO jl = 1, jpl 
     232                     DO ib = 1, ilen1(igrd) 
     233                        ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     234                        ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     235                        dta_bdy(ib_bdy)%a_i (ib,jl) =  a_i(ii,ij,jl) * tmask(ii,ij,1)  
     236                     END DO 
     237                  END DO 
     238               ENDIF 
     239               IF( dta%ll_ht_i ) THEN 
     240                  igrd = 1    
     241                  DO jl = 1, jpl 
     242                     DO ib = 1, ilen1(igrd) 
     243                        ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     244                        ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     245                        dta_bdy(ib_bdy)%ht_i (ib,jl) =  ht_i(ii,ij,jl) * tmask(ii,ij,1)  
     246                     END DO 
     247                  END DO 
     248               ENDIF 
     249               IF( dta%ll_ht_s ) THEN 
     250                  igrd = 1    
     251                  DO jl = 1, jpl 
     252                     DO ib = 1, ilen1(igrd) 
     253                        ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     254                        ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     255                        dta_bdy(ib_bdy)%ht_s (ib,jl) =  ht_s(ii,ij,jl) * tmask(ii,ij,1)  
     256                     END DO 
     257                  END DO 
     258               ENDIF 
    215259            ENDIF 
    216260#endif 
     
    346390 
    347391               ENDIF 
     392#if defined key_lim3 
     393               IF( .NOT. ll_bdylim3 .AND. nn_ice_lim(ib_bdy) > 0 .AND. nn_ice_lim_dta(ib_bdy) == 1 ) THEN ! bdy ice input (case input is lim2 type) 
     394                CALL lim_cat_1D ( bf(jfld_hti)%fnow(:,1,1), bf(jfld_hts)%fnow(:,1,1), bf(jfld_ai)%fnow(:,1,1), & 
     395                                  & dta_bdy(ib_bdy)%ht_i,     dta_bdy(ib_bdy)%ht_s,     dta_bdy(ib_bdy)%a_i     ) 
     396               ENDIF 
     397#endif 
    348398            ENDIF 
    349399            jstart = jstart + dta%nread(1) 
     
    400450      INTEGER, POINTER, DIMENSION(:)         ::   nblen, nblenrim  ! short cuts 
    401451      TYPE(OBC_DATA), POINTER                ::   dta           ! short cut 
     452#if defined key_lim3 
     453      INTEGER, DIMENSION(3) ::   zdimsz   ! number of elements in each of the 4 dimensions (i.e. i,j,t,ice-cat) for an array 
     454      INTEGER               ::   zndims   ! number of dimensions in an array (i.e. 3 = wo ice cat; 4 = w ice cat) 
     455      INTEGER               ::   inum,id1 ! local integer 
     456#endif 
    402457      TYPE(FLD_N), ALLOCATABLE, DIMENSION(:) ::   blf_i         !  array of namelist information structures 
    403458      TYPE(FLD_N) ::   bn_tem, bn_sal, bn_u3d, bn_v3d   !  
     
    405460#if defined key_lim2 
    406461      TYPE(FLD_N) ::   bn_frld, bn_hicif, bn_hsnif      ! 
     462#elif defined key_lim3 
     463      TYPE(FLD_N) ::   bn_a_i, bn_ht_i, bn_ht_s       
    407464#endif 
    408465      NAMELIST/nambdy_dta/ cn_dir, bn_tem, bn_sal, bn_u3d, bn_v3d, bn_ssh, bn_u2d, bn_v2d  
    409466#if defined key_lim2 
    410467      NAMELIST/nambdy_dta/ bn_frld, bn_hicif, bn_hsnif 
     468#elif defined key_lim3 
     469      NAMELIST/nambdy_dta/ bn_a_i, bn_ht_i, bn_ht_s 
    411470#endif 
    412471      NAMELIST/nambdy_dta/ ln_full_vel 
     
    425484                               ,nn_dyn3d_dta(ib_bdy)       & 
    426485                               ,nn_tra_dta(ib_bdy)         & 
    427 #if defined key_lim2 
    428                                ,nn_ice_lim2_dta(ib_bdy)    & 
     486#if ( defined key_lim2 || defined key_lim3 ) 
     487                              ,nn_ice_lim_dta(ib_bdy)    & 
    429488#endif 
    430489                              ) 
     
    446505            nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 2 
    447506         ENDIF 
    448 #if defined key_lim2 
    449          IF( cn_ice_lim2(ib_bdy) /= 'none' .and. nn_ice_lim2_dta(ib_bdy) .eq. 1  ) THEN 
     507#if ( defined key_lim2 || defined key_lim3 ) 
     508         IF( cn_ice_lim(ib_bdy) /= 'none' .and. nn_ice_lim_dta(ib_bdy) .eq. 1  ) THEN 
    450509            nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 3 
    451510         ENDIF 
     
    495554            bn_hicif   = FLD_N(  'bdy_hicif'   ,  24   , 'iicethic' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
    496555            bn_hsnif   = FLD_N(  'bdy_hsnif'   ,  24   , 'isnothic' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
     556#elif defined key_lim3 
     557            bn_a_i  = FLD_N(  'bdy_a_i'     ,  24   , 'ileadfra' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
     558            bn_ht_i = FLD_N(  'bdy_ht_i'    ,  24   , 'iicethic' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
     559            bn_ht_s = FLD_N(  'bdy_ht_s'    ,  24   , 'isnowthi' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
    497560#endif 
    498561 
     
    633696 
    634697            ENDIF 
     698#elif defined key_lim3 
     699            ! sea ice 
     700            IF( nn_ice_lim_dta(ib_bdy) .eq. 1 ) THEN 
     701 
     702               ! Test for types of ice input (lim2 or lim3)  
     703               CALL iom_open ( bn_a_i%clname, inum ) 
     704               id1 = iom_varid ( inum, bn_a_i%clvar, kdimsz=zdimsz, kndims=zndims, ldstop = .FALSE. ) 
     705               CALL iom_close ( inum ) 
     706               !CALL fld_clopn ( bn_a_i, nyear, nmonth, nday, ldstop=.TRUE. ) 
     707               !CALL iom_open ( bn_a_i %clname, inum ) 
     708               !id1 = iom_varid ( bn_a_i%num, bn_a_i%clvar, kdimsz=zdimsz, kndims=zndims, ldstop = .FALSE. ) 
     709                IF ( zndims == 4 ) THEN 
     710                 ll_bdylim3 = .TRUE.   ! lim3 input 
     711               ELSE 
     712                 ll_bdylim3 = .FALSE.  ! lim2 input       
     713               ENDIF 
     714               ! End test 
     715 
     716               IF( dta%ll_a_i ) THEN 
     717                  jfld = jfld + 1 
     718                  blf_i(jfld) = bn_a_i 
     719                  ibdy(jfld) = ib_bdy 
     720                  igrid(jfld) = 1 
     721                  ilen1(jfld) = nblen(igrid(jfld)) 
     722                  IF ( ll_bdylim3 ) THEN ; ilen3(jfld)=jpl ; ELSE ; ilen3(jfld)=1 ; ENDIF 
     723               ENDIF 
     724 
     725               IF( dta%ll_ht_i ) THEN 
     726                  jfld = jfld + 1 
     727                  blf_i(jfld) = bn_ht_i 
     728                  ibdy(jfld) = ib_bdy 
     729                  igrid(jfld) = 1 
     730                  ilen1(jfld) = nblen(igrid(jfld)) 
     731                  IF ( ll_bdylim3 ) THEN ; ilen3(jfld)=jpl ; ELSE ; ilen3(jfld)=1 ; ENDIF 
     732               ENDIF 
     733 
     734               IF( dta%ll_ht_s ) THEN 
     735                  jfld = jfld + 1 
     736                   blf_i(jfld) = bn_ht_s 
     737                  ibdy(jfld) = ib_bdy 
     738                  igrid(jfld) = 1 
     739                  ilen1(jfld) = nblen(igrid(jfld)) 
     740                  IF ( ll_bdylim3 ) THEN ; ilen3(jfld)=jpl ; ELSE ; ilen3(jfld)=1 ; ENDIF 
     741               ENDIF 
     742 
    635743#endif 
    636744            ! Recalculate field counts 
     
    758866 
    759867#if defined key_lim2 
    760          IF (nn_ice_lim2(ib_bdy) .gt. 0) THEN 
     868         IF (nn_ice_lim(ib_bdy) .gt. 0) THEN 
    761869            IF( nn_ice_lim2_dta(ib_bdy) .eq. 0 ) THEN 
    762870               ALLOCATE( dta_bdy(ib_bdy)%frld(nblen(1)) ) 
     
    770878               jfld = jfld + 1 
    771879               dta_bdy(ib_bdy)%hsnif => bf(jfld)%fnow(:,1,1) 
     880            ENDIF 
     881         ENDIF 
     882#elif defined key_lim3 
     883         IF (nn_ice_lim(ib_bdy) .gt. 0) THEN 
     884            IF( nn_ice_lim_dta(ib_bdy) .eq. 0 ) THEN 
     885               ALLOCATE( dta_bdy(ib_bdy)%a_i (nblen(1),jpl) ) 
     886               ALLOCATE( dta_bdy(ib_bdy)%ht_i(nblen(1),jpl) ) 
     887               ALLOCATE( dta_bdy(ib_bdy)%ht_s(nblen(1),jpl) ) 
     888            ELSE 
     889               IF ( ll_bdylim3 ) THEN ! case input is lim3 type 
     890                  jfld = jfld + 1 
     891                  dta_bdy(ib_bdy)%a_i  => bf(jfld)%fnow(:,1,:) 
     892                  jfld = jfld + 1 
     893                  dta_bdy(ib_bdy)%ht_i => bf(jfld)%fnow(:,1,:) 
     894                  jfld = jfld + 1 
     895                  dta_bdy(ib_bdy)%ht_s => bf(jfld)%fnow(:,1,:) 
     896               ELSE ! case input is lim2 type 
     897                  jfld_ai  = jfld + 1 
     898                  jfld_hti = jfld + 2 
     899                  jfld_hts = jfld + 3 
     900                  jfld     = jfld + 3 
     901                  ALLOCATE( dta_bdy(ib_bdy)%a_i (nblen(1),jpl) ) 
     902                  ALLOCATE( dta_bdy(ib_bdy)%ht_i(nblen(1),jpl) ) 
     903                  ALLOCATE( dta_bdy(ib_bdy)%ht_s(nblen(1),jpl) ) 
     904                  dta_bdy(ib_bdy)%a_i (:,:) = 0.0 
     905                  dta_bdy(ib_bdy)%ht_i(:,:) = 0.0 
     906                  dta_bdy(ib_bdy)%ht_s(:,:) = 0.0 
     907               ENDIF 
     908 
    772909            ENDIF 
    773910         ENDIF 
  • branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC/BDY/bdyini.F90

    r4254 r4278  
    100100         &             cn_dyn3d, nn_dyn3d_dta, cn_tra, nn_tra_dta,             &   
    101101         &             ln_tra_dmp, ln_dyn3d_dmp, rn_time_dmp, rn_time_dmp_out, & 
    102 #if defined key_lim2 
    103          &             cn_ice_lim2, nn_ice_lim2_dta,                           & 
     102#if ( defined key_lim2 || defined key_lim3 ) 
     103         &             cn_ice_lim, nn_ice_lim_dta,                           & 
    104104#endif 
    105105         &             ln_vol, nn_volctl, nn_rimwidth 
     
    141141      ln_dyn3d_dmp(:)   = .false. 
    142142      rn_time_dmp(:)    = 1. 
    143 #if defined key_lim2 
    144       cn_ice_lim2(:)    = '' 
    145       nn_ice_lim2_dta(:)= -1  ! uninitialised flag 
     143#if ( defined key_lim2 || defined key_lim3 ) 
     144      cn_ice_lim(:)    = '' 
     145      nn_ice_lim_dta(:)= -1  ! uninitialised flag 
    146146#endif 
    147147      ln_vol            = .false. 
     
    333333#if defined key_lim2 
    334334        IF(lwp) WRITE(numout,*) 'Boundary conditions for sea ice:  ' 
    335         SELECT CASE( cn_ice_lim2(ib_bdy) )                   
     335        SELECT CASE( cn_ice_lim(ib_bdy) )                   
    336336          CASE('none') 
    337337             IF(lwp) WRITE(numout,*) '      no open boundary condition'         
     
    344344             dta_bdy(ib_bdy)%ll_hicif = .true. 
    345345             dta_bdy(ib_bdy)%ll_hsnif = .true. 
    346           CASE DEFAULT   ;   CALL ctl_stop( 'unrecognised value for cn_ice_lim2' ) 
     346          CASE DEFAULT   ;   CALL ctl_stop( 'unrecognised value for cn_ice_lim' ) 
    347347        END SELECT 
    348         IF( cn_ice_lim2(ib_bdy) /= 'none' ) THEN  
    349            SELECT CASE( nn_ice_lim2_dta(ib_bdy) )                   !  
     348        IF( cn_ice_lim(ib_bdy) /= 'none' ) THEN  
     349           SELECT CASE( nn_ice_lim_dta(ib_bdy) )                   !  
    350350              CASE( 0 )      ;   IF(lwp) WRITE(numout,*) '      initial state used for bdy data'         
    351351              CASE( 1 )      ;   IF(lwp) WRITE(numout,*) '      boundary data taken from file' 
    352               CASE DEFAULT   ;   CALL ctl_stop( 'nn_ice_lim2_dta must be 0 or 1' ) 
     352              CASE DEFAULT   ;   CALL ctl_stop( 'nn_ice_lim_dta must be 0 or 1' ) 
     353           END SELECT 
     354        ENDIF 
     355        IF(lwp) WRITE(numout,*) 
     356#elif defined key_lim3 
     357        IF(lwp) WRITE(numout,*) 'Boundary conditions for sea ice:  ' 
     358        SELECT CASE( cn_ice_lim(ib_bdy) )                   
     359          CASE('none') 
     360             IF(lwp) WRITE(numout,*) '      no open boundary condition'         
     361             dta_bdy(ib_bdy)%ll_a_i  = .false. 
     362             dta_bdy(ib_bdy)%ll_ht_i = .false. 
     363             dta_bdy(ib_bdy)%ll_ht_s = .false. 
     364          CASE('frs') 
     365             IF(lwp) WRITE(numout,*) '      Flow Relaxation Scheme' 
     366             dta_bdy(ib_bdy)%ll_a_i  = .true. 
     367             dta_bdy(ib_bdy)%ll_ht_i = .true. 
     368             dta_bdy(ib_bdy)%ll_ht_s = .true. 
     369          CASE DEFAULT   ;   CALL ctl_stop( 'unrecognised value for cn_ice_lim' ) 
     370        END SELECT 
     371        IF( cn_ice_lim(ib_bdy) /= 'none' ) THEN  
     372           SELECT CASE( nn_ice_lim_dta(ib_bdy) )                   !  
     373              CASE( 0 )      ;   IF(lwp) WRITE(numout,*) '      initial state used for bdy data'         
     374              CASE( 1 )      ;   IF(lwp) WRITE(numout,*) '      boundary data taken from file' 
     375              CASE DEFAULT   ;   CALL ctl_stop( 'nn_ice_lim_dta must be 0 or 1' ) 
    353376           END SELECT 
    354377        ENDIF 
  • branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC/step.F90

    r4258 r4278  
    8989      ! Update data, open boundaries, surface boundary condition (including sea-ice) 
    9090      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    91                          CALL sbc     ( kstp )        ! Sea Boundary Condition (including sea-ice) 
    9291      IF( lk_tide    )   CALL sbc_tide( kstp ) 
    9392      IF( lk_obc     )   CALL obc_dta ( kstp )        ! update dynamic and tracer data at open boundaries 
     
    9594      IF( lk_bdy     )   CALL bdy_dta ( kstp, time_offset=+1 )   ! update dynamic & tracer data at open boundaries 
    9695 
     96                         CALL sbc    ( kstp )         ! Sea Boundary Condition (including sea-ice) 
     97                                                      ! clem: moved here for bdy ice purpose 
    9798      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
    9899      !  Ocean dynamics : hdiv, rot, ssh, e3, wn 
Note: See TracChangeset for help on using the changeset viewer.