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 4332 for branches/2013/dev_r4028_CNRS_LIM3/NEMOGCM/NEMO/OPA_SRC/BDY/bdydta.F90 – NEMO

Ignore:
Timestamp:
2013-12-11T15:38:42+01:00 (11 years ago)
Author:
clem
Message:

update LIM3 to fix remaining bugs. Now working in global and regional config.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2013/dev_r4028_CNRS_LIM3/NEMOGCM/NEMO/OPA_SRC/BDY/bdydta.F90

    r3909 r4332  
    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   !!             -   !  2012-01  (C. Rousset) add ice boundary conditions for lim3 
    1314   !!---------------------------------------------------------------------- 
    1415#if defined key_bdy 
     
    3132#if defined key_lim2 
    3233   USE ice_2 
     34#elif defined key_lim3 
     35   USE par_ice 
     36   USE ice 
     37   USE limcat_1D          ! redistribute ice input into categories 
    3338#endif 
    3439   USE sbcapr 
     
    4954 
    5055   TYPE(MAP_POINTER), ALLOCATABLE, DIMENSION(:) :: nbmap_ptr   ! array of pointers to nbmap 
     56 
     57#if defined key_lim3 
     58   LOGICAL :: ll_bdylim3                  ! determine whether ice input is lim2 (F) or lim3 (T) type 
     59   INTEGER :: jfld_hti, jfld_hts, jfld_ai ! indices of ice thickness, snow thickness and concentration in bf structure 
     60#endif 
    5161 
    5262#  include "domzgr_substitute.h90" 
     
    7787                                                        ! etc. 
    7888      !! 
    79       INTEGER     ::  ib_bdy, jfld, jstart, jend, ib, ii, ij, ik, igrd  ! local indices 
     89      INTEGER     ::  ib_bdy, jfld, jstart, jend, ib, ii, ij, ik, igrd, jl  ! local indices 
    8090      INTEGER,          DIMENSION(jpbgrd) ::   ilen1  
    8191      INTEGER, POINTER, DIMENSION(:)      ::   nblen, nblenrim  ! short cuts 
     
    164174 
    165175#if defined key_lim2 
    166             IF( nn_ice_lim2(ib_bdy) .gt. 0 .and. nn_ice_lim2_dta(ib_bdy) .eq. 0 ) THEN  
     176            IF( nn_ice_lim(ib_bdy) .gt. 0 .and. nn_ice_lim_dta(ib_bdy) .eq. 0 ) THEN  
    167177               ilen1(:) = nblen(:) 
    168178               igrd = 1                       ! Everything is at T-points here 
     
    170180                  ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    171181                  ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    172                   dta_bdy(ib_bdy)%frld(ib) = frld(ii,ij) * tmask(ii,ij,1)          
     182                  dta_bdy(ib_bdy)%frld (ib) = frld(ii,ij) * tmask(ii,ij,1)          
    173183                  dta_bdy(ib_bdy)%hicif(ib) = hicif(ii,ij) * tmask(ii,ij,1)          
    174184                  dta_bdy(ib_bdy)%hsnif(ib) = hsnif(ii,ij) * tmask(ii,ij,1)          
    175185               END DO  
     186            ENDIF 
     187#elif defined key_lim3 
     188            IF( nn_ice_lim(ib_bdy) .gt. 0 .and. nn_ice_lim_dta(ib_bdy) .eq. 0 ) THEN  
     189               ilen1(:) = nblen(:) 
     190               igrd = 1                       ! Everything is at T-points here 
     191               DO jl = 1, jpl 
     192                  DO ib = 1, ilen1(igrd) 
     193                     ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     194                     ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     195                     dta_bdy(ib_bdy)%a_i (ib,jl) =  a_i(ii,ij,jl) * tmask(ii,ij,1)  
     196                     dta_bdy(ib_bdy)%ht_i(ib,jl) = ht_i(ii,ij,jl) * tmask(ii,ij,1)  
     197                     dta_bdy(ib_bdy)%ht_s(ib,jl) = ht_s(ii,ij,jl) * tmask(ii,ij,1)  
     198                  END DO 
     199               END DO 
    176200            ENDIF 
    177201#endif 
     
    319343                  ENDIF 
    320344               ENDIF 
     345#if defined key_lim3 
     346               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) 
     347                CALL lim_cat_1D ( bf(jfld_hti)%fnow(:,1,1), bf(jfld_hts)%fnow(:,1,1), bf(jfld_ai)%fnow(:,1,1), & 
     348                                  & dta_bdy(ib_bdy)%ht_i,     dta_bdy(ib_bdy)%ht_s,     dta_bdy(ib_bdy)%a_i     ) 
     349               ENDIF 
     350#endif 
     351 
    321352            ENDIF 
    322353            jstart = jend+1 
     
    366397      INTEGER, ALLOCATABLE, DIMENSION(:)     ::   igrid         ! index for grid type (1,2,3 = T,U,V) 
    367398      INTEGER, POINTER, DIMENSION(:)         ::   nblen, nblenrim  ! short cuts 
     399#if defined key_lim3 
     400      INTEGER, DIMENSION(3) ::   zdimsz   ! number of elements in each of the 4 dimensions (i.e. i,j,t,ice-cat) for an array 
     401      INTEGER               ::   zndims   ! number of dimensions in an array (i.e. 3 = wo ice cat; 4 = w ice cat) 
     402      INTEGER               ::   inum,id1 ! local integer 
     403#endif 
    368404      TYPE(FLD_N), ALLOCATABLE, DIMENSION(:) ::   blf_i         !  array of namelist information structures 
    369405      TYPE(FLD_N) ::   bn_tem, bn_sal, bn_u3d, bn_v3d   !  
    370406      TYPE(FLD_N) ::   bn_ssh, bn_u2d, bn_v2d           ! informations about the fields to be read 
    371407#if defined key_lim2 
    372       TYPE(FLD_N) ::   bn_frld, bn_hicif, bn_hsnif      ! 
     408      TYPE(FLD_N) ::   bn_frld, bn_hicif, bn_hsnif       
     409#elif defined key_lim3 
     410      TYPE(FLD_N) ::   bn_a_i, bn_ht_i, bn_ht_s       
    373411#endif 
    374412      NAMELIST/nambdy_dta/ cn_dir, bn_tem, bn_sal, bn_u3d, bn_v3d, bn_ssh, bn_u2d, bn_v2d  
    375413#if defined key_lim2 
    376414      NAMELIST/nambdy_dta/ bn_frld, bn_hicif, bn_hsnif 
     415#elif defined key_lim3 
     416      NAMELIST/nambdy_dta/ bn_a_i, bn_ht_i, bn_ht_s 
    377417#endif 
    378418      NAMELIST/nambdy_dta/ ln_full_vel 
     
    388428      ! Set nn_dta 
    389429      DO ib_bdy = 1, nb_bdy 
    390          nn_dta(ib_bdy) = MAX(  nn_dyn2d_dta(ib_bdy)       & 
    391                                ,nn_dyn3d_dta(ib_bdy)       & 
    392                                ,nn_tra_dta(ib_bdy)         & 
    393 #if defined key_lim2 
    394                                ,nn_ice_lim2_dta(ib_bdy)    & 
     430         nn_dta(ib_bdy) = MAX( nn_dyn2d_dta(ib_bdy)       & 
     431                              ,nn_dyn3d_dta(ib_bdy)       & 
     432                              ,nn_tra_dta(ib_bdy)         & 
     433#if ( defined key_lim2 || defined key_lim3 ) 
     434                              ,nn_ice_lim_dta(ib_bdy)    & 
    395435#endif 
    396436                              ) 
     
    412452            nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 2 
    413453         ENDIF 
    414 #if defined key_lim2 
    415          IF( nn_ice_lim2(ib_bdy) .gt. 0 .and. nn_ice_lim2_dta(ib_bdy) .eq. 1  ) THEN 
     454#if ( defined key_lim2 || defined key_lim3 ) 
     455         IF( nn_ice_lim(ib_bdy) .gt. 0 .and. nn_ice_lim_dta(ib_bdy) .eq. 1  ) THEN 
    416456            nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 3 
    417457         ENDIF 
     
    448488            ln_full_vel = .false. 
    449489            ! ... default values (NB: frequency positive => hours, negative => months) 
    450             !                    !  file       ! frequency !  variable   ! time intep !  clim   ! 'yearly' or ! weights  ! rotation  ! 
    451             !                    !  name       ! hours !   name     !  (T/F)  !  (T/F)  !  'monthly'  ! filename ! pairs     ! 
    452             bn_ssh     = FLD_N(  'bdy_ssh'     ,  24   , 'sossheig' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
    453             bn_u2d     = FLD_N(  'bdy_vel2d_u' ,  24   , 'vobtcrtx' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
    454             bn_v2d     = FLD_N(  'bdy_vel2d_v' ,  24   , 'vobtcrty' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
    455             bn_u3d     = FLD_N(  'bdy_vel3d_u' ,  24   , 'vozocrtx' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
    456             bn_v3d     = FLD_N(  'bdy_vel3d_v' ,  24   , 'vomecrty' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
    457             bn_tem     = FLD_N(  'bdy_tem'     ,  24   , 'votemper' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
    458             bn_sal     = FLD_N(  'bdy_sal'     ,  24   , 'vosaline' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
     490            !                 !  file       ! frequency !  variable  ! time intep !  clim   ! 'yearly' or ! weights  ! rotation  ! 
     491            !                 !  name       ! hours     !   name     !  (T/F)     !  (T/F)  !  'monthly'  ! filename ! pairs     ! 
     492            bn_ssh   = FLD_N(  'bdy_ssh'     ,  24      , 'sossheig' , .false.    , .false. ,   'yearly'  , ''       , ''        ) 
     493            bn_u2d   = FLD_N(  'bdy_vel2d_u' ,  24      , 'vobtcrtx' , .false.    , .false. ,   'yearly'  , ''       , ''        ) 
     494            bn_v2d   = FLD_N(  'bdy_vel2d_v' ,  24      , 'vobtcrty' , .false.    , .false. ,   'yearly'  , ''       , ''        ) 
     495            bn_u3d   = FLD_N(  'bdy_vel3d_u' ,  24      , 'vozocrtx' , .false.    , .false. ,   'yearly'  , ''       , ''        ) 
     496            bn_v3d   = FLD_N(  'bdy_vel3d_v' ,  24      , 'vomecrty' , .false.    , .false. ,   'yearly'  , ''       , ''        ) 
     497            bn_tem   = FLD_N(  'bdy_tem'     ,  24      , 'votemper' , .false.    , .false. ,   'yearly'  , ''       , ''        ) 
     498            bn_sal   = FLD_N(  'bdy_sal'     ,  24      , 'vosaline' , .false.    , .false. ,   'yearly'  , ''       , ''        ) 
    459499#if defined key_lim2 
    460             bn_frld    = FLD_N(  'bdy_frld'    ,  24   , 'ildsconc' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
    461             bn_hicif   = FLD_N(  'bdy_hicif'   ,  24   , 'iicethic' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
    462             bn_hsnif   = FLD_N(  'bdy_hsnif'   ,  24   , 'isnothic' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
     500            bn_frld  = FLD_N(  'bdy_frld'    ,  24      , 'ildsconc' , .false.    , .false. ,   'yearly'  , ''       , ''        ) 
     501            bn_hicif = FLD_N(  'bdy_hicif'   ,  24      , 'iicethic' , .false.    , .false. ,   'yearly'  , ''       , ''        ) 
     502            bn_hsnif = FLD_N(  'bdy_hsnif'   ,  24      , 'isnothic' , .false.    , .false. ,   'yearly'  , ''       , ''        ) 
     503#elif defined key_lim3 
     504            bn_a_i  = FLD_N(  'bdy_a_i'     ,  24   , 'ileadfra' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
     505            bn_ht_i = FLD_N(  'bdy_ht_i'    ,  24   , 'iicethic' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
     506            bn_ht_s = FLD_N(  'bdy_ht_s'    ,  24   , 'isnowthi' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
    463507#endif 
    464508 
     
    545589#if defined key_lim2 
    546590            ! sea ice 
    547             IF( nn_ice_lim2(ib_bdy) .gt. 0 .and. nn_ice_lim2_dta(ib_bdy) .eq. 1 ) THEN 
     591            IF( nn_ice_lim(ib_bdy) .gt. 0 .and. nn_ice_lim_dta(ib_bdy) .eq. 1 ) THEN 
    548592 
    549593               jfld = jfld + 1 
     
    567611               ilen1(jfld) = nblen(igrid(jfld)) 
    568612               ilen3(jfld) = 1 
     613 
     614            ENDIF 
     615#elif defined key_lim3 
     616            ! sea ice 
     617            IF( nn_ice_lim(ib_bdy) .gt. 0 .and. nn_ice_lim_dta(ib_bdy) .eq. 1 ) THEN 
     618 
     619               ! Test for types of ice input (lim2 or lim3)  
     620               CALL iom_open ( bn_a_i%clname, inum ) 
     621               id1 = iom_varid ( inum, bn_a_i%clvar, kdimsz=zdimsz, kndims=zndims, ldstop = .FALSE. ) 
     622               CALL iom_close ( inum ) 
     623               !CALL fld_clopn ( bn_a_i, nyear, nmonth, nday, ldstop=.TRUE. ) 
     624               !CALL iom_open ( bn_a_i%clname, inum ) 
     625               !id1 = iom_varid ( bn_a_i%num, bn_a_i%clvar, kdimsz=zdimsz, kndims=zndims, ldstop = .FALSE. ) 
     626                IF ( zndims == 4 ) THEN 
     627                 ll_bdylim3 = .TRUE.   ! lim3 input 
     628               ELSE 
     629                 ll_bdylim3 = .FALSE.  ! lim2 input       
     630               ENDIF 
     631               ! End test 
     632 
     633               jfld = jfld + 1 
     634               blf_i(jfld) = bn_a_i 
     635               ibdy(jfld) = ib_bdy 
     636               igrid(jfld) = 1 
     637               ilen1(jfld) = nblen(igrid(jfld)) 
     638               IF ( ll_bdylim3 ) THEN ; ilen3(jfld)=jpl ; ELSE ; ilen3(jfld)=1 ; ENDIF 
     639 
     640               jfld = jfld + 1 
     641               blf_i(jfld) = bn_ht_i 
     642               ibdy(jfld) = ib_bdy 
     643               igrid(jfld) = 1 
     644               ilen1(jfld) = nblen(igrid(jfld)) 
     645               IF ( ll_bdylim3 ) THEN ; ilen3(jfld)=jpl ; ELSE ; ilen3(jfld)=1 ; ENDIF 
     646 
     647               jfld = jfld + 1 
     648               blf_i(jfld) = bn_ht_s 
     649               ibdy(jfld) = ib_bdy 
     650               igrid(jfld) = 1 
     651               ilen1(jfld) = nblen(igrid(jfld)) 
     652               IF ( ll_bdylim3 ) THEN ; ilen3(jfld)=jpl ; ELSE ; ilen3(jfld)=1 ; ENDIF 
    569653 
    570654            ENDIF 
     
    662746 
    663747#if defined key_lim2 
    664          IF (nn_ice_lim2(ib_bdy) .gt. 0) THEN 
    665             IF( nn_ice_lim2_dta(ib_bdy) .eq. 0 ) THEN 
     748         IF (nn_ice_lim(ib_bdy) .gt. 0) THEN 
     749            IF( nn_ice_lim_dta(ib_bdy) .eq. 0 ) THEN 
    666750               ilen0(1:3) = nblen(1:3) 
    667751               ALLOCATE( dta_bdy(ib_bdy)%frld(ilen0(1)) ) 
     
    675759               jfld = jfld + 1 
    676760               dta_bdy(ib_bdy)%hsnif => bf(jfld)%fnow(:,1,1) 
     761            ENDIF 
     762         ENDIF 
     763#elif defined key_lim3 
     764         IF (nn_ice_lim(ib_bdy) .gt. 0) THEN 
     765            ilen0(1:3) = nblen(1:3) 
     766            IF( nn_ice_lim_dta(ib_bdy) .eq. 0 ) THEN 
     767               ALLOCATE( dta_bdy(ib_bdy)%a_i (ilen0(1),jpl) ) 
     768               ALLOCATE( dta_bdy(ib_bdy)%ht_i(ilen0(1),jpl) ) 
     769               ALLOCATE( dta_bdy(ib_bdy)%ht_s(ilen0(1),jpl) ) 
     770            ELSE 
     771               IF ( ll_bdylim3 ) THEN ! case input is lim3 type 
     772                  jfld = jfld + 1 
     773                  dta_bdy(ib_bdy)%a_i  => bf(jfld)%fnow(:,1,:) 
     774                  jfld = jfld + 1 
     775                  dta_bdy(ib_bdy)%ht_i => bf(jfld)%fnow(:,1,:) 
     776                  jfld = jfld + 1 
     777                  dta_bdy(ib_bdy)%ht_s => bf(jfld)%fnow(:,1,:) 
     778               ELSE ! case input is lim2 type 
     779                  jfld_ai  = jfld + 1 
     780                  jfld_hti = jfld + 2 
     781                  jfld_hts = jfld + 3 
     782                  jfld     = jfld + 3 
     783                  ALLOCATE( dta_bdy(ib_bdy)%a_i (ilen0(1),jpl) ) 
     784                  ALLOCATE( dta_bdy(ib_bdy)%ht_i(ilen0(1),jpl) ) 
     785                  ALLOCATE( dta_bdy(ib_bdy)%ht_s(ilen0(1),jpl) ) 
     786                  dta_bdy(ib_bdy)%a_i (:,:) = 0.0 
     787                  dta_bdy(ib_bdy)%ht_i(:,:) = 0.0 
     788                  dta_bdy(ib_bdy)%ht_s(:,:) = 0.0 
     789               ENDIF 
     790 
    677791            ENDIF 
    678792         ENDIF 
Note: See TracChangeset for help on using the changeset viewer.