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

Ignore:
Timestamp:
2013-06-26T09:54:16+02:00 (11 years ago)
Author:
flavoni
Message:

dev_r3406_CNRS_LIM3: update LIM3, see ticket #1116

File:
1 edited

Legend:

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

    r3294 r3938  
    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 
     
    4853 
    4954   TYPE(MAP_POINTER), ALLOCATABLE, DIMENSION(:) :: nbmap_ptr   ! array of pointers to nbmap 
     55 
     56#if defined key_lim3 
     57   LOGICAL :: ll_bdylim3                  ! determine whether ice input is lim2 (F) or lim3 (T) type 
     58   INTEGER :: jfld_hti, jfld_hts, jfld_ai ! indices of ice thickness, snow thickness and concentration in bf structure 
     59#endif 
    5060 
    5161#  include "domzgr_substitute.h90" 
     
    7686                                                        ! etc. 
    7787      !! 
    78       INTEGER     ::  ib_bdy, jfld, jstart, jend, ib, ii, ij, ik, igrd  ! local indices 
     88      INTEGER     ::  ib_bdy, jfld, jstart, jend, ib, ii, ij, ik, igrd, jl  ! local indices 
    7989      INTEGER,          DIMENSION(jpbgrd) ::   ilen1  
    8090      INTEGER, POINTER, DIMENSION(:)      ::   nblen, nblenrim  ! short cuts 
     
    175185 
    176186#if defined key_lim2 
    177             IF( nn_ice_lim2(ib_bdy) .gt. 0 .and. nn_ice_lim2_dta(ib_bdy) .eq. 0 ) THEN  
    178                IF( nn_ice_lim2(ib_bdy) .eq. jp_frs ) THEN 
     187            IF( nn_ice_lim(ib_bdy) .gt. 0 .and. nn_ice_lim_dta(ib_bdy) .eq. 0 ) THEN  
     188               IF( nn_ice_lim(ib_bdy) .eq. jp_frs ) THEN 
    179189                  ilen1(:) = nblen(:) 
    180190               ELSE 
     
    185195                  ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    186196                  ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    187                   dta_bdy(ib_bdy)%frld(ib) = frld(ii,ij) * tmask(ii,ij,1)          
     197                  dta_bdy(ib_bdy)%frld (ib) = frld(ii,ij) * tmask(ii,ij,1)          
    188198                  dta_bdy(ib_bdy)%hicif(ib) = hicif(ii,ij) * tmask(ii,ij,1)          
    189199                  dta_bdy(ib_bdy)%hsnif(ib) = hsnif(ii,ij) * tmask(ii,ij,1)          
    190200               END DO  
     201            ENDIF 
     202#elif defined key_lim3 
     203            IF( nn_ice_lim(ib_bdy) .gt. 0 .and. nn_ice_lim_dta(ib_bdy) .eq. 0 ) THEN  
     204               IF( nn_ice_lim(ib_bdy) .eq. jp_frs ) THEN 
     205                  ilen1(:) = nblen(:) 
     206               ELSE 
     207                  ilen1(:) = nblenrim(:) 
     208               ENDIF 
     209               igrd = 1                       ! Everything is at T-points here 
     210               DO jl = 1, jpl 
     211                  DO ib = 1, ilen1(igrd) 
     212                     ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     213                     ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     214                     dta_bdy(ib_bdy)%a_i (ib,jl) =  a_i(ii,ij,jl) * tmask(ii,ij,1)  
     215                     dta_bdy(ib_bdy)%ht_i(ib,jl) = ht_i(ii,ij,jl) * tmask(ii,ij,1)  
     216                     dta_bdy(ib_bdy)%ht_s(ib,jl) = ht_s(ii,ij,jl) * tmask(ii,ij,1)  
     217                  END DO 
     218               END DO 
    191219            ENDIF 
    192220#endif 
     
    237265                  CALL tide_update( kt=kt, idx=idx_bdy(ib_bdy), dta=dta_bdy(ib_bdy), td=tides(ib_bdy), time_offset=time_offset ) 
    238266               ENDIF 
     267 
     268#if defined key_lim3 
     269               IF( nn_ice_lim(ib_bdy) .gt. 0 .and. nn_ice_lim_dta(ib_bdy) .eq. 1 ) THEN ! bdy ice input 
     270                IF ( .NOT. ll_bdylim3 ) THEN ! case input is lim2 type 
     271                   CALL lim_cat_1D ( bf(jfld_hti)%fnow(:,1,1), bf(jfld_hts)%fnow(:,1,1), bf(jfld_ai)%fnow(:,1,1), & 
     272                                     & dta_bdy(ib_bdy)%ht_i,     dta_bdy(ib_bdy)%ht_s,     dta_bdy(ib_bdy)%a_i     ) 
     273                ENDIF 
     274               ENDIF 
     275#endif 
     276 
    239277            ENDIF 
    240278            jstart = jend+1 
     
    311349      INTEGER, ALLOCATABLE, DIMENSION(:)     ::   igrid         ! index for grid type (1,2,3 = T,U,V) 
    312350      INTEGER, POINTER, DIMENSION(:)         ::   nblen, nblenrim  ! short cuts 
     351#if defined key_lim3 
     352      INTEGER, DIMENSION(3) ::   zdimsz   ! number of elements in each of the 4 dimensions (i.e. i,j,t,ice-cat) for an array 
     353      INTEGER               ::   zndims   ! number of dimensions in an array (i.e. 3 = wo ice cat; 4 = w ice cat) 
     354      INTEGER               ::   inum,id1 ! local integer 
     355#endif 
    313356      TYPE(FLD_N), ALLOCATABLE, DIMENSION(:) ::   blf_i         !  array of namelist information structures 
    314357      TYPE(FLD_N) ::   bn_tem, bn_sal, bn_u3d, bn_v3d   !  
    315358      TYPE(FLD_N) ::   bn_ssh, bn_u2d, bn_v2d           ! informations about the fields to be read 
    316359#if defined key_lim2 
    317       TYPE(FLD_N) ::   bn_frld, bn_hicif, bn_hsnif      ! 
     360      TYPE(FLD_N) ::   bn_frld, bn_hicif, bn_hsnif       
     361#elif defined key_lim3 
     362      TYPE(FLD_N) ::   bn_a_i, bn_ht_i, bn_ht_s       
    318363#endif 
    319364      NAMELIST/nambdy_dta/ cn_dir, bn_tem, bn_sal, bn_u3d, bn_v3d, bn_ssh, bn_u2d, bn_v2d  
    320365#if defined key_lim2 
    321366      NAMELIST/nambdy_dta/ bn_frld, bn_hicif, bn_hsnif 
     367#elif defined key_lim3 
     368      NAMELIST/nambdy_dta/ bn_a_i, bn_ht_i, bn_ht_s 
    322369#endif 
    323370      NAMELIST/nambdy_dta/ ln_full_vel 
     
    326373      IF( nn_timing == 1 ) CALL timing_start('bdy_dta_init') 
    327374 
    328       ! Set nn_dta 
     375      ! Set nn_dta to 0 or 1 
    329376      DO ib_bdy = 1, nb_bdy 
    330          nn_dta(ib_bdy) = MAX(  nn_dyn2d_dta(ib_bdy)       & 
    331                                ,nn_dyn3d_dta(ib_bdy)       & 
    332                                ,nn_tra_dta(ib_bdy)         & 
    333 #if defined key_lim2 
    334                                ,nn_ice_lim2_dta(ib_bdy)    & 
     377         nn_dta(ib_bdy) = MAX( nn_dyn2d_dta(ib_bdy)       & 
     378                              ,nn_dyn3d_dta(ib_bdy)       & 
     379                              ,nn_tra_dta(ib_bdy)         & 
     380#if ( defined key_lim2 || defined key_lim3 ) 
     381                              ,nn_ice_lim_dta(ib_bdy)    & 
    335382#endif 
    336383                              ) 
     
    352399            nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 2 
    353400         ENDIF 
    354 #if defined key_lim2 
    355          IF( nn_ice_lim2(ib_bdy) .gt. 0 .and. nn_ice_lim2_dta(ib_bdy) .eq. 1  ) THEN 
     401#if ( defined key_lim2 || defined key_lim3 ) 
     402         IF( nn_ice_lim(ib_bdy) .gt. 0 .and. nn_ice_lim_dta(ib_bdy) .eq. 1  ) THEN 
    356403            nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 3 
    357404         ENDIF 
     
    377424      ALLOCATE( igrid(nb_bdy_fld_sum) )  
    378425 
    379       ! Read namelists 
     426     ! Read namelists 
    380427      ! -------------- 
    381428      REWIND(numnam) 
     
    387434            ln_full_vel = .false. 
    388435            ! ... default values (NB: frequency positive => hours, negative => months) 
    389             !                    !  file       ! frequency !  variable   ! time intep !  clim   ! 'yearly' or ! weights  ! rotation  ! 
    390             !                    !  name       ! hours !   name     !  (T/F)  !  (T/F)  !  'monthly'  ! filename ! pairs     ! 
    391             bn_ssh     = FLD_N(  'bdy_ssh'     ,  24   , 'sossheig' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
    392             bn_u2d     = FLD_N(  'bdy_vel2d_u' ,  24   , 'vobtcrtx' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
    393             bn_v2d     = FLD_N(  'bdy_vel2d_v' ,  24   , 'vobtcrty' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
    394             bn_u3d     = FLD_N(  'bdy_vel3d_u' ,  24   , 'vozocrtx' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
    395             bn_v3d     = FLD_N(  'bdy_vel3d_v' ,  24   , 'vomecrty' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
    396             bn_tem     = FLD_N(  'bdy_tem'     ,  24   , 'votemper' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
    397             bn_sal     = FLD_N(  'bdy_sal'     ,  24   , 'vosaline' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
     436            !                 !  file       ! frequency !  variable  ! time intep !  clim   ! 'yearly' or ! weights  ! rotation  ! 
     437            !                 !  name       ! hours     !   name     !  (T/F)     !  (T/F)  !  'monthly'  ! filename ! pairs     ! 
     438            bn_ssh   = FLD_N(  'bdy_ssh'     ,  24      , 'sossheig' , .false.    , .false. ,   'yearly'  , ''       , ''        ) 
     439            bn_u2d   = FLD_N(  'bdy_vel2d_u' ,  24      , 'vobtcrtx' , .false.    , .false. ,   'yearly'  , ''       , ''        ) 
     440            bn_v2d   = FLD_N(  'bdy_vel2d_v' ,  24      , 'vobtcrty' , .false.    , .false. ,   'yearly'  , ''       , ''        ) 
     441            bn_u3d   = FLD_N(  'bdy_vel3d_u' ,  24      , 'vozocrtx' , .false.    , .false. ,   'yearly'  , ''       , ''        ) 
     442            bn_v3d   = FLD_N(  'bdy_vel3d_v' ,  24      , 'vomecrty' , .false.    , .false. ,   'yearly'  , ''       , ''        ) 
     443            bn_tem   = FLD_N(  'bdy_tem'     ,  24      , 'votemper' , .false.    , .false. ,   'yearly'  , ''       , ''        ) 
     444            bn_sal   = FLD_N(  'bdy_sal'     ,  24      , 'vosaline' , .false.    , .false. ,   'yearly'  , ''       , ''        ) 
    398445#if defined key_lim2 
    399             bn_frld    = FLD_N(  'bdy_frld'    ,  24   , 'ildsconc' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
    400             bn_hicif   = FLD_N(  'bdy_hicif'   ,  24   , 'iicethic' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
    401             bn_hsnif   = FLD_N(  'bdy_hsnif'   ,  24   , 'isnothic' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
     446            bn_frld  = FLD_N(  'bdy_frld'    ,  24      , 'ildsconc' , .false.    , .false. ,   'yearly'  , ''       , ''        ) 
     447            bn_hicif = FLD_N(  'bdy_hicif'   ,  24      , 'iicethic' , .false.    , .false. ,   'yearly'  , ''       , ''        ) 
     448            bn_hsnif = FLD_N(  'bdy_hsnif'   ,  24      , 'isnothic' , .false.    , .false. ,   'yearly'  , ''       , ''        ) 
     449#elif defined key_lim3 
     450            bn_a_i  = FLD_N(  'bdy_a_i'     ,  24   , 'ileadfra' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
     451            bn_ht_i = FLD_N(  'bdy_ht_i'    ,  24   , 'iicethic' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
     452            bn_ht_s = FLD_N(  'bdy_ht_s'    ,  24   , 'isnowthi' , .false. , .false. ,   'yearly'  , ''       , ''        ) 
    402453#endif 
    403454 
     
    515566#if defined key_lim2 
    516567            ! sea ice 
    517             IF( nn_ice_lim2(ib_bdy) .gt. 0 .and. nn_ice_lim2_dta(ib_bdy) .eq. 1 ) THEN 
     568            IF( nn_ice_lim(ib_bdy) .gt. 0 .and. nn_ice_lim_dta(ib_bdy) .eq. 1 ) THEN 
    518569 
    519570               jfld = jfld + 1 
     
    521572               ibdy(jfld) = ib_bdy 
    522573               igrid(jfld) = 1 
    523                IF( nn_ice_lim2(ib_bdy) .eq. jp_frs ) THEN 
     574               IF( nn_ice_lim(ib_bdy) .eq. jp_frs ) THEN 
    524575                  ilen1(jfld) = nblen(igrid(jfld)) 
    525576               ELSE 
     
    532583               ibdy(jfld) = ib_bdy 
    533584               igrid(jfld) = 1 
    534                IF( nn_ice_lim2(ib_bdy) .eq. jp_frs ) THEN 
     585               IF( nn_ice_lim(ib_bdy) .eq. jp_frs ) THEN 
    535586                  ilen1(jfld) = nblen(igrid(jfld)) 
    536587               ELSE 
     
    543594               ibdy(jfld) = ib_bdy 
    544595               igrid(jfld) = 1 
    545                IF( nn_ice_lim2(ib_bdy) .eq. jp_frs ) THEN 
     596               IF( nn_ice_lim(ib_bdy) .eq. jp_frs ) THEN 
    546597                  ilen1(jfld) = nblen(igrid(jfld)) 
    547598               ELSE 
     
    549600               ENDIF 
    550601               ilen3(jfld) = 1 
     602 
     603            ENDIF 
     604#elif defined key_lim3 
     605            ! sea ice 
     606            IF( nn_ice_lim(ib_bdy) .gt. 0 .and. nn_ice_lim_dta(ib_bdy) .eq. 1 ) THEN 
     607 
     608               ! Test for types of ice input (lim2 or lim3)  
     609               CALL iom_open ( bn_a_i%clname, inum ) 
     610               id1 = iom_varid ( inum, bn_a_i%clvar, kdimsz=zdimsz, kndims=zndims, ldstop = .FALSE. ) 
     611               CALL iom_close ( inum ) 
     612               !CALL fld_clopn ( bn_a_i, nyear, nmonth, nday, ldstop=.TRUE. ) 
     613               !CALL iom_open ( bn_a_i%clname, inum ) 
     614               !id1 = iom_varid ( bn_a_i%num, bn_a_i%clvar, kdimsz=zdimsz, kndims=zndims, ldstop = .FALSE. ) 
     615                IF ( zndims == 4 ) THEN 
     616                 ll_bdylim3 = .TRUE. 
     617               ELSE 
     618                 ll_bdylim3 = .FALSE.         
     619               ENDIF 
     620               ! End test 
     621 
     622               jfld = jfld + 1 
     623               blf_i(jfld) = bn_a_i 
     624               ibdy(jfld) = ib_bdy 
     625               igrid(jfld) = 1 
     626               IF( nn_ice_lim(ib_bdy) .eq. jp_frs ) THEN 
     627                  ilen1(jfld) = nblen(igrid(jfld)) 
     628               ELSE 
     629                  ilen1(jfld) = nblenrim(igrid(jfld)) 
     630               ENDIF 
     631               IF ( ll_bdylim3 ) THEN ; ilen3(jfld)=jpl ; ELSE ; ilen3(jfld)=1 ; ENDIF 
     632 
     633               jfld = jfld + 1 
     634               blf_i(jfld) = bn_ht_i 
     635               ibdy(jfld) = ib_bdy 
     636               igrid(jfld) = 1 
     637               IF( nn_ice_lim(ib_bdy) .eq. jp_frs ) THEN 
     638                  ilen1(jfld) = nblen(igrid(jfld)) 
     639               ELSE 
     640                  ilen1(jfld) = nblenrim(igrid(jfld)) 
     641               ENDIF 
     642               IF ( ll_bdylim3 ) THEN ; ilen3(jfld)=jpl ; ELSE ; ilen3(jfld)=1 ; ENDIF 
     643 
     644               jfld = jfld + 1 
     645               blf_i(jfld) = bn_ht_s 
     646               ibdy(jfld) = ib_bdy 
     647               igrid(jfld) = 1 
     648               IF( nn_ice_lim(ib_bdy) .eq. jp_frs ) THEN 
     649                  ilen1(jfld) = nblen(igrid(jfld)) 
     650               ELSE 
     651                  ilen1(jfld) = nblenrim(igrid(jfld)) 
     652               ENDIF 
     653               IF ( ll_bdylim3 ) THEN ; ilen3(jfld)=jpl ; ELSE ; ilen3(jfld)=1 ; ENDIF 
    551654 
    552655            ENDIF 
     
    652755 
    653756#if defined key_lim2 
    654          IF (nn_ice_lim2(ib_bdy) .gt. 0) THEN 
    655             IF( nn_ice_lim2_dta(ib_bdy) .eq. 0 ) THEN 
    656                IF( nn_ice_lim2(ib_bdy) .eq. jp_frs ) THEN 
     757         IF (nn_ice_lim(ib_bdy) .gt. 0) THEN 
     758            IF( nn_ice_lim_dta(ib_bdy) .eq. 0 ) THEN 
     759               IF( nn_ice_lim(ib_bdy) .eq. jp_frs ) THEN 
    657760                  ilen0(1:3) = nblen(1:3) 
    658761               ELSE 
     
    669772               jfld = jfld + 1 
    670773               dta_bdy(ib_bdy)%hsnif => bf(jfld)%fnow(:,1,1) 
     774            ENDIF 
     775         ENDIF 
     776#elif defined key_lim3 
     777         IF (nn_ice_lim(ib_bdy) .gt. 0) THEN 
     778            IF( nn_ice_lim(ib_bdy) .eq. jp_frs ) THEN 
     779               ilen0(1:3) = nblen(1:3) 
     780            ELSE 
     781               ilen0(1:3) = nblenrim(1:3) 
     782            ENDIF 
     783            IF( nn_ice_lim_dta(ib_bdy) .eq. 0 ) THEN 
     784               ALLOCATE( dta_bdy(ib_bdy)%a_i (ilen0(1),jpl) ) 
     785               ALLOCATE( dta_bdy(ib_bdy)%ht_i(ilen0(1),jpl) ) 
     786               ALLOCATE( dta_bdy(ib_bdy)%ht_s(ilen0(1),jpl) ) 
     787            ELSE 
     788               IF ( ll_bdylim3 ) THEN 
     789                  jfld = jfld + 1 
     790                  dta_bdy(ib_bdy)%a_i  => bf(jfld)%fnow(:,1,:) 
     791                  jfld = jfld + 1 
     792                  dta_bdy(ib_bdy)%ht_i => bf(jfld)%fnow(:,1,:) 
     793                  jfld = jfld + 1 
     794                  dta_bdy(ib_bdy)%ht_s => bf(jfld)%fnow(:,1,:) 
     795               ELSE 
     796                  jfld    = jfld + 1                   
     797                  jfld_ai = jfld 
     798                  ALLOCATE( dta_bdy(ib_bdy)%a_i (ilen0(1),jpl) ) 
     799                  dta_bdy(ib_bdy)%a_i(:,:) = 0.0 
     800                  jfld     = jfld + 1                   
     801                  jfld_hti = jfld 
     802                  ALLOCATE( dta_bdy(ib_bdy)%ht_i(ilen0(1),jpl) ) 
     803                  dta_bdy(ib_bdy)%ht_i(:,:) = 0.0 
     804                  jfld     = jfld + 1                   
     805                  jfld_hts = jfld 
     806                  ALLOCATE( dta_bdy(ib_bdy)%ht_s(ilen0(1),jpl) ) 
     807                  dta_bdy(ib_bdy)%ht_s(:,:) = 0.0 
     808               ENDIF 
     809 
    671810            ENDIF 
    672811         ENDIF 
Note: See TracChangeset for help on using the changeset viewer.