Changeset 12866


Ignore:
Timestamp:
2020-05-05T08:18:05+02:00 (7 months ago)
Author:
smasson
Message:

Extra_Halo: using input files without halos, see #2366

Location:
NEMO/branches/2020/dev_r12558_HPC-08_epico_Extra_Halo
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/dev_r12558_HPC-08_epico_Extra_Halo/cfgs/ORCA2_ICE_PISCES/EXPREF/namelist_cfg

    r12501 r12866  
    109109   !           !  file name              ! frequency (hours) ! variable  ! time interp.!  clim  ! 'yearly'/ !          weights filename            ! rotation ! land/sea mask ! 
    110110   !           !                         !  (if <0  months)  !   name    !   (logical) !  (T/F) ! 'monthly' !                                      ! pairing  !    filename   ! 
    111    sn_wndi     = 'u_10.15JUNE2009_fill'       ,    6.        , 'U_10_MOD',   .false.   , .true. , 'yearly'  , 'weights_core_orca2_bicubic_noc.nc'  , 'Uwnd'   , '' 
    112    sn_wndj     = 'v_10.15JUNE2009_fill'       ,    6.        , 'V_10_MOD',   .false.   , .true. , 'yearly'  , 'weights_core_orca2_bicubic_noc.nc'  , 'Vwnd'   , '' 
    113    sn_qsr      = 'ncar_rad.15JUNE2009_fill'   ,   24.        , 'SWDN_MOD',   .false.   , .true. , 'yearly'  , 'weights_core_orca2_bilinear_noc.nc' , ''       , '' 
    114    sn_qlw      = 'ncar_rad.15JUNE2009_fill'   ,   24.        , 'LWDN_MOD',   .false.   , .true. , 'yearly'  , 'weights_core_orca2_bilinear_noc.nc' , ''       , '' 
    115    sn_tair     = 't_10.15JUNE2009_fill'       ,    6.        , 'T_10_MOD',   .false.   , .true. , 'yearly'  , 'weights_core_orca2_bilinear_noc.nc' , ''       , '' 
    116    sn_humi     = 'q_10.15JUNE2009_fill'       ,    6.        , 'Q_10_MOD',   .false.   , .true. , 'yearly'  , 'weights_core_orca2_bilinear_noc.nc' , ''       , '' 
    117    sn_prec     = 'ncar_precip.15JUNE2009_fill',   -1.        , 'PRC_MOD1',   .false.   , .true. , 'yearly'  , 'weights_core_orca2_bilinear_noc.nc' , ''       , '' 
    118    sn_snow     = 'ncar_precip.15JUNE2009_fill',   -1.        , 'SNOW'    ,   .false.   , .true. , 'yearly'  , 'weights_core_orca2_bilinear_noc.nc' , ''       , '' 
    119    sn_slp      = 'slp.15JUNE2009_fill'        ,    6.        , 'SLP'     ,   .false.   , .true. , 'yearly'  , 'weights_core_orca2_bilinear_noc.nc' , ''       , '' 
     111   sn_wndi     = 'u_10.15JUNE2009_fill'       ,    6.        , 'U_10_MOD',   .false.   , .true. , 'yearly'  , 'weights_core2_orca2_bicub'  , 'Uwnd'   , '' 
     112   sn_wndj     = 'v_10.15JUNE2009_fill'       ,    6.        , 'V_10_MOD',   .false.   , .true. , 'yearly'  , 'weights_core2_orca2_bicub'  , 'Vwnd'   , '' 
     113   sn_qsr      = 'ncar_rad.15JUNE2009_fill'   ,   24.        , 'SWDN_MOD',   .false.   , .true. , 'yearly'  , 'weights_core2_orca2_bilin' , ''       , '' 
     114   sn_qlw      = 'ncar_rad.15JUNE2009_fill'   ,   24.        , 'LWDN_MOD',   .false.   , .true. , 'yearly'  , 'weights_core2_orca2_bilin' , ''       , '' 
     115   sn_tair     = 't_10.15JUNE2009_fill'       ,    6.        , 'T_10_MOD',   .false.   , .true. , 'yearly'  , 'weights_core2_orca2_bilin' , ''       , '' 
     116   sn_humi     = 'q_10.15JUNE2009_fill'       ,    6.        , 'Q_10_MOD',   .false.   , .true. , 'yearly'  , 'weights_core2_orca2_bilin' , ''       , '' 
     117   sn_prec     = 'ncar_precip.15JUNE2009_fill',   -1.        , 'PRC_MOD1',   .false.   , .true. , 'yearly'  , 'weights_core2_orca2_bilin' , ''       , '' 
     118   sn_snow     = 'ncar_precip.15JUNE2009_fill',   -1.        , 'SNOW'    ,   .false.   , .true. , 'yearly'  , 'weights_core2_orca2_bilin' , ''       , '' 
     119   sn_slp      = 'slp.15JUNE2009_fill'        ,    6.        , 'SLP'     ,   .false.   , .true. , 'yearly'  , 'weights_core2_orca2_bilin' , ''       , '' 
    120120/ 
    121121!----------------------------------------------------------------------- 
     
    386386   !           !  file name              ! frequency (hours) ! variable  ! time interp.!  clim  ! 'yearly'/ ! weights filename ! rotation ! land/sea mask ! 
    387387   !           !                         !  (if <0  months)  !   name    !   (logical) !  (T/F) ! 'monthly' !                  ! pairing  !    filename   ! 
    388    sn_mpb      = 'mixing_power_bot'      , -12               , 'field'   , .false.  , .true. , 'yearly' , '' , ''  , '' 
    389    sn_mpp      = 'mixing_power_pyc'      , -12               , 'field'   , .false.  , .true. , 'yearly' , '' , ''  , '' 
    390    sn_mpc      = 'mixing_power_cri'      , -12               , 'field'   , .false.  , .true. , 'yearly' , '' , ''  , '' 
    391    sn_dsb      = 'decay_scale_bot'       , -12               , 'field'   , .false.  , .true. , 'yearly' , '' , ''  , '' 
    392    sn_dsc      = 'decay_scale_cri'       , -12               , 'field'   , .false.  , .true. , 'yearly' , '' , ''  , '' 
     388   sn_mpb      = 'int_wave_mix'      , -12.       , 'mixing_power_bot'   , .false.  , .true. , 'yearly' , '' , ''  , '' 
     389   sn_mpp      = 'int_wave_mix'      , -12.       , 'mixing_power_pyc'   , .false.  , .true. , 'yearly' , '' , ''  , '' 
     390   sn_mpc      = 'int_wave_mix'      , -12.       , 'mixing_power_cri'   , .false.  , .true. , 'yearly' , '' , ''  , '' 
     391   sn_dsb      = 'int_wave_mix'      , -12.       , 'decay_scale_bot'    , .false.  , .true. , 'yearly' , '' , ''  , '' 
     392   sn_dsc      = 'int_wave_mix'      , -12.       , 'decay_scale_cri'    , .false.  , .true. , 'yearly' , '' , ''  , '' 
    393393/ 
    394394!!====================================================================== 
  • NEMO/branches/2020/dev_r12558_HPC-08_epico_Extra_Halo/cfgs/SHARED/namelist_ref

    r12530 r12866  
    11971197   !           !  file name              ! frequency (hours) ! variable  ! time interp.!  clim  ! 'yearly'/ ! weights filename ! rotation ! land/sea mask ! 
    11981198   !           !                         !  (if <0  months)  !   name    !   (logical) !  (T/F) ! 'monthly' !                  ! pairing  !    filename   ! 
    1199    sn_mpb      = 'NOT USED'              , -12               , 'mixing_power_bot' , .false.  , .true. , 'yearly' , '' , ''  , '' 
    1200    sn_mpp      = 'NOT USED'              , -12               , 'mixing_power_pyc' , .false.  , .true. , 'yearly' , '' , ''  , '' 
    1201    sn_mpc      = 'NOT USED'              , -12               , 'mixing_power_cri' , .false.  , .true. , 'yearly' , '' , ''  , '' 
    1202    sn_dsb      = 'NOT USED'              , -12               , 'decay_scale_bot'  , .false.  , .true. , 'yearly' , '' , ''  , '' 
    1203    sn_dsc      = 'NOT USED'              , -12               , 'decay_scale_cri'  , .false.  , .true. , 'yearly' , '' , ''  , '' 
     1199   sn_mpb      = 'NOT USED'              , -12.              , 'mixing_power_bot' , .false.  , .true. , 'yearly' , '' , ''  , '' 
     1200   sn_mpp      = 'NOT USED'              , -12.              , 'mixing_power_pyc' , .false.  , .true. , 'yearly' , '' , ''  , '' 
     1201   sn_mpc      = 'NOT USED'              , -12.              , 'mixing_power_cri' , .false.  , .true. , 'yearly' , '' , ''  , '' 
     1202   sn_dsb      = 'NOT USED'              , -12.              , 'decay_scale_bot'  , .false.  , .true. , 'yearly' , '' , ''  , '' 
     1203   sn_dsc      = 'NOT USED'              , -12.              , 'decay_scale_cri'  , .false.  , .true. , 'yearly' , '' , ''  , '' 
    12041204/ 
    12051205!!====================================================================== 
  • NEMO/branches/2020/dev_r12558_HPC-08_epico_Extra_Halo/src/OCE/BDY/bdyini.F90

    r12377 r12866  
    410410               CALL iom_get( inum, jpdom_unknown, 'nbi'//cgrid(igrd), zz_read(1:nblendta(igrd,ib_bdy),:) ) 
    411411               DO ii = 1,nblendta(igrd,ib_bdy) 
    412                   nbidta(ii,igrd,ib_bdy) = NINT( zz_read(ii,1) ) 
     412                  nbidta(ii,igrd,ib_bdy) = NINT( zz_read(ii,1) ) + nn_hls 
    413413               END DO 
    414414               CALL iom_get( inum, jpdom_unknown, 'nbj'//cgrid(igrd), zz_read(1:nblendta(igrd,ib_bdy),:) ) 
    415415               DO ii = 1,nblendta(igrd,ib_bdy) 
    416                   nbjdta(ii,igrd,ib_bdy) = NINT( zz_read(ii,1) ) 
     416                  nbjdta(ii,igrd,ib_bdy) = NINT( zz_read(ii,1) ) + nn_hls 
    417417               END DO 
    418418               CALL iom_get( inum, jpdom_unknown, 'nbr'//cgrid(igrd), zz_read(1:nblendta(igrd,ib_bdy),:) ) 
  • NEMO/branches/2020/dev_r12558_HPC-08_epico_Extra_Halo/src/OCE/DOM/domain.F90

    r12489 r12866  
    565565      IF(lwp) THEN 
    566566         WRITE(numout,*) '      cn_cfg = ', TRIM(cd_cfg), '   nn_cfg = ', kk_cfg 
    567          WRITE(numout,*) '      jpiglo = ', kpi 
    568          WRITE(numout,*) '      jpjglo = ', kpj 
     567         WRITE(numout,*) '      Ni0glo = ', kpi 
     568         WRITE(numout,*) '      Nj0glo = ', kpj 
    569569         WRITE(numout,*) '      jpkglo = ', kpk 
    570570         WRITE(numout,*) '      type of global domain lateral boundary   jperio = ', kperio 
  • NEMO/branches/2020/dev_r12558_HPC-08_epico_Extra_Halo/src/OCE/IOM/iom.F90

    r12815 r12866  
    12261226               IF( PRESENT(psgn   ) )   zsgn    = psgn 
    12271227               !--- overlap areas and extra hallows (mpp) 
    1228                IF(     PRESENT(pv_r2d) .AND. idom /= jpdom_unknown ) THEN 
     1228               IF(     PRESENT(pv_r2d) .AND. idom /= jpdom_unknown .AND. cl_type /= 'Z' ) THEN 
    12291229                  CALL lbc_lnk( 'iom', pv_r2d, cl_type, zsgn, kfillmode = kfill ) 
    1230                ELSEIF( PRESENT(pv_r3d) .AND. idom /= jpdom_unknown ) THEN 
     1230               ELSEIF( PRESENT(pv_r3d) .AND. idom /= jpdom_unknown .AND. cl_type /= 'Z' ) THEN 
    12311231                  CALL lbc_lnk( 'iom', pv_r3d, cl_type, zsgn, kfillmode = kfill ) 
    12321232               ENDIF 
  • NEMO/branches/2020/dev_r12558_HPC-08_epico_Extra_Halo/src/OCE/SBC/fldread.F90

    r12738 r12866  
    7171      CHARACTER(len = 8)              ::   cltype       ! type of data file 'daily', 'monthly' or yearly' 
    7272      INTEGER                         ::   num          ! iom id of the jpfld files to be read 
    73       INTEGER , DIMENSION(2)          ::   nrec_b       ! before record (1: index, 2: second since Jan. 1st 00h of nit000 year) 
    74       INTEGER , DIMENSION(2)          ::   nrec_a       ! after  record (1: index, 2: second since Jan. 1st 00h of nit000 year) 
     73      INTEGER , DIMENSION(2,2)        ::   nrec         ! before/after record (1: index, 2: second since Jan. 1st 00h of yr nit000) 
     74      INTEGER                         ::   nbb          ! index of before values 
     75      INTEGER                         ::   naa          ! index of after  values 
    7576      INTEGER , ALLOCATABLE, DIMENSION(:      ) ::   nrecsec   !  
    7677      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:  ) ::   fnow   ! input fields interpolated to now time step 
     
    156157      INTEGER  ::   jf           ! dummy indices 
    157158      INTEGER  ::   isecsbc      ! number of seconds between Jan. 1st 00h of nit000 year and the middle of sbc time step 
     159      INTEGER  ::   ibb, iaa     ! shorter name for sd(jf)%nbb and sd(jf)%naa 
    158160      LOGICAL  ::   ll_firstcall ! true if this is the first call to fld_read for this set of fields 
    159161      REAL(wp) ::   zt_offset    ! local time offset variable 
     
    203205            IF( TRIM(sd(jf)%clrootname) == 'NOT USED' )   CYCLE 
    204206            ! 
     207            ibb = sd(jf)%nbb   ;   iaa = sd(jf)%naa 
     208            ! 
    205209            IF( sd(jf)%ln_tint ) THEN              ! temporal interpolation 
    206210               IF(lwp .AND. kt - nit000 <= 100 ) THEN  
     
    208212                     &    "', records b/a: ', i6.4, '/', i6.4, ' (days ', f9.4,'/', f9.4, ')')" 
    209213                  WRITE(numout, clfmt)  TRIM( sd(jf)%clvar ), kt, REAL(isecsbc,wp)/rday, nyear, nmonth, nday,   &             
    210                      & sd(jf)%nrec_b(1), sd(jf)%nrec_a(1), REAL(sd(jf)%nrec_b(2),wp)/rday, REAL(sd(jf)%nrec_a(2),wp)/rday 
     214                     & sd(jf)%nrec(1,ibb), sd(jf)%nrec(1,iaa), REAL(sd(jf)%nrec(2,ibb),wp)/rday, REAL(sd(jf)%nrec(2,iaa),wp)/rday 
    211215                  WRITE(numout, *) '      zt_offset is : ',zt_offset 
    212216               ENDIF 
    213217               ! temporal interpolation weights 
    214                ztinta =  REAL( isecsbc - sd(jf)%nrec_b(2), wp ) / REAL( sd(jf)%nrec_a(2) - sd(jf)%nrec_b(2), wp ) 
     218               ztinta =  REAL( isecsbc - sd(jf)%nrec(2,ibb), wp ) / REAL( sd(jf)%nrec(2,iaa) - sd(jf)%nrec(2,ibb), wp ) 
    215219               ztintb =  1. - ztinta 
    216                sd(jf)%fnow(:,:,:) = ztintb * sd(jf)%fdta(:,:,:,1) + ztinta * sd(jf)%fdta(:,:,:,2) 
     220               sd(jf)%fnow(:,:,:) = ztintb * sd(jf)%fdta(:,:,:,ibb) + ztinta * sd(jf)%fdta(:,:,:,iaa) 
    217221            ELSE   ! nothing to do... 
    218222               IF(lwp .AND. kt - nit000 <= 100 ) THEN 
     
    220224                     &    "', record: ', i6.4, ' (days ', f9.4, ' <-> ', f9.4, ')')" 
    221225                  WRITE(numout, clfmt) TRIM(sd(jf)%clvar), kt, REAL(isecsbc,wp)/rday, nyear, nmonth, nday,    & 
    222                      &                 sd(jf)%nrec_a(1), REAL(sd(jf)%nrec_b(2),wp)/rday, REAL(sd(jf)%nrec_a(2),wp)/rday 
     226                     &                 sd(jf)%nrec(1,iaa), REAL(sd(jf)%nrec(2,ibb),wp)/rday, REAL(sd(jf)%nrec(2,iaa),wp)/rday 
    223227               ENDIF 
    224228            ENDIF 
     
    250254      ! 
    251255      CALL fld_clopn( sdjf ) 
    252       sdjf%nrec_a(:) = (/ 1, nflag /)  ! default definition to force flp_update to read the file. 
     256      sdjf%nrec(:,sdjf%naa) = (/ 1, nflag /)  ! default definition to force flp_update to read the file. 
    253257      ! 
    254258   END SUBROUTINE fld_init 
     
    261265      !! ** Purpose : Compute 
    262266      !!              if sdjf%ln_tint = .TRUE. 
    263       !!                  nrec_a: record number and its time (nrec_b is obtained from nrec_a when swapping) 
     267      !!                  nrec(:,iaa): record number and its time (nrec(:,ibb) is obtained from nrec(:,iaa) when swapping) 
    264268      !!              if sdjf%ln_tint = .FALSE. 
    265       !!                  nrec_a(1): record number 
    266       !!                  nrec_b(2) and nrec_a(2): time of the beginning and end of the record 
     269      !!                  nrec(1,iaa): record number 
     270      !!                  nrec(2,ibb) and nrec(2,iaa): time of the beginning and end of the record 
    267271      !!---------------------------------------------------------------------- 
    268272      INTEGER  ,           INTENT(in   ) ::   ksecsbc   !  
     
    270274      INTEGER  , OPTIONAL, INTENT(in   ) ::   Kmm    ! ocean time level index 
    271275      ! 
    272       INTEGER  ::   ja     ! end of this record (in seconds) 
    273       !!---------------------------------------------------------------------- 
    274       ! 
    275       IF( ksecsbc > sdjf%nrec_a(2) ) THEN     ! --> we need to update after data 
     276      INTEGER  ::   ja           ! end of this record (in seconds) 
     277      INTEGER  ::   ibb, iaa     ! shorter name for sdjf%nbb and sdjf%naa 
     278      !!---------------------------------------------------------------------- 
     279      ibb = sdjf%nbb   ;   iaa = sdjf%naa 
     280      ! 
     281      IF( ksecsbc > sdjf%nrec(2,iaa) ) THEN     ! --> we need to update after data 
    276282         
    277          ! find where is the new after record... (it is not necessary sdjf%nrec_a(1)+1 ) 
    278          ja = sdjf%nrec_a(1) 
     283         ! find where is the new after record... (it is not necessary sdjf%nrec(1,iaa)+1 ) 
     284         ja = sdjf%nrec(1,iaa) 
    279285         DO WHILE ( ksecsbc >= sdjf%nrecsec(ja) .AND. ja < sdjf%nreclast )   ! Warning: make sure ja <= sdjf%nreclast in this test 
    280286            ja = ja + 1 
     
    283289 
    284290         ! if ln_tint and if the new after is not ja+1, we need also to update after data before the swap 
    285          ! so, after the swap, sdjf%nrec_b(2) will still be the closest value located just before ksecsbc 
    286          IF( sdjf%ln_tint .AND. ( ja > sdjf%nrec_a(1) + 1 .OR. sdjf%nrec_a(2) == nflag ) ) THEN 
    287             sdjf%nrec_a(:) = (/ ja-1, sdjf%nrecsec(ja-1) /)   ! update nrec_a with before information 
    288             CALL fld_get( sdjf, Kmm )                         ! read after data that will be used as before data 
     291         ! so, after the swap, sdjf%nrec(2,ibb) will still be the closest value located just before ksecsbc 
     292         IF( sdjf%ln_tint .AND. ( ja > sdjf%nrec(1,iaa) + 1 .OR. sdjf%nrec(2,iaa) == nflag ) ) THEN 
     293            sdjf%nrec(:,iaa) = (/ ja-1, sdjf%nrecsec(ja-1) /)   ! update nrec(:,iaa) with before information 
     294            CALL fld_get( sdjf, Kmm )                           ! read after data that will be used as before data 
    289295         ENDIF 
    290296             
     
    309315            ! if ln_tint and if after is not the first record, we must (potentially again) update after data before the swap 
    310316            IF( sdjf%ln_tint .AND. ja > 1 ) THEN 
    311                IF( sdjf%nrecsec(0) /= nflag ) THEN                  ! no trick used: after file is not the current file 
    312                   sdjf%nrec_a(:) = (/ ja-1, sdjf%nrecsec(ja-1) /)   ! update nrec_a with before information 
    313                   CALL fld_get( sdjf, Kmm )                         ! read after data that will be used as before data 
     317               IF( sdjf%nrecsec(0) /= nflag ) THEN                    ! no trick used: after file is not the current file 
     318                  sdjf%nrec(:,iaa) = (/ ja-1, sdjf%nrecsec(ja-1) /)   ! update nrec(:,iaa) with before information 
     319                  CALL fld_get( sdjf, Kmm )                           ! read after data that will be used as before data 
    314320               ENDIF 
    315321            ENDIF 
     
    317323         ENDIF 
    318324 
    319          IF( sdjf%ln_tint ) THEN  
    320             ! Swap data 
    321             sdjf%nrec_b(:)     = sdjf%nrec_a(:)                     ! swap before record informations 
    322             sdjf%rotn(1)       = sdjf%rotn(2)                       ! swap before rotate informations 
    323             sdjf%fdta(:,:,:,1) = sdjf%fdta(:,:,:,2)                 ! swap before record field 
    324          ELSE 
    325             sdjf%nrec_b(:) = (/ ja-1, sdjf%nrecsec(ja-1) /)         ! only for print  
     325         IF( sdjf%ln_tint ) THEN                                ! Swap data 
     326            sdjf%nbb = sdjf%naa                                 !    swap indices 
     327            sdjf%naa = 3 - sdjf%naa                             !    = 2(1) if naa == 1(2) 
     328         ELSE                                                   ! No swap 
     329            sdjf%nrec(:,ibb) = (/ ja-1, sdjf%nrecsec(ja-1) /)   !    only for print  
    326330         ENDIF 
    327331             
    328332         ! read new after data 
    329          sdjf%nrec_a(:) = (/ ja, sdjf%nrecsec(ja) /)                ! update nrec_a as it is used by fld_get 
    330          CALL fld_get( sdjf, Kmm )                                  ! read after data (with nrec_a informations) 
     333         sdjf%nrec(:,sdjf%naa) = (/ ja, sdjf%nrecsec(ja) /)     ! update nrec(:,naa) as it is used by fld_get 
     334         CALL fld_get( sdjf, Kmm )                              ! read after data (with nrec(:,naa) informations) 
    331335         
    332336      ENDIF 
     
    345349      ! 
    346350      INTEGER ::   ipk      ! number of vertical levels of sdjf%fdta ( 2D: ipk=1 ; 3D: ipk=jpk ) 
     351      INTEGER ::   iaa      ! shorter name for sdjf%naa 
    347352      INTEGER ::   iw       ! index into wgts array 
    348353      INTEGER ::   ipdom    ! index of the domain 
     
    353358      ! 
    354359      ipk = SIZE( sdjf%fnow, 3 ) 
     360      iaa = sdjf%naa 
    355361      ! 
    356362      IF( ASSOCIATED(sdjf%imap) ) THEN 
    357          IF( sdjf%ln_tint ) THEN   ;   CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_a(1),   & 
     363         IF( sdjf%ln_tint ) THEN   ;   CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fdta(:,:,:,iaa), sdjf%nrec(1,iaa),   & 
    358364            &                                        sdjf%imap, sdjf%igrd, sdjf%ibdy, sdjf%ltotvel, sdjf%lzint, Kmm ) 
    359          ELSE                      ;   CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fnow(:,:,:  ), sdjf%nrec_a(1),   & 
     365         ELSE                      ;   CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fnow(:,:,:    ), sdjf%nrec(1,iaa),   & 
    360366            &                                        sdjf%imap, sdjf%igrd, sdjf%ibdy, sdjf%ltotvel, sdjf%lzint, Kmm ) 
    361367         ENDIF 
    362368      ELSE IF( LEN(TRIM(sdjf%wgtname)) > 0 ) THEN 
    363369         CALL wgt_list( sdjf, iw ) 
    364          IF( sdjf%ln_tint ) THEN   ;   CALL fld_interp( sdjf%num, sdjf%clvar, iw, ipk, sdjf%fdta(:,:,:,2),          &  
    365             &                                                                          sdjf%nrec_a(1), sdjf%lsmname ) 
    366          ELSE                      ;   CALL fld_interp( sdjf%num, sdjf%clvar, iw, ipk, sdjf%fnow(:,:,:  ),          & 
    367             &                                                                          sdjf%nrec_a(1), sdjf%lsmname ) 
     370         IF( sdjf%ln_tint ) THEN   ;   CALL fld_interp( sdjf%num, sdjf%clvar, iw, ipk, sdjf%fdta(:,:,:,iaa),   &  
     371            &                                                                          sdjf%nrec(1,iaa), sdjf%lsmname ) 
     372            CALL lbc_lnk( 'fldread', sdjf%fdta(:,:,:,iaa), 'T', 1._wp, kfillmode = jpfillcopy ) 
     373         ELSE                      ;   CALL fld_interp( sdjf%num, sdjf%clvar, iw, ipk, sdjf%fnow(:,:,:    ),   & 
     374            &                                                                          sdjf%nrec(1,iaa), sdjf%lsmname ) 
     375            CALL lbc_lnk( 'fldread', sdjf%fnow(:,:,:    ), 'T', 1._wp, kfillmode = jpfillcopy ) 
    368376         ENDIF 
    369377      ELSE 
     
    382390            IF( lk_c1d .AND. lmoor ) THEN 
    383391               IF( sdjf%ln_tint ) THEN 
    384                   CALL iom_get( sdjf%num, sdjf%clvar, sdjf%fdta(2,2,1,2), sdjf%nrec_a(1) ) 
    385                   CALL lbc_lnk( 'fldread', sdjf%fdta(:,:,1,2),'Z',1. ) 
     392                  CALL iom_get( sdjf%num, sdjf%clvar, sdjf%fdta(2,2,1,iaa), sdjf%nrec(1,iaa) ) 
     393                  CALL lbc_lnk( 'fldread', sdjf%fdta(:,:,1,iaa),'T',1., kfillmode = jpfillcopy ) 
    386394               ELSE 
    387                   CALL iom_get( sdjf%num, sdjf%clvar, sdjf%fnow(2,2,1  ), sdjf%nrec_a(1) ) 
    388                   CALL lbc_lnk( 'fldread', sdjf%fnow(:,:,1  ),'Z',1. ) 
     395                  CALL iom_get( sdjf%num, sdjf%clvar, sdjf%fnow(2,2,1    ), sdjf%nrec(1,iaa) ) 
     396                  CALL lbc_lnk( 'fldread', sdjf%fnow(:,:,1    ),'T',1., kfillmode = jpfillcopy ) 
    389397               ENDIF 
    390398            ELSE 
    391                IF( sdjf%ln_tint ) THEN   ;   CALL iom_get( sdjf%num, ipdom, sdjf%clvar, sdjf%fdta(:,:,1,2), sdjf%nrec_a(1) ) 
    392                ELSE                      ;   CALL iom_get( sdjf%num, ipdom, sdjf%clvar, sdjf%fnow(:,:,1  ), sdjf%nrec_a(1) ) 
     399               IF( sdjf%ln_tint ) THEN 
     400                  CALL iom_get( sdjf%num, ipdom, sdjf%clvar, sdjf%fdta(:,:,1,iaa), sdjf%nrec(1,iaa), kfill = jpfillcopy ) 
     401               ELSE 
     402                  CALL iom_get( sdjf%num, ipdom, sdjf%clvar, sdjf%fnow(:,:,1    ), sdjf%nrec(1,iaa), kfill = jpfillcopy ) 
    393403               ENDIF 
    394404            ENDIF 
     
    396406            IF(lk_c1d .AND. lmoor ) THEN 
    397407               IF( sdjf%ln_tint ) THEN 
    398                   CALL iom_get( sdjf%num, jpdom_unknown, sdjf%clvar, sdjf%fdta(2,2,:,2), sdjf%nrec_a(1) ) 
    399                   CALL lbc_lnk( 'fldread', sdjf%fdta(:,:,:,2),'Z',1. ) 
     408                  CALL iom_get( sdjf%num, jpdom_unknown, sdjf%clvar, sdjf%fdta(2,2,:,iaa), sdjf%nrec(1,iaa) ) 
     409                  CALL lbc_lnk( 'fldread', sdjf%fdta(:,:,:,iaa),'T',1., kfillmode = jpfillcopy ) 
    400410               ELSE 
    401                   CALL iom_get( sdjf%num, jpdom_unknown, sdjf%clvar, sdjf%fnow(2,2,:  ), sdjf%nrec_a(1) ) 
    402                   CALL lbc_lnk( 'fldread', sdjf%fnow(:,:,:  ),'Z',1. ) 
     411                  CALL iom_get( sdjf%num, jpdom_unknown, sdjf%clvar, sdjf%fnow(2,2,:   ), sdjf%nrec(1,iaa) ) 
     412                  CALL lbc_lnk( 'fldread', sdjf%fnow(:,:,:   ),'T',1., kfillmode = jpfillcopy ) 
    403413               ENDIF 
    404414            ELSE 
    405                IF( sdjf%ln_tint ) THEN   ;   CALL iom_get( sdjf%num, ipdom, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_a(1) ) 
    406                ELSE                      ;   CALL iom_get( sdjf%num, ipdom, sdjf%clvar, sdjf%fnow(:,:,:  ), sdjf%nrec_a(1) ) 
     415               IF( sdjf%ln_tint ) THEN 
     416                  CALL iom_get( sdjf%num, ipdom, sdjf%clvar, sdjf%fdta(:,:,:,iaa), sdjf%nrec(1,iaa), kfill = jpfillcopy ) 
     417               ELSE 
     418                  CALL iom_get( sdjf%num, ipdom, sdjf%clvar, sdjf%fnow(:,:,:    ), sdjf%nrec(1,iaa), kfill = jpfillcopy ) 
    407419               ENDIF 
    408420            ENDIF 
     
    410422      ENDIF 
    411423      ! 
    412       sdjf%rotn(2) = .false.   ! vector not yet rotated 
     424      sdjf%rotn(iaa) = .false.   ! vector not yet rotated 
    413425      ! 
    414426   END SUBROUTINE fld_get 
     
    941953      IF( sdjf%num <= 0 .OR. .NOT. sdjf%ln_clim  ) THEN 
    942954         IF( sdjf%num > 0 )   CALL iom_close( sdjf%num )   ! close file if already open 
    943          CALL iom_open( sdjf%clname, sdjf%num, ldstop = llstop, ldiof = LEN(TRIM(sdjf%wgtname)) > 0 ) 
     955         CALL iom_open( sdjf%clname, sdjf%num, ldstop = llstop, ldiof = LEN_TRIM(sdjf%wgtname) > 0 ) 
    944956      ENDIF 
    945957      ! 
     
    963975         ENDIF 
    964976         ! 
    965          CALL iom_open( sdjf%clname, sdjf%num, ldiof = LEN(TRIM(sdjf%wgtname)) > 0 )    
     977         CALL iom_open( sdjf%clname, sdjf%num, ldiof = LEN_TRIM(sdjf%wgtname) > 0 )    
    966978         ! 
    967979      ENDIF 
     
    9981010         sdf(jf)%cltype     = sdf_n(jf)%cltype 
    9991011         sdf(jf)%num        = -1 
     1012         sdf(jf)%nbb        = 1  ! start with before data in 1 
     1013         sdf(jf)%naa        = 2  ! start with after  data in 2 
    10001014         sdf(jf)%wgtname    = " " 
    10011015         IF( LEN( TRIM(sdf_n(jf)%wname) ) > 0 )   sdf(jf)%wgtname = TRIM( cdir )//sdf_n(jf)%wname 
     
    10501064      !!---------------------------------------------------------------------- 
    10511065      TYPE( FLD ), INTENT(in   ) ::   sd        ! field with name of weights file 
    1052       INTEGER    , INTENT(inout) ::   kwgt      ! index of weights 
     1066      INTEGER    , INTENT(  out) ::   kwgt      ! index of weights 
    10531067      ! 
    10541068      INTEGER ::   kw, nestid   ! local integer 
    1055       LOGICAL ::   found        ! local logical 
    10561069      !!---------------------------------------------------------------------- 
    10571070      ! 
    10581071      !! search down linked list  
    10591072      !! weights filename is either present or we hit the end of the list 
    1060       found = .FALSE. 
    10611073      ! 
    10621074      !! because agrif nest part of filenames are now added in iom_open 
     
    10681080#endif 
    10691081      DO kw = 1, nxt_wgt-1 
    1070          IF( TRIM(ref_wgts(kw)%wgtname) == TRIM(sd%wgtname) .AND. & 
    1071              ref_wgts(kw)%nestid == nestid) THEN 
     1082         IF( ref_wgts(kw)%wgtname == sd%wgtname .AND. & 
     1083             ref_wgts(kw)%nestid  == nestid) THEN 
    10721084            kwgt = kw 
    1073             found = .TRUE. 
    1074             EXIT 
     1085            RETURN 
    10751086         ENDIF 
    10761087      END DO 
    1077       IF( .NOT.found ) THEN 
    1078          kwgt = nxt_wgt 
    1079          CALL fld_weight( sd ) 
    1080       ENDIF 
     1088      kwgt = nxt_wgt 
     1089      CALL fld_weight( sd ) 
    10811090      ! 
    10821091   END SUBROUTINE wgt_list 
     
    11211130      TYPE( FLD ), INTENT(in) ::   sd   ! field with name of weights file 
    11221131      !! 
    1123       INTEGER ::   jn         ! dummy loop indices 
     1132      INTEGER ::   ji,jj,jn   ! dummy loop indices 
    11241133      INTEGER ::   inum       ! local logical unit 
    11251134      INTEGER ::   id         ! local variable id 
     
    11271136      INTEGER ::   zwrap      ! local integer 
    11281137      LOGICAL ::   cyclical   !  
    1129       CHARACTER (len=5) ::   aname   ! 
    1130       INTEGER , DIMENSION(:), ALLOCATABLE ::   ddims 
    1131       INTEGER,  DIMENSION(jpi,jpj) ::   data_src 
     1138      CHARACTER (len=5) ::   clname   ! 
     1139      INTEGER , DIMENSION(4) ::   ddims 
     1140      INTEGER                ::   isrc 
    11321141      REAL(wp), DIMENSION(jpi,jpj) ::   data_tmp 
    11331142      !!---------------------------------------------------------------------- 
     
    11421151      !! current weights file 
    11431152 
    1144       !! open input data file (non-model grid) 
    1145       CALL iom_open( sd%clname, inum, ldiof =  LEN(TRIM(sd%wgtname)) > 0 ) 
    1146  
    1147       !! get dimensions: we consider 2D data as 3D data with vertical dim size = 1 
    1148       IF( SIZE(sd%fnow, 3) > 0 ) THEN 
    1149          ALLOCATE( ddims(4) ) 
    1150       ELSE 
    1151          ALLOCATE( ddims(3) ) 
    1152       ENDIF 
    1153       id = iom_varid( inum, sd%clvar, ddims ) 
    1154  
    1155       !! close it 
    1156       CALL iom_close( inum ) 
     1153      !! get data grid dimensions 
     1154      id = iom_varid( sd%num, sd%clvar, ddims ) 
    11571155 
    11581156      !! now open the weights file 
    1159  
    11601157      CALL iom_open ( sd%wgtname, inum )   ! interpolation weights 
    11611158      IF( inum > 0 ) THEN 
     
    11931190         !! two possible cases: bilinear (4 weights) or bicubic (16 weights) 
    11941191         id = iom_varid(inum, 'src05', ldstop=.FALSE.) 
    1195          IF( id <= 0) THEN 
    1196             ref_wgts(nxt_wgt)%numwgt = 4 
    1197          ELSE 
    1198             ref_wgts(nxt_wgt)%numwgt = 16 
    1199          ENDIF 
    1200  
    1201          ALLOCATE( ref_wgts(nxt_wgt)%data_jpi(jpi,jpj,4) ) 
    1202          ALLOCATE( ref_wgts(nxt_wgt)%data_jpj(jpi,jpj,4) ) 
    1203          ALLOCATE( ref_wgts(nxt_wgt)%data_wgt(jpi,jpj,ref_wgts(nxt_wgt)%numwgt) ) 
     1192         IF( id <= 0 ) THEN   ;   ref_wgts(nxt_wgt)%numwgt = 4 
     1193         ELSE                 ;   ref_wgts(nxt_wgt)%numwgt = 16 
     1194         ENDIF 
     1195 
     1196         ALLOCATE( ref_wgts(nxt_wgt)%data_jpi(Nis0:Nie0,Njs0:Nje0,4) ) 
     1197         ALLOCATE( ref_wgts(nxt_wgt)%data_jpj(Nis0:Nie0,Njs0:Nje0,4) ) 
     1198         ALLOCATE( ref_wgts(nxt_wgt)%data_wgt(Nis0:Nie0,Njs0:Nje0,ref_wgts(nxt_wgt)%numwgt) ) 
    12041199 
    12051200         DO jn = 1,4 
    1206             aname = ' ' 
    1207             WRITE(aname,'(a3,i2.2)') 'src',jn 
    1208             data_tmp(:,:) = 0 
    1209             CALL iom_get ( inum, jpdom_global, aname, data_tmp(:,:) ) 
    1210             data_src(:,:) = INT(data_tmp(:,:)) 
    1211             ref_wgts(nxt_wgt)%data_jpj(:,:,jn) = 1 + (data_src(:,:)-1) / ref_wgts(nxt_wgt)%ddims(1) 
    1212             ref_wgts(nxt_wgt)%data_jpi(:,:,jn) = data_src(:,:) - ref_wgts(nxt_wgt)%ddims(1)*(ref_wgts(nxt_wgt)%data_jpj(:,:,jn)-1) 
     1201            WRITE(clname,'(a3,i2.2)') 'src',jn 
     1202            CALL iom_get ( inum, jpdom_global, clname, data_tmp(:,:), cd_type = 'Z' )   !  no call to lbc_lnk 
     1203            DO_2D_00_00 
     1204!!$               isrc = NINT(data_tmp(ji,jj)) - 1 
     1205               isrc = INT(data_tmp(ji,jj)) - 1 
     1206               ref_wgts(nxt_wgt)%data_jpi(ji,jj,jn) = 1 + MOD(isrc,  ref_wgts(nxt_wgt)%ddims(1)) 
     1207               ref_wgts(nxt_wgt)%data_jpj(ji,jj,jn) = 1 +     isrc / ref_wgts(nxt_wgt)%ddims(1) 
     1208            END_2D 
    12131209         END DO 
    12141210 
    12151211         DO jn = 1, ref_wgts(nxt_wgt)%numwgt 
    1216             aname = ' ' 
    1217             WRITE(aname,'(a3,i2.2)') 'wgt',jn 
    1218             ref_wgts(nxt_wgt)%data_wgt(:,:,jn) = 0.0 
    1219             CALL iom_get ( inum, jpdom_global, aname, ref_wgts(nxt_wgt)%data_wgt(:,:,jn) ) 
     1212            WRITE(clname,'(a3,i2.2)') 'wgt',jn 
     1213            CALL iom_get ( inum, jpdom_global, clname, data_tmp(:,:), cd_type = 'Z' )   !  no call to lbc_lnk 
     1214            DO_2D_00_00 
     1215               ref_wgts(nxt_wgt)%data_wgt(ji,jj,jn) = data_tmp(ji,jj) 
     1216            END_2D 
    12201217         END DO 
    12211218         CALL iom_close (inum) 
    12221219  
    12231220         ! find min and max indices in grid 
    1224          ref_wgts(nxt_wgt)%botleft(1) = MINVAL(ref_wgts(nxt_wgt)%data_jpi(:,:,:)) 
    1225          ref_wgts(nxt_wgt)%botleft(2) = MINVAL(ref_wgts(nxt_wgt)%data_jpj(:,:,:)) 
     1221         ref_wgts(nxt_wgt)%botleft( 1) = MINVAL(ref_wgts(nxt_wgt)%data_jpi(:,:,:)) 
     1222         ref_wgts(nxt_wgt)%botleft( 2) = MINVAL(ref_wgts(nxt_wgt)%data_jpj(:,:,:)) 
    12261223         ref_wgts(nxt_wgt)%topright(1) = MAXVAL(ref_wgts(nxt_wgt)%data_jpi(:,:,:)) 
    12271224         ref_wgts(nxt_wgt)%topright(2) = MAXVAL(ref_wgts(nxt_wgt)%data_jpj(:,:,:)) 
     
    12471244         CALL ctl_stop( '    fld_weight : unable to read the file ' ) 
    12481245      ENDIF 
    1249  
    1250       DEALLOCATE (ddims ) 
    12511246      ! 
    12521247   END SUBROUTINE fld_weight 
     
    13581353 
    13591354 
    1360    SUBROUTINE fld_interp( num, clvar, kw, kk, dta,  & 
    1361                           &         nrec, lsmfile)       
     1355   SUBROUTINE fld_interp( num, clvar, kw, kk, dta, nrec, lsmfile)       
    13621356      !!--------------------------------------------------------------------- 
    13631357      !!                    ***  ROUTINE fld_interp  *** 
     
    13771371      INTEGER, DIMENSION(3) ::   rec1_lsm, recn_lsm   ! temporary arrays for start and length in case of seaoverland 
    13781372      INTEGER ::   ii_lsm1,ii_lsm2,ij_lsm1,ij_lsm2    ! temporary indices 
    1379       INTEGER ::   jk, jn, jm, jir, jjr               ! loop counters 
     1373      INTEGER ::   ji, jj, jk, jn, jir, jjr           ! loop counters 
     1374      INTEGER ::   ipk 
    13801375      INTEGER ::   ni, nj                             ! lengths 
    13811376      INTEGER ::   jpimin,jpiwid                      ! temporary indices 
     
    13881383      REAL(wp),DIMENSION(:,:,:), ALLOCATABLE ::   ztmp_fly_dta                 ! local array of values on input grid      
    13891384      !!---------------------------------------------------------------------- 
     1385      ipk = SIZE(dta, 3) 
    13901386      ! 
    13911387      !! for weighted interpolation we have weights at four corners of a box surrounding  
     
    14171413 
    14181414 
    1419       IF( LEN( TRIM(lsmfile) ) > 0 ) THEN 
     1415      IF( LEN_TRIM(lsmfile) > 0 ) THEN 
    14201416      !! indeces for ztmp_fly_dta 
    14211417      ! -------------------------- 
     
    14761472      !! first four weights common to both bilinear and bicubic 
    14771473      !! data_jpi, data_jpj have already been shifted to (1,1) corresponding to botleft 
    1478       !! note that we have to offset by 1 into fly_dta array because of halo 
    1479       dta(:,:,:) = 0.0 
    1480       DO jk = 1,4 
    1481         DO jn = 1, jpj 
    1482           DO jm = 1,jpi 
    1483             ni = ref_wgts(kw)%data_jpi(jm,jn,jk) 
    1484             nj = ref_wgts(kw)%data_jpj(jm,jn,jk) 
    1485             dta(jm,jn,:) = dta(jm,jn,:) + ref_wgts(kw)%data_wgt(jm,jn,jk) * ref_wgts(kw)%fly_dta(ni+1,nj+1,:) 
    1486           END DO 
    1487         END DO 
     1474      !! note that we have to offset by 1 into fly_dta array because of halo added to fly_dta (rec1 definition) 
     1475      dta(:,:,:) = 0._wp 
     1476      DO jn = 1,4 
     1477         DO_3D_00_00( 1,ipk ) 
     1478            ni = ref_wgts(kw)%data_jpi(ji,jj,jn) + 1 
     1479            nj = ref_wgts(kw)%data_jpj(ji,jj,jn) + 1 
     1480            dta(ji,jj,jk) = dta(ji,jj,jk) + ref_wgts(kw)%data_wgt(ji,jj,jn) * ref_wgts(kw)%fly_dta(ni,nj,jk) 
     1481         END_3D 
    14881482      END DO 
    14891483 
    14901484      IF(ref_wgts(kw)%numwgt .EQ. 16) THEN 
    14911485 
    1492         !! fix up halo points that we couldnt read from file 
    1493         IF( jpi1 == 2 ) THEN 
    1494            ref_wgts(kw)%fly_dta(jpi1-1,:,:) = ref_wgts(kw)%fly_dta(jpi1,:,:) 
    1495         ENDIF 
    1496         IF( jpi2 + jpimin - 1 == ref_wgts(kw)%ddims(1)+1 ) THEN 
    1497            ref_wgts(kw)%fly_dta(jpi2+1,:,:) = ref_wgts(kw)%fly_dta(jpi2,:,:) 
    1498         ENDIF 
    1499         IF( jpj1 == 2 ) THEN 
    1500            ref_wgts(kw)%fly_dta(:,jpj1-1,:) = ref_wgts(kw)%fly_dta(:,jpj1,:) 
    1501         ENDIF 
    1502         IF( jpj2 + jpjmin - 1 == ref_wgts(kw)%ddims(2)+1 .AND. jpj2 .lt. jpjwid+2 ) THEN 
    1503            ref_wgts(kw)%fly_dta(:,jpj2+1,:) = 2.0*ref_wgts(kw)%fly_dta(:,jpj2,:) - ref_wgts(kw)%fly_dta(:,jpj2-1,:) 
    1504         ENDIF 
    1505  
    1506         !! if data grid is cyclic we can do better on east-west edges 
    1507         !! but have to allow for whether first and last columns are coincident 
    1508         IF( ref_wgts(kw)%cyclic ) THEN 
    1509            rec1(2) = MAX( jpjmin-1, 1 ) 
    1510            recn(1) = 1 
    1511            recn(2) = MIN( jpjwid+2, ref_wgts(kw)%ddims(2)-rec1(2)+1 ) 
    1512            jpj1 = 2 + rec1(2) - jpjmin 
    1513            jpj2 = jpj1 + recn(2) - 1 
    1514            IF( jpi1 == 2 ) THEN 
    1515               rec1(1) = ref_wgts(kw)%ddims(1) - ref_wgts(kw)%overlap 
    1516               CALL iom_get( num, jpdom_unknown, clvar, ref_wgts(kw)%col(:,jpj1:jpj2,:), nrec, kstart = rec1, kcount = recn) 
    1517               ref_wgts(kw)%fly_dta(jpi1-1,jpj1:jpj2,:) = ref_wgts(kw)%col(1,jpj1:jpj2,:) 
    1518            ENDIF 
    1519            IF( jpi2 + jpimin - 1 == ref_wgts(kw)%ddims(1)+1 ) THEN 
    1520               rec1(1) = 1 + ref_wgts(kw)%overlap 
    1521               CALL iom_get( num, jpdom_unknown, clvar, ref_wgts(kw)%col(:,jpj1:jpj2,:), nrec, kstart = rec1, kcount = recn) 
    1522               ref_wgts(kw)%fly_dta(jpi2+1,jpj1:jpj2,:) = ref_wgts(kw)%col(1,jpj1:jpj2,:) 
    1523            ENDIF 
    1524         ENDIF 
    1525  
    1526         ! gradient in the i direction 
    1527         DO jk = 1,4 
    1528           DO jn = 1, jpj 
    1529             DO jm = 1,jpi 
    1530               ni = ref_wgts(kw)%data_jpi(jm,jn,jk) 
    1531               nj = ref_wgts(kw)%data_jpj(jm,jn,jk) 
    1532               dta(jm,jn,:) = dta(jm,jn,:) + ref_wgts(kw)%data_wgt(jm,jn,jk+4) * 0.5 *         & 
    1533                                (ref_wgts(kw)%fly_dta(ni+2,nj+1,:) - ref_wgts(kw)%fly_dta(ni,nj+1,:)) 
    1534             END DO 
    1535           END DO 
    1536         END DO 
    1537  
    1538         ! gradient in the j direction 
    1539         DO jk = 1,4 
    1540           DO jn = 1, jpj 
    1541             DO jm = 1,jpi 
    1542               ni = ref_wgts(kw)%data_jpi(jm,jn,jk) 
    1543               nj = ref_wgts(kw)%data_jpj(jm,jn,jk) 
    1544               dta(jm,jn,:) = dta(jm,jn,:) + ref_wgts(kw)%data_wgt(jm,jn,jk+8) * 0.5 *         & 
    1545                                (ref_wgts(kw)%fly_dta(ni+1,nj+2,:) - ref_wgts(kw)%fly_dta(ni+1,nj,:)) 
    1546             END DO 
    1547           END DO 
    1548         END DO 
    1549  
    1550          ! gradient in the ij direction 
    1551          DO jk = 1,4 
    1552             DO jn = 1, jpj 
    1553                DO jm = 1,jpi 
    1554                   ni = ref_wgts(kw)%data_jpi(jm,jn,jk) 
    1555                   nj = ref_wgts(kw)%data_jpj(jm,jn,jk) 
    1556                   dta(jm,jn,:) = dta(jm,jn,:) + ref_wgts(kw)%data_wgt(jm,jn,jk+12) * 0.25 * ( & 
    1557                                (ref_wgts(kw)%fly_dta(ni+2,nj+2,:) - ref_wgts(kw)%fly_dta(ni  ,nj+2,:)) -   & 
    1558                                (ref_wgts(kw)%fly_dta(ni+2,nj  ,:) - ref_wgts(kw)%fly_dta(ni  ,nj  ,:))) 
    1559                END DO 
    1560             END DO 
     1486         !! fix up halo points that we couldnt read from file 
     1487         IF( jpi1 == 2 ) THEN 
     1488            ref_wgts(kw)%fly_dta(jpi1-1,:,:) = ref_wgts(kw)%fly_dta(jpi1,:,:) 
     1489         ENDIF 
     1490         IF( jpi2 + jpimin - 1 == ref_wgts(kw)%ddims(1)+1 ) THEN 
     1491            ref_wgts(kw)%fly_dta(jpi2+1,:,:) = ref_wgts(kw)%fly_dta(jpi2,:,:) 
     1492         ENDIF 
     1493         IF( jpj1 == 2 ) THEN 
     1494            ref_wgts(kw)%fly_dta(:,jpj1-1,:) = ref_wgts(kw)%fly_dta(:,jpj1,:) 
     1495         ENDIF 
     1496         IF( jpj2 + jpjmin - 1 == ref_wgts(kw)%ddims(2)+1 .AND. jpj2 .LT. jpjwid+2 ) THEN 
     1497            ref_wgts(kw)%fly_dta(:,jpj2+1,:) = 2.0*ref_wgts(kw)%fly_dta(:,jpj2,:) - ref_wgts(kw)%fly_dta(:,jpj2-1,:) 
     1498         ENDIF 
     1499          
     1500         !! if data grid is cyclic we can do better on east-west edges 
     1501         !! but have to allow for whether first and last columns are coincident 
     1502         IF( ref_wgts(kw)%cyclic ) THEN 
     1503            rec1(2) = MAX( jpjmin-1, 1 ) 
     1504            recn(1) = 1 
     1505            recn(2) = MIN( jpjwid+2, ref_wgts(kw)%ddims(2)-rec1(2)+1 ) 
     1506            jpj1 = 2 + rec1(2) - jpjmin 
     1507            jpj2 = jpj1 + recn(2) - 1 
     1508            IF( jpi1 == 2 ) THEN 
     1509               rec1(1) = ref_wgts(kw)%ddims(1) - ref_wgts(kw)%overlap 
     1510               CALL iom_get( num, jpdom_unknown, clvar, ref_wgts(kw)%col(:,jpj1:jpj2,:), nrec, kstart = rec1, kcount = recn) 
     1511               ref_wgts(kw)%fly_dta(jpi1-1,jpj1:jpj2,:) = ref_wgts(kw)%col(1,jpj1:jpj2,:) 
     1512            ENDIF 
     1513            IF( jpi2 + jpimin - 1 == ref_wgts(kw)%ddims(1)+1 ) THEN 
     1514               rec1(1) = 1 + ref_wgts(kw)%overlap 
     1515               CALL iom_get( num, jpdom_unknown, clvar, ref_wgts(kw)%col(:,jpj1:jpj2,:), nrec, kstart = rec1, kcount = recn) 
     1516               ref_wgts(kw)%fly_dta(jpi2+1,jpj1:jpj2,:) = ref_wgts(kw)%col(1,jpj1:jpj2,:) 
     1517            ENDIF 
     1518         ENDIF 
     1519         ! 
     1520!!$         DO jn = 1,4 
     1521!!$            DO_3D_00_00( 1,ipk ) 
     1522!!$               ni = ref_wgts(kw)%data_jpi(ji,jj,jn) + 1 
     1523!!$               nj = ref_wgts(kw)%data_jpj(ji,jj,jn) + 1 
     1524!!$               dta(ji,jj,jk) = dta(ji,jj,jk)   & 
     1525!!$                  ! gradient in the i direction 
     1526!!$                  &            + ref_wgts(kw)%data_wgt(ji,jj,jn+4) * 0.5_wp *                                    & 
     1527!!$                  &                (ref_wgts(kw)%fly_dta(ni+1,nj  ,jk) - ref_wgts(kw)%fly_dta(ni-1,nj  ,jk))     & 
     1528!!$                  ! gradient in the j direction 
     1529!!$                  &            + ref_wgts(kw)%data_wgt(ji,jj,jn+8) * 0.5_wp *                                    & 
     1530!!$                  &                (ref_wgts(kw)%fly_dta(ni  ,nj+1,jk) - ref_wgts(kw)%fly_dta(ni  ,nj-1,jk))     & 
     1531!!$                  ! gradient in the ij direction 
     1532!!$                  &            + ref_wgts(kw)%data_wgt(ji,jj,jn+12) * 0.25_wp *                                  & 
     1533!!$                  &               ((ref_wgts(kw)%fly_dta(ni+1,nj+1,jk) - ref_wgts(kw)%fly_dta(ni-1,nj+1,jk)) -   & 
     1534!!$                  &                (ref_wgts(kw)%fly_dta(ni+1,nj-1,jk) - ref_wgts(kw)%fly_dta(ni-1,nj-1,jk))) 
     1535!!$            END_3D 
     1536!!$         END DO 
     1537         ! 
     1538         DO jn = 1,4 
     1539            DO_3D_00_00( 1,ipk ) 
     1540               ni = ref_wgts(kw)%data_jpi(ji,jj,jn) 
     1541               nj = ref_wgts(kw)%data_jpj(ji,jj,jn) 
     1542               ! gradient in the i direction 
     1543               dta(ji,jj,jk) = dta(ji,jj,jk) + ref_wgts(kw)%data_wgt(ji,jj,jn+4) * 0.5_wp *         & 
     1544                  &                (ref_wgts(kw)%fly_dta(ni+2,nj+1,jk) - ref_wgts(kw)%fly_dta(ni  ,nj+1,jk)) 
     1545            END_3D 
     1546         END DO 
     1547         DO jn = 1,4 
     1548            DO_3D_00_00( 1,ipk ) 
     1549               ni = ref_wgts(kw)%data_jpi(ji,jj,jn) 
     1550               nj = ref_wgts(kw)%data_jpj(ji,jj,jn) 
     1551               ! gradient in the j direction 
     1552               dta(ji,jj,jk) = dta(ji,jj,jk) + ref_wgts(kw)%data_wgt(ji,jj,jn+8) * 0.5_wp *         & 
     1553                  &                (ref_wgts(kw)%fly_dta(ni+1,nj+2,jk) - ref_wgts(kw)%fly_dta(ni+1,nj  ,jk)) 
     1554            END_3D 
     1555         END DO 
     1556         DO jn = 1,4 
     1557            DO_3D_00_00( 1,ipk ) 
     1558               ni = ref_wgts(kw)%data_jpi(ji,jj,jn) 
     1559               nj = ref_wgts(kw)%data_jpj(ji,jj,jn) 
     1560               ! gradient in the ij direction 
     1561               dta(ji,jj,jk) = dta(ji,jj,jk) + ref_wgts(kw)%data_wgt(ji,jj,jn+12) * 0.25_wp * (     & 
     1562                  &                (ref_wgts(kw)%fly_dta(ni+2,nj+2,jk) - ref_wgts(kw)%fly_dta(ni  ,nj+2,jk)) -   & 
     1563                  &                (ref_wgts(kw)%fly_dta(ni+2,nj  ,jk) - ref_wgts(kw)%fly_dta(ni  ,nj  ,jk))) 
     1564            END_3D 
    15611565         END DO 
    15621566         ! 
  • NEMO/branches/2020/dev_r12558_HPC-08_epico_Extra_Halo/src/OCE/TRA/traadv_fct.F90

    r12489 r12866  
    160160               END_2D 
    161161            ELSE                             ! no cavities: only at the ocean surface 
    162                zwz(:,:,1) = pW(:,:,1) * pt(:,:,1,jn,Kbb) 
     162               DO_2D_11_11 
     163                  zwz(ji,jj,1) = pW(ji,jj,1) * pt(ji,jj,1,jn,Kbb) 
     164               END_2D 
    163165            ENDIF 
    164166         ENDIF 
  • NEMO/branches/2020/dev_r12558_HPC-08_epico_Extra_Halo/src/OCE/USR/usrdef_fmask.F90

    r12377 r12866  
    6868            ! 
    6969            IF(lwp) WRITE(numout,*) '      Gibraltar ' 
    70             ij0 = 101   ;   ij1 = 101           ! Gibraltar strait  : partial slip (pfmsk=0.5) 
     70            ij0 = 101+1   ;   ij1 = 101+1           ! Gibraltar strait  : partial slip (pfmsk=0.5) 
    7171            ii0 = 139   ;   ii1 = 140   ;   pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  0.5_wp 
    72             ij0 = 102   ;   ij1 = 102 
     72            ij0 = 102+1   ;   ij1 = 102+1 
    7373            ii0 = 139   ;   ii1 = 140   ;   pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  0.5_wp 
    7474            ! 
    7575            IF(lwp) WRITE(numout,*) '      Bab el Mandeb ' 
    76             ij0 =  87   ;   ij1 =  88           ! Bab el Mandeb : partial slip (pfmsk=1) 
     76            ij0 =  87+1   ;   ij1 =  88+1           ! Bab el Mandeb : partial slip (pfmsk=1) 
    7777            ii0 = 160   ;   ii1 = 160   ;   pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  1._wp 
    78             ij0 =  88   ;   ij1 =  88 
     78            ij0 =  88+1   ;   ij1 =  88+1 
    7979            ii0 = 159   ;   ii1 = 159   ;   pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  1._wp 
    8080            ! 
     
    9494!!gm    ! Currently these hard-wired indices relate to configuration with extend grid (jpjglo=332) 
    9595            ! 
    96             isrow = 332 - jpjglo 
     96            isrow = 332 - Nj0glo - 2 
    9797            ! 
    9898            IF(lwp) WRITE(numout,*) 
  • NEMO/branches/2020/dev_r12558_HPC-08_epico_Extra_Halo/src/OCE/USR/usrdef_hgr.F90

    r12489 r12866  
    1313   !!   usr_def_hgr   : initialize the horizontal mesh  
    1414   !!---------------------------------------------------------------------- 
    15    USE dom_oce  , ONLY: nimpp, njmpp       ! ocean space and time domain 
     15   USE dom_oce        ! ocean space and time domain 
    1616   USE par_oce        ! ocean space and time domain 
    1717   USE phycst         ! physical constants 
     
    9090      zcos_alpha =   SQRT( 2._wp ) * 0.5_wp 
    9191      ze1deg = ze1 / (ra * rad) 
    92       zlam0 = zlam1 + zcos_alpha * ze1deg * REAL( jpjglo-2 , wp ) 
    93       zphi0 = zphi1 + zsin_alpha * ze1deg * REAL( jpjglo-2 , wp ) 
     92      zlam0 = zlam1 + zcos_alpha * ze1deg * REAL( Ni0glo-1 , wp )   ! -1 to keep same results -> to be removed... 
     93      zphi0 = zphi1 + zsin_alpha * ze1deg * REAL( Nj0glo-1 , wp ) 
    9494 
    9595#if defined key_agrif 
     
    115115      !    
    116116      DO_2D_11_11 
    117          zim1 = REAL( ji + nimpp - 1 ) - 1.   ;   zim05 = REAL( ji + nimpp - 1 ) - 1.5  
    118          zjm1 = REAL( jj + njmpp - 1 ) - 1.   ;   zjm05 = REAL( jj + njmpp - 1 ) - 1.5  
     117         zim1 = REAL( mig(ji)-1, wp ) - 1.   ;   zim05 = REAL( mig(ji)-1, wp ) - 1.5   ! -1 to keep same results -> to be removed... 
     118         zjm1 = REAL( mjg(jj)-1, wp ) - 1.   ;   zjm05 = REAL( mjg(jj)-1, wp ) - 1.5   ! -1 to keep same results -> to be removed... 
    119119         !    
    120120         !glamt(i,j) longitude at T-point 
  • NEMO/branches/2020/dev_r12558_HPC-08_epico_Extra_Halo/src/OCE/USR/usrdef_nam.F90

    r12377 r12866  
    7070      kk_cfg = nn_GYRE 
    7171      ! 
    72       kpi = 30 * nn_GYRE + 2        ! Global Domain size 
    73       kpj = 20 * nn_GYRE + 2 
     72      kpi = 30 * nn_GYRE + 1       ! Global Domain size 
     73      kpj = 20 * nn_GYRE + 1 
    7474#if defined key_agrif 
    7575      IF( .NOT. Agrif_Root() ) THEN 
    76          kpi  = nbcellsx + 2 + 2*nbghostcells 
    77          kpj  = nbcellsy + 2 + 2*nbghostcells 
     76         kpi  = nbcellsx + 2*nbghostcells 
     77         kpj  = nbcellsy + 2*nbghostcells 
    7878      ENDIF 
    7979#endif 
     
    9393         IF( Agrif_Root() ) THEN 
    9494#endif 
    95          WRITE(numout,*) '         jpiglo = 30*nn_GYRE+2                            jpiglo = ', kpi 
    96          WRITE(numout,*) '         jpjglo = 20*nn_GYRE+2                            jpjglo = ', kpj 
     95         WRITE(numout,*) '      Ni0glo = 30*nn_GYRE                              Ni0glo = ', kpi 
     96         WRITE(numout,*) '      Nj0glo = 20*nn_GYRE                              Nj0glo = ', kpj 
    9797#if defined key_agrif 
    9898         ENDIF 
    9999#endif 
    100          WRITE(numout,*) '      number of model levels                              jpkglo = ', kpk 
     100         WRITE(numout,*) '      number of model levels                           jpkglo = ', kpk 
    101101         WRITE(numout,*) '   ' 
    102          WRITE(numout,*) '   Lateral b.c. of the global domain set to closed        jperio = ', kperio 
     102         WRITE(numout,*) '   Lateral b.c. of the global domain set to closed     jperio = ', kperio 
    103103      ENDIF 
    104104      ! 
  • NEMO/branches/2020/dev_r12558_HPC-08_epico_Extra_Halo/src/OCE/USR/usrdef_zgr.F90

    r12377 r12866  
    198198      IF(lwp) WRITE(numout,*) '       GYRE case : closed flat box ocean without ocean cavities' 
    199199      ! 
    200       z2d(:,:) = REAL( jpkm1 , wp )          ! flat bottom 
     200      z2d(:,:) = REAL( jpkm1 , wp )                              ! flat bottom 
     201      z2d(mi0(  1 ):mi1(jpiglo),mj0(Njs0):mj1( Njs0 )) = 0._wp   ! line   number Njs0 at 0 
     202      z2d(mi0(Nis0):mi1( Nis0 ),mj0(  1 ):mj1(jpjglo)) = 0._wp   ! column number Nis0 at 0 
    201203      ! 
    202204      CALL lbc_lnk( 'usrdef_zgr', z2d, 'T', 1. )           ! set surrounding land to zero (here jperio=0 ==>> closed) 
  • NEMO/branches/2020/dev_r12558_HPC-08_epico_Extra_Halo/src/OFF/dtadyn.F90

    r12739 r12866  
    122122      ! 
    123123      IF( kt == nit000 ) THEN    ;    nprevrec = 0 
    124       ELSE                       ;    nprevrec = sf_dyn(jf_tem)%nrec_a(2) 
     124      ELSE                       ;    nprevrec = sf_dyn(jf_tem)%nrec(2,sf_dyn(jf_tem)%naa) 
    125125      ENDIF 
    126126      CALL fld_read( kt, 1, sf_dyn )      !=  read data at kt time step   ==! 
     
    434434      ! 
    435435      IF( kt == nit000 ) THEN    ;    nprevrec = 0 
    436       ELSE                       ;    nprevrec = sf_dyn(jf_tem)%nrec_a(2) 
     436      ELSE                       ;    nprevrec = sf_dyn(jf_tem)%nrec(2,sf_dyn(jf_tem)%naa) 
    437437      ENDIF 
    438438      CALL fld_read( kt, 1, sf_dyn )      !=  read data at kt time step   ==! 
     
    686686      !!--------------------------------------------------------------------- 
    687687      ! 
    688       IF( sf_dyn(jf_tem)%ln_tint ) THEN    ! Computes slopes (here avt is used as workspace)                        
     688      IF( sf_dyn(jf_tem)%ln_tint ) THEN    ! Computes slopes (here avt is used as workspace) 
     689         ! 
    689690         IF( kt == nit000 ) THEN 
    690691            IF(lwp) WRITE(numout,*) ' Compute new slopes at kt = ', kt 
    691             zts(:,:,:,jp_tem) = sf_dyn(jf_tem)%fdta(:,:,:,1) * tmask(:,:,:)   ! temperature 
    692             zts(:,:,:,jp_sal) = sf_dyn(jf_sal)%fdta(:,:,:,1) * tmask(:,:,:)   ! salinity  
    693             avt(:,:,:)        = sf_dyn(jf_avt)%fdta(:,:,:,1) * tmask(:,:,:)   ! vertical diffusive coef. 
     692            zts(:,:,:,jp_tem) = sf_dyn(jf_tem)%fdta(:,:,:,sf_dyn(jf_tem)%nbb) * tmask(:,:,:)   ! temperature 
     693            zts(:,:,:,jp_sal) = sf_dyn(jf_sal)%fdta(:,:,:,sf_dyn(jf_sal)%nbb) * tmask(:,:,:)   ! salinity  
     694            avt(:,:,:)        = sf_dyn(jf_avt)%fdta(:,:,:,sf_dyn(jf_avt)%nbb) * tmask(:,:,:)   ! vertical diffusive coef. 
    694695            CALL compute_slopes( kt, zts, zuslp, zvslp, zwslpi, zwslpj, Kbb, Kmm ) 
    695696            uslpdta (:,:,:,1) = zuslp (:,:,:)  
     
    698699            wslpjdta(:,:,:,1) = zwslpj(:,:,:)  
    699700            ! 
    700             zts(:,:,:,jp_tem) = sf_dyn(jf_tem)%fdta(:,:,:,2) * tmask(:,:,:)   ! temperature 
    701             zts(:,:,:,jp_sal) = sf_dyn(jf_sal)%fdta(:,:,:,2) * tmask(:,:,:)   ! salinity  
    702             avt(:,:,:)        = sf_dyn(jf_avt)%fdta(:,:,:,2) * tmask(:,:,:)   ! vertical diffusive coef. 
     701            zts(:,:,:,jp_tem) = sf_dyn(jf_tem)%fdta(:,:,:,sf_dyn(jf_tem)%naa) * tmask(:,:,:)   ! temperature 
     702            zts(:,:,:,jp_sal) = sf_dyn(jf_sal)%fdta(:,:,:,sf_dyn(jf_sal)%naa) * tmask(:,:,:)   ! salinity  
     703            avt(:,:,:)        = sf_dyn(jf_avt)%fdta(:,:,:,sf_dyn(jf_avt)%naa) * tmask(:,:,:)   ! vertical diffusive coef. 
    703704            CALL compute_slopes( kt, zts, zuslp, zvslp, zwslpi, zwslpj, Kbb, Kmm ) 
    704705            uslpdta (:,:,:,2) = zuslp (:,:,:)  
     
    709710           !  
    710711           iswap = 0 
    711            IF( sf_dyn(jf_tem)%nrec_a(2) - nprevrec /= 0 )  iswap = 1 
    712            IF( nsecdyn > sf_dyn(jf_tem)%nrec_b(2) .AND. iswap == 1 )  THEN    ! read/update the after data 
     712           IF( sf_dyn(jf_tem)%nrec(2,sf_dyn(jf_tem)%naa) - nprevrec /= 0 )  iswap = 1 
     713           IF( nsecdyn > sf_dyn(jf_tem)%nrec(2,sf_dyn(jf_tem)%nbb) .AND. iswap == 1 )  THEN    ! read/update the after data 
    713714              IF(lwp) WRITE(numout,*) ' Compute new slopes at kt = ', kt 
    714715              uslpdta (:,:,:,1) =  uslpdta (:,:,:,2)         ! swap the data 
     
    717718              wslpjdta(:,:,:,1) =  wslpjdta(:,:,:,2)  
    718719              ! 
    719               zts(:,:,:,jp_tem) = sf_dyn(jf_tem)%fdta(:,:,:,2) * tmask(:,:,:)   ! temperature 
    720               zts(:,:,:,jp_sal) = sf_dyn(jf_sal)%fdta(:,:,:,2) * tmask(:,:,:)   ! salinity  
    721               avt(:,:,:)        = sf_dyn(jf_avt)%fdta(:,:,:,2) * tmask(:,:,:)   ! vertical diffusive coef. 
     720              zts(:,:,:,jp_tem) = sf_dyn(jf_tem)%fdta(:,:,:,sf_dyn(jf_tem)%naa) * tmask(:,:,:)   ! temperature 
     721              zts(:,:,:,jp_sal) = sf_dyn(jf_sal)%fdta(:,:,:,sf_dyn(jf_sal)%naa) * tmask(:,:,:)   ! salinity  
     722              avt(:,:,:)        = sf_dyn(jf_avt)%fdta(:,:,:,sf_dyn(jf_avt)%naa) * tmask(:,:,:)   ! vertical diffusive coef. 
    722723              CALL compute_slopes( kt, zts, zuslp, zvslp, zwslpi, zwslpj, Kbb, Kmm ) 
    723724              ! 
     
    731732      ! 
    732733      IF( sf_dyn(jf_tem)%ln_tint )  THEN 
    733          ztinta =  REAL( nsecdyn - sf_dyn(jf_tem)%nrec_b(2), wp )  & 
    734             &    / REAL( sf_dyn(jf_tem)%nrec_a(2) - sf_dyn(jf_tem)%nrec_b(2), wp ) 
     734         ztinta =  REAL( nsecdyn - sf_dyn(jf_tem)%nrec(2,sf_dyn(jf_tem)%nbb), wp )  & 
     735            &    / REAL( sf_dyn(jf_tem)%nrec(2,sf_dyn(jf_tem)%naa) - sf_dyn(jf_tem)%nrec(2,sf_dyn(jf_tem)%nbb), wp ) 
    735736         ztintb =  1. - ztinta 
    736737         IF( l_ldfslp .AND. .NOT.lk_c1d ) THEN    ! Computes slopes (here avt is used as workspace) 
  • NEMO/branches/2020/dev_r12558_HPC-08_epico_Extra_Halo/tests/BENCH/MY_SRC/usrdef_zgr.F90

    r12377 r12866  
    191191      ! 
    192192      z2d(:,:) = REAL( jpkm1 , wp )          ! flat bottom 
     193      IF( .NOT. (nbondj == 1 .OR. nbondj == 0 .OR. l_Jperio) )   & 
     194         z2d(mi0(  1 ):mi1(jpiglo),mj0(Njs0):mj1( Njs0 )) = 0._wp   ! line   number Njs0 at 0 
     195      IF( .NOT. (nbondi == 1 .OR. nbondi == 0 .OR. l_Iperio) )   &  
     196         z2d(mi0(Nis0):mi1( Nis0 ),mj0(  1 ):mj1(jpjglo)) = 0._wp   ! column number Nis0 at 0 
    193197      ! 
    194198      IF( jperio == 3 .OR. jperio ==4 ) THEN   ! add a small island in the upper corners to avoid model instabilities... 
Note: See TracChangeset for help on using the changeset viewer.