Changeset 2821


Ignore:
Timestamp:
2011-08-09T11:37:57+02:00 (9 years ago)
Author:
cetlod
Message:

Use of fldread for offline, see ticket #853

Location:
branches/2011/dev_r2787_LOCEAN_offline_fldread/NEMOGCM
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • branches/2011/dev_r2787_LOCEAN_offline_fldread/NEMOGCM/CONFIG/ORCA2_OFF_PISCES/EXP00/namelist

    r2715 r2821  
    560560/ 
    561561!----------------------------------------------------------------------- 
    562 &namdyn        !   offline dynamics read in files                       ("key_offline") 
    563 !----------------------------------------------------------------------- 
    564     ndtadyn   =  73        ! number of period in the file for one year 
    565     ndtatot   =  73        ! total number of period in the file 
    566     nsptint   =  1         ! indicator for time interpolation 
    567     lperdyn   = .true.     ! periodicity of the unique file (T) 
    568                            ! F  (default)   computed with Blanke' scheme 
    569     cfile_grid_T = 'dyna_grid_T.nc' ! name of grid_T file 
    570     cfile_grid_U = 'dyna_grid_U.nc' ! name of grid_U file 
    571     cfile_grid_V = 'dyna_grid_V.nc' ! name of grid_V file 
    572     cfile_grid_W = 'dyna_grid_W.nc' ! name of grid_W file 
    573 / 
    574  
     562&namdta_dyn        !   offline dynamics read in files                ("key_offline") 
     563!----------------------------------------------------------------------- 
     564!            !  file name  ! frequency (hours) ! variable  ! time interp. !  clim  ! 'yearly'/ ! weights  ! rotation ! 
     565!            !             !  (if <0  months)  !   name    !   (logical)  !  (T/F) ! 'monthly' ! filename ! pairing  ! 
     566   sn_tem  = 'dyna_grid_T' ,    120            , 'votemper' ,  .true.    , .true. ,   'yearly'  , ''       , '' 
     567   sn_sal  = 'dyna_grid_T' ,    120            , 'vosaline' ,  .true.    , .true. ,   'yearly'  , ''       , '' 
     568   sn_mld  = 'dyna_grid_T' ,    120            , 'somixhgt' ,  .true.    , .true. ,   'yearly'  , ''       , '' 
     569   sn_emp  = 'dyna_grid_T' ,    120            , 'sowaflcd' ,  .true.    , .true. ,   'yearly'  , ''       , '' 
     570   sn_ice  = 'dyna_grid_T' ,    120            , 'soicecov' ,  .true.    , .true. ,   'yearly'  , ''       , '' 
     571   sn_qsr  = 'dyna_grid_T' ,    120            , 'soshfldo' ,  .true.    , .true. ,   'yearly'  , ''       , '' 
     572   sn_wnd  = 'dyna_grid_T' ,    120            , 'sowindsp' ,  .true.    , .true. ,   'yearly'  , ''       , '' 
     573   sn_uwd  = 'dyna_grid_U' ,    120            , 'vozocrtx' ,  .true.    , .true. ,   'yearly'  , ''       , '' 
     574   sn_vwd  = 'dyna_grid_V' ,    120            , 'vomecrty' ,  .true.    , .true. ,   'yearly'  , ''       , '' 
     575   sn_wwd  = 'dyna_grid_W' ,    120            , 'vovecrtz' ,  .true.    , .true. ,   'yearly'  , ''       , '' 
     576   sn_avt  = 'dyna_grid_W' ,    120            , 'voddmavs' ,  .true.    , .true. ,   'yearly'  , ''       , '' 
     577   sn_ubl  = 'dyna_grid_U' ,    120            , 'sobblcox' ,  .true.    , .true. ,   'yearly'  , ''       , '' 
     578   sn_vbl  = 'dyna_grid_V' ,    120            , 'sobblcoy' ,  .true.    , .true. ,   'yearly'  , ''       , '' 
     579   sn_eiw  = 'dyna_grid_W' ,    120            , 'soleaeiw' ,  .true.    , .true. ,   'yearly'  , ''       , '' 
     580! 
     581   cn_dir      = './'      !  root directory for the location of the dynamical files 
     582   ln_degrad   =  .false.  !  flag for degradation -                requires ("key_degrad") 
     583   ln_dynwzv   =  .true.   !  computation of vertical velocity instead of using the one read in file 
     584   ln_dynbbl   =  .true.   !  bbl coef are in files, so read them - requires ("key_trabbl") 
     585/ 
    575586!!====================================================================== 
    576587!!             Tracers & Dynamics vertical physics namelists 
  • branches/2011/dev_r2787_LOCEAN_offline_fldread/NEMOGCM/NEMO/OFF_SRC/dommsk.F90

    r2715 r2821  
    1919 
    2020   PUBLIC   dom_msk    ! routine called by inidom.F90 
    21  
    22    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   facvol   !: volume for degraded regions 
    2321 
    2422   !! * Substitutions 
     
    5654      END IF 
    5755      ! 
    58 #if defined key_degrad 
    59       IF( dom_msk_alloc() /= 0 )   CALL ctl_stop('STOP','dom_msk: unable to allocate arrays') 
    60 #endif 
    61  
    6256      ! Interior domain mask (used for global sum) 
    6357      ! -------------------- 
     
    10498      ! 
    10599   END SUBROUTINE dom_msk 
    106  
    107  
    108    INTEGER FUNCTION dom_msk_alloc() 
    109       !!--------------------------------------------------------------------- 
    110       !!                 ***  FUNCTION dom_msk_alloc  *** 
    111       !!--------------------------------------------------------------------- 
    112       ALLOCATE( facvol(jpi,jpj,jpk) , STAT=dom_msk_alloc ) 
    113       IF( dom_msk_alloc /= 0 )   CALL ctl_warn('dom_msk_alloc : failed to allocate facvol array') 
    114       ! 
    115    END FUNCTION dom_msk_alloc 
    116  
    117100   !!====================================================================== 
    118101END MODULE dommsk 
  • branches/2011/dev_r2787_LOCEAN_offline_fldread/NEMOGCM/NEMO/OFF_SRC/domrea.F90

    r2787 r2821  
    1616   USE dommsk          ! domain: masks 
    1717   USE lbclnk          ! lateral boundary condition - MPP exchanges 
     18   USE trc_oce 
    1819   USE lib_mpp  
    1920   USE in_out_manager 
  • branches/2011/dev_r2787_LOCEAN_offline_fldread/NEMOGCM/NEMO/OFF_SRC/dtadyn.F90

    r2764 r2821  
    1111   !!              -   ! 2005-12 (C. Ethe) Adapted for DEGINT 
    1212   !!             3.0  ! 2007-06 (C. Ethe) use of iom module 
    13    !!              -   ! 2007-09  (C. Ethe)  add swap_dyn_data 
    1413   !!             3.3  ! 2010-11 (C. Ethe) Full reorganization of the off-line: phasing with the on-line 
     14   !!             3.4  ! 2011-05 (C. Ethe) Use of fldread 
    1515   !!---------------------------------------------------------------------- 
    1616 
    1717   !!---------------------------------------------------------------------- 
    18    !!   dta_dyn_init : initialization, namelist read, and parameters control 
     18   !!   dta_dyn_init : initialization, namelist read, and SAVEs control 
    1919   !!   dta_dyn      : Interpolation of the fields 
    2020   !!---------------------------------------------------------------------- 
     
    2424   USE zdf_oce         ! ocean vertical physics: variables 
    2525   USE sbc_oce         ! surface module: variables 
     26   USE trc_oce         ! share ocean/biogeo variables 
    2627   USE phycst          ! physical constants 
    2728   USE trabbl          ! active tracer: bottom boundary layer 
     
    3637   USE iom             ! I/O library 
    3738   USE lib_mpp         ! distributed memory computing library 
    38    USE prtctl          !  print control 
     39   USE prtctl          ! print control 
     40   USE fldread         ! read input fields  
    3941 
    4042   IMPLICIT NONE 
     
    4446   PUBLIC   dta_dyn        ! called by step.F90 
    4547 
    46    LOGICAL, PUBLIC ::   lperdyn = .TRUE.   !: boolean for periodic fields or not 
    47    LOGICAL, PUBLIC ::   lfirdyn = .TRUE.   !: boolean for the first call or not 
    48  
    49    INTEGER, PUBLIC ::   ndtadyn = 73       !: Number of dat in one year 
    50    INTEGER, PUBLIC ::   ndtatot = 73       !: Number of data in the input field 
    51    INTEGER, PUBLIC ::   nsptint = 1        !: type of spatial interpolation 
    52  
    53    CHARACTER(len=45) ::   cfile_grid_T = 'dyna_grid_T.nc'   ! name of the grid_T file 
    54    CHARACTER(len=45) ::   cfile_grid_U = 'dyna_grid_U.nc'   ! name of the grid_U file 
    55    CHARACTER(len=45) ::   cfile_grid_V = 'dyna_grid_V.nc'   ! name of the grid_V file 
    56    CHARACTER(len=45) ::   cfile_grid_W = 'dyna_grid_W.nc'   ! name of the grid_W file 
    57     
    58    REAL(wp) ::   rnspdta    ! number of time step per 2 consecutives data 
    59    REAL(wp) ::   rnspdta2   ! rnspdta * 0.5 
    60  
    61    INTEGER ::   ndyn1, ndyn2    ! 
    62    INTEGER ::   nlecoff = 0     ! switch for the first read 
    63    INTEGER ::   numfl_t, numfl_u, numfl_v, numfl_w 
    64  
    65    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: tdta       ! temperature at two consecutive times 
    66    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: sdta       ! salinity at two consecutive times 
    67    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: udta       ! zonal velocity at two consecutive times 
    68    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: vdta       ! meridional velocity at two consecutive times 
    69    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: wdta       ! vertical velocity at two consecutive times 
    70    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: avtdta     ! vertical diffusivity coefficient 
    71  
    72    REAL(wp), ALLOCATABLE, SAVE,   DIMENSION(:,:,:) :: hmlddta    ! mixed layer depth at two consecutive times 
    73    REAL(wp), ALLOCATABLE, SAVE,   DIMENSION(:,:,:) :: wspddta    ! wind speed at two consecutive times 
    74    REAL(wp), ALLOCATABLE, SAVE,   DIMENSION(:,:,:) :: frlddta    ! sea-ice fraction at two consecutive times 
    75    REAL(wp), ALLOCATABLE, SAVE,   DIMENSION(:,:,:) :: empdta     ! E-P at two consecutive times 
    76    REAL(wp), ALLOCATABLE, SAVE,   DIMENSION(:,:,:) :: qsrdta     ! short wave heat flux at two consecutive times 
    77    REAL(wp), ALLOCATABLE, SAVE,   DIMENSION(:,:,:) :: bblxdta    ! bbl diffusive coef. in the x direction at 2 consecutive times  
    78    REAL(wp), ALLOCATABLE, SAVE,   DIMENSION(:,:,:) :: bblydta    ! bbl diffusive coef. in the y direction at 2 consecutive times  
    79    LOGICAL :: l_offbbl 
    80 #if defined key_ldfslp && ! defined key_c1d 
    81    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: uslpdta    ! zonal isopycnal slopes 
    82    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: vslpdta    ! meridional isopycnal slopes 
    83    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: wslpidta   ! zonal diapycnal slopes 
    84    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: wslpjdta   ! meridional diapycnal slopes 
    85 #endif 
    86 #if ! defined key_degrad &&  defined key_traldf_c2d && defined key_traldf_eiv  
    87    REAL(wp), ALLOCATABLE, SAVE,   DIMENSION(:,:,:) :: aeiwdta    ! G&M coefficient 
    88 #endif 
    89 #if defined key_degrad 
    90    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: ahtudta, ahtvdta, ahtwdta   ! Lateral diffusivity 
    91 # if defined key_traldf_eiv 
    92    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: aeiudta, aeivdta, aeiwdta   ! G&M coefficient 
    93 # endif 
    94 #endif 
     48   CHARACTER(len=100) ::   cn_dir     = './'    !: Root directory for location of ssr files 
     49   LOGICAL            ::   ln_dynwzv  = .true.  !: vertical velocity read in a file (T) or computed from u/v (F) 
     50   LOGICAL            ::   ln_dynbbl  = .true.  !: bbl coef read in a file (T) or computed (F) 
     51   LOGICAL            ::   ln_degrad  = .false. !: degradation option enabled or not  
     52 
     53   INTEGER  , PARAMETER ::   jpfld = 19     ! maximum number of files to read 
     54   INTEGER  , SAVE      ::   jf_tem         ! index of temperature 
     55   INTEGER  , SAVE      ::   jf_sal         ! index of salinity 
     56   INTEGER  , SAVE      ::   jf_uwd         ! index of u-wind 
     57   INTEGER  , SAVE      ::   jf_vwd         ! index of v-wind 
     58   INTEGER  , SAVE      ::   jf_wwd         ! index of w-wind 
     59   INTEGER  , SAVE      ::   jf_avt         ! index of Kz 
     60   INTEGER  , SAVE      ::   jf_mld         ! index of mixed layer deptht 
     61   INTEGER  , SAVE      ::   jf_emp         ! index of water flux 
     62   INTEGER  , SAVE      ::   jf_qsr         ! index of solar radiation 
     63   INTEGER  , SAVE      ::   jf_wnd         ! index of wind speed 
     64   INTEGER  , SAVE      ::   jf_ice         ! index of sea ice cover 
     65   INTEGER  , SAVE      ::   jf_ubl         ! index of u-bbl coef 
     66   INTEGER  , SAVE      ::   jf_vbl         ! index of v-bbl coef 
     67   INTEGER  , SAVE      ::   jf_ahu         ! index of u-diffusivity coef 
     68   INTEGER  , SAVE      ::   jf_ahv         ! index of v-diffusivity coef  
     69   INTEGER  , SAVE      ::   jf_ahw         ! index of w-diffusivity coef 
     70   INTEGER  , SAVE      ::   jf_eiu         ! index of u-eiv 
     71   INTEGER  , SAVE      ::   jf_eiv         ! index of v-eiv 
     72   INTEGER  , SAVE      ::   jf_eiw         ! index of w-eiv 
     73 
     74   TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_dyn  ! structure of input fields (file informations, fields read) 
     75   !                                               !  
     76   REAL(wp) , ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: wdta       ! vertical velocity at 2 time step 
     77   REAL(wp) , ALLOCATABLE, SAVE, DIMENSION(:,:,:  ) :: wnow       ! vertical velocity at 2 time step 
     78   REAL(wp) , ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: uslpdta    ! zonal isopycnal slopes 
     79   REAL(wp) , ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: vslpdta    ! meridional isopycnal slopes 
     80   REAL(wp) , ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: wslpidta   ! zonal diapycnal slopes 
     81   REAL(wp) , ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: wslpjdta   ! meridional diapycnal slopes 
     82   REAL(wp) , ALLOCATABLE, SAVE, DIMENSION(:,:,:)   :: uslpnow    ! zonal isopycnal slopes 
     83   REAL(wp) , ALLOCATABLE, SAVE, DIMENSION(:,:,:)   :: vslpnow    ! meridional isopycnal slopes 
     84   REAL(wp) , ALLOCATABLE, SAVE, DIMENSION(:,:,:)   :: wslpinow   ! zonal diapycnal slopes 
     85   REAL(wp) , ALLOCATABLE, SAVE, DIMENSION(:,:,:)   :: wslpjnow   ! meridional diapycnal slopes 
     86 
     87   INTEGER :: nrecprev_tem , nrecprev_uwd 
    9588 
    9689   !! * Substitutions 
     
    108101      !!                  ***  ROUTINE dta_dyn  *** 
    109102      !! 
    110       !! ** Purpose :   Prepares dynamics and physics fields from an NEMO run 
    111       !!              for an off-line simulation of passive tracers 
    112       !! 
    113       !! ** Method : calculates the position of DATA to read READ DATA  
    114       !!             (example month changement) computes slopes IF needed 
    115       !!             interpolates DATA IF needed 
    116       !!---------------------------------------------------------------------- 
     103      !! ** Purpose :  Prepares dynamics and physics fields from a NEMO run 
     104      !!               for an off-line simulation of passive tracers 
     105      !! 
     106      !! ** Method : calculates the position of data  
     107      !!             - computes slopes if needed 
     108      !!             - interpolates data if needed 
     109      !!---------------------------------------------------------------------- 
     110      ! 
     111      USE oce, ONLY:  zts    => tsa  
     112      USE oce, ONLY:  zuslp  => ua   , zvslp  => va 
     113      USE oce, ONLY:  zwslpi => rotb , zwslpj => rotn 
     114      USE oce, ONLY:  zu     => ub   , zv     => vb,  zw => hdivb 
     115      ! 
    117116      INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
    118       !! 
    119       INTEGER  ::   iper, iperm1, iswap, izt   ! local integers  
    120       REAL(wp) ::   zt, zweigh                 ! local scalars 
    121       !!---------------------------------------------------------------------- 
    122  
    123       zt     = ( REAL(kt,wp) + rnspdta2 ) / rnspdta 
    124       izt    = INT( zt ) 
    125       zweigh = zt - REAL( INT(zt), wp ) 
    126  
    127       IF( lperdyn ) THEN   ;   iperm1 = MOD( izt, ndtadyn ) 
    128       ELSE                 ;   iperm1 = MOD( izt, ndtatot - 1 ) + 1 
    129       ENDIF 
    130  
    131       iper = iperm1 + 1 
    132       IF( iperm1 == 0 ) THEN 
    133           IF( lperdyn ) THEN 
    134               iperm1 = ndtadyn 
    135           ELSE  
    136               IF( lfirdyn ) THEN  
    137                   IF(lwp) WRITE (numout,*) 'dta_dyn:  dynamic file is not periodic with or without interpolation    & 
    138                      &                                we take the first value for the previous period iperm1 = 0  ' 
    139               END IF 
    140           END IF  
    141       END IF  
    142  
    143       iswap  = 0 
    144  
    145       ! 1. First call lfirdyn = true 
    146       ! ---------------------------- 
    147  
    148       IF( lfirdyn ) THEN 
    149          ndyn1 = iperm1         ! store the information of the period read 
    150          ndyn2 = iper 
    151           
    152          IF(lwp) THEN 
    153             WRITE (numout,*) ' dynamics data read for the period ndyn1 =', ndyn1,   & 
    154                &             ' and for the period ndyn2 = ', ndyn2 
    155             WRITE (numout,*) ' time step is : ', kt 
    156             WRITE (numout,*) ' we have ndtadyn = ', ndtadyn, ' records in the dynamic file for one year' 
    157          END IF 
    158          ! 
    159          CALL dynrea( kt, MAX( 1, iperm1) )           ! data read for the iperm1 period 
    160          ! 
    161          CALL swap_dyn_data            ! swap from record 2 to 1 
    162          ! 
    163          iswap = 1        !  indicates swap 
    164          ! 
    165          CALL dynrea( kt, iper )       ! data read for the iper period 
    166          ! 
    167          lfirdyn = .FALSE.    ! trace the first call 
    168       ENDIF 
    169       ! 
    170       ! And now what we have to do at every time step 
    171       ! check the validity of the period in memory 
    172       ! 
    173       IF( iperm1 /= ndyn1 ) THEN  
    174          ! 
    175          IF( iperm1 == 0 ) THEN 
    176             IF(lwp) THEN 
    177                WRITE (numout,*) ' dynamic file is not periodic with periodic interpolation' 
    178                WRITE (numout,*) ' we take the last value for the last period ' 
    179                WRITE (numout,*) ' iperm1 = 12,   iper = 13  ' 
     117      ! 
     118      INTEGER  ::   ji, jj     ! dummy loop indices 
     119      INTEGER  ::   isecsbc    ! number of seconds between Jan. 1st 00h of nit000 year and the middle of time step 
     120      REAL(wp) ::   ztinta     ! ratio applied to after  records when doing time interpolation 
     121      REAL(wp) ::   ztintb     ! ratio applied to before records when doing time interpolation 
     122      INTEGER  ::   iswap_tem, iswap_uwd    !  
     123      !!---------------------------------------------------------------------- 
     124       
     125      isecsbc = nsec_year + nsec1jan000  
     126       
     127      IF( kt /= nit000 ) THEN 
     128          nrecprev_tem = sf_dyn(jf_tem)%nrec_a(2) 
     129          nrecprev_uwd = sf_dyn(jf_uwd)%nrec_a(2) 
     130      ENDIF 
     131 
     132      CALL fld_read( kt, 1, sf_dyn )      !==   read data at kt time step   ==! 
     133 
     134      !  
     135      IF( lk_ldfslp ) THEN    ! Computes slopes (here avt is used as workspace)                        
     136         iswap_tem = 0 
     137         IF(  kt /= nit000 .AND. ( sf_dyn(jf_tem)%nrec_a(2) - nrecprev_tem ) /= 0 )  iswap_tem = 1 
     138         IF( ( isecsbc > sf_dyn(jf_tem)%nrec_b(2) .AND. iswap_tem == 1 ) .OR. kt == nit000 )  THEN    ! read/update the after data 
     139            write(numout,*) 
     140            write(numout,*) ' Compute new slopes at kt = ', kt 
     141            IF( sf_dyn(jf_tem)%ln_tint ) THEN                 ! time interpolation of data 
     142               uslpdta (:,:,:,1) =  uslpdta (:,:,:,2)     ! swap the data 
     143               vslpdta (:,:,:,1) =  vslpdta (:,:,:,2)   
     144               wslpidta(:,:,:,1) =  wslpidta(:,:,:,2)  
     145               wslpjdta(:,:,:,1) =  wslpjdta(:,:,:,2)  
     146               ! 
     147               zts(:,:,:,jf_tem) = sf_dyn(jf_tem)%fdta(:,:,:,2) * tmask(:,:,:)   ! temperature 
     148               zts(:,:,:,jf_sal) = sf_dyn(jf_sal)%fdta(:,:,:,2) * tmask(:,:,:)   ! salinity  
     149               avt(:,:,:)        = sf_dyn(jf_avt)%fdta(:,:,:,2) * tmask(:,:,:)   ! vertical diffusive coef. 
     150               CALL dta_dyn_slp( kt, zts, zuslp, zvslp, zwslpi, zwslpj ) 
     151               uslpdta (:,:,:,2) = zuslp (:,:,:)  
     152               vslpdta (:,:,:,2) = zvslp (:,:,:)  
     153               wslpidta(:,:,:,2) = zwslpi(:,:,:)  
     154               wslpjdta(:,:,:,2) = zwslpj(:,:,:)  
     155            ELSE 
     156               zts(:,:,:,jf_tem) = sf_dyn(jf_tem)%fnow(:,:,:) * tmask(:,:,:) 
     157               zts(:,:,:,jf_sal) = sf_dyn(jf_sal)%fnow(:,:,:) * tmask(:,:,:) 
     158               avt(:,:,:)        = sf_dyn(jf_avt)%fnow(:,:,:) * tmask(:,:,:) 
     159               CALL dta_dyn_slp( kt, zts, zuslp, zvslp, zwslpi, zwslpj ) 
     160               uslpnow (:,:,:)   = zuslp (:,:,:)  
     161               vslpnow (:,:,:)   = zvslp (:,:,:)  
     162               wslpinow(:,:,:)   = zwslpi(:,:,:)  
     163               wslpjnow(:,:,:)   = zwslpj(:,:,:)  
    180164            ENDIF 
    181             iperm1 = 12 
    182             iper   = 13 
    183          ENDIF 
    184          ! 
    185          CALL swap_dyn_data         ! We have to prepare a new read of data : swap from record 2 to 1 
    186          ! 
    187          iswap = 1                  !  indicates swap 
    188          ! 
    189          CALL dynrea( kt, iper )    ! data read for the iper period 
    190          ! 
    191          ndyn1 = ndyn2         ! store the information of the period read 
    192          ndyn2 = iper 
    193          ! 
    194          IF(lwp) THEN 
    195             WRITE (numout,*) ' dynamics data read for the period ndyn1 =', ndyn1,   & 
    196                &             ' and for the period ndyn2 = ', ndyn2 
    197             WRITE (numout,*) ' time step is : ', kt 
    198          END IF 
    199          ! 
    200       END IF 
    201       ! 
    202       ! Compute the data at the given time step 
    203       !----------------------------------------      
    204  
    205       IF( nsptint == 0 ) THEN          ! No space interpolation, data are probably correct 
    206          !                             ! We have to initialize data if we have changed the period          
    207          CALL assign_dyn_data 
    208       ELSEIF( nsptint == 1 ) THEN      ! linear interpolation 
    209          CALL linear_interp_dyn_data( zweigh ) 
    210       ELSE                             ! other interpolation 
    211          WRITE (numout,*) ' this kind of interpolation do not exist at the moment : we stop' 
    212          STOP 'dtadyn'          
    213       END IF 
    214       ! 
    215       CALL eos( tsn, rhd, rhop )       ! In any case, we need rhop 
    216       ! 
    217 #if ! defined key_degrad && defined key_traldf_c2d 
    218       !                                ! In case of 2D varying coefficients, we need aeiv and aeiu 
    219       IF( lk_traldf_eiv )   CALL dta_eiv( kt )      ! eddy induced velocity coefficient 
    220 #endif 
    221       ! 
    222       IF( .NOT. l_offbbl ) THEN       ! Compute bbl coefficients if needed 
     165         ENDIF 
     166         IF( sf_dyn(jf_tem)%ln_tint )  THEN 
     167            ztinta =  REAL( isecsbc - sf_dyn(jf_tem)%nrec_b(2), wp )  & 
     168               &    / REAL( sf_dyn(jf_tem)%nrec_a(2) - sf_dyn(jf_tem)%nrec_b(2), wp ) 
     169            ztintb =  1. - ztinta 
     170            uslp (:,:,:) = ztintb * uslpdta (:,:,:,1)  + ztinta * uslpdta (:,:,:,2)   
     171            vslp (:,:,:) = ztintb * vslpdta (:,:,:,1)  + ztinta * vslpdta (:,:,:,2)   
     172            wslpi(:,:,:) = ztintb * wslpidta(:,:,:,1)  + ztinta * wslpidta(:,:,:,2)   
     173            wslpj(:,:,:) = ztintb * wslpjdta(:,:,:,1)  + ztinta * wslpjdta(:,:,:,2)   
     174         ELSE 
     175            uslp (:,:,:) = uslpnow (:,:,:) 
     176            vslp (:,:,:) = vslpnow (:,:,:) 
     177            wslpi(:,:,:) = wslpinow(:,:,:) 
     178            wslpj(:,:,:) = wslpjnow(:,:,:) 
     179         ENDIF 
     180      ENDIF 
     181      ! 
     182      IF( ln_dynwzv )  THEN    ! compute vertical velocity from u/v 
     183         iswap_uwd = 0 
     184         IF(  kt /= nit000 .AND. ( sf_dyn(jf_uwd)%nrec_a(2) - nrecprev_uwd ) /= 0 )  iswap_uwd = 1 
     185         IF( ( isecsbc > sf_dyn(jf_uwd)%nrec_b(2) .AND. iswap_uwd == 1 ) .OR. kt == nit000 )  THEN    ! read/update the after data 
     186            write(numout,*) ' Compute new vertical velocity at kt = ', kt 
     187            write(numout,*) 
     188            IF( sf_dyn(jf_uwd)%ln_tint ) THEN                 ! time interpolation of data 
     189               wdta(:,:,:,1) =  wdta(:,:,:,2)           ! swap the data 
     190               zu(:,:,:) = sf_dyn(jf_uwd)%fdta(:,:,:,2) 
     191               zv(:,:,:) = sf_dyn(jf_vwd)%fdta(:,:,:,2) 
     192               CALL dta_dyn_wzv( zu, zv, zw ) 
     193               wdta(:,:,:,2) = zw(:,:,:) * tmask(:,:,:) 
     194            ELSE 
     195               zu(:,:,:) = sf_dyn(jf_uwd)%fnow(:,:,:)  
     196               zv(:,:,:) = sf_dyn(jf_vwd)%fnow(:,:,:) 
     197               CALL dta_dyn_wzv( zu, zv, zw ) 
     198               wnow(:,:,:)  = zw(:,:,:) * tmask(:,:,:) 
     199            ENDIF 
     200         ENDIF 
     201         IF( sf_dyn(jf_uwd)%ln_tint )  THEN 
     202            ztinta =  REAL( isecsbc - sf_dyn(jf_uwd)%nrec_b(2), wp )  & 
     203               &    / REAL( sf_dyn(jf_uwd)%nrec_a(2) - sf_dyn(jf_uwd)%nrec_b(2), wp ) 
     204            ztintb =  1. - ztinta 
     205            wn(:,:,:) = ztintb * wdta(:,:,:,1)  + ztinta * wdta(:,:,:,2)   
     206         ELSE 
     207            wn(:,:,:) = wnow(:,:,:) 
     208         ENDIF 
     209      ENDIF 
     210      ! 
     211      tsn(:,:,:,jf_tem) = sf_dyn(jf_tem)%fnow(:,:,:) * tmask(:,:,:)    ! temperature 
     212      tsn(:,:,:,jf_sal) = sf_dyn(jf_sal)%fnow(:,:,:) * tmask(:,:,:)    ! salinity 
     213      ! 
     214      CALL eos( tsn, rhd, rhop )                                       ! In any case, we need rhop 
     215      ! 
     216      avt(:,:,:)       = sf_dyn(jf_avt)%fnow(:,:,:) * tmask(:,:,:)    ! vertical diffusive coefficient  
     217      un (:,:,:)       = sf_dyn(jf_uwd)%fnow(:,:,:) * umask(:,:,:)    ! u-velocity 
     218      vn (:,:,:)       = sf_dyn(jf_vwd)%fnow(:,:,:) * vmask(:,:,:)    ! v-velocity  
     219      IF( .NOT.ln_dynwzv ) &                                           ! w-velocity read in file  
     220         wn (:,:,:)    = sf_dyn(jf_wwd)%fnow(:,:,:) * tmask(:,:,:)     
     221      hmld(:,:)        = sf_dyn(jf_mld)%fnow(:,:,1) * tmask(:,:,1)    ! mixed layer depht 
     222      wndm(:,:)        = sf_dyn(jf_wnd)%fnow(:,:,1) * tmask(:,:,1)    ! wind speed - needed for gas exchange 
     223      emp (:,:)        = sf_dyn(jf_emp)%fnow(:,:,1) * tmask(:,:,1)    ! E-P 
     224      emps(:,:)        = emp(:,:)  
     225      fr_i(:,:)        = sf_dyn(jf_ice)%fnow(:,:,1) * tmask(:,:,1)     ! Sea-ice fraction 
     226      qsr (:,:)        = sf_dyn(jf_qsr)%fnow(:,:,1) * tmask(:,:,1)    ! solar radiation 
     227      !                                                      ! bbl diffusive coef 
     228#if defined key_trabbl 
     229      IF( ln_dynbbl ) THEN                                        ! read in a file 
     230         ahu_bbl(:,:)  = sf_dyn(jf_ubl)%fnow(:,:,1) * umask(:,:,1) 
     231         ahv_bbl(:,:)  = sf_dyn(jf_vbl)%fnow(:,:,1) * umask(:,:,1) 
     232      ELSE                                                        ! Compute bbl coefficients if needed 
    223233         tsb(:,:,:,:) = tsn(:,:,:,:) 
    224234         CALL bbl( kt, 'TRC') 
    225235      END IF 
    226       ! 
    227       IF(ln_ctl) THEN 
    228          CALL prt_ctl(tab3d_1=tsn(:,:,:,jp_tem), clinfo1=' tn      - : ', mask1=tmask, ovlap=1, kdim=jpk   ) 
    229          CALL prt_ctl(tab3d_1=tsn(:,:,:,jp_sal), clinfo1=' sn      - : ', mask1=tmask, ovlap=1, kdim=jpk   ) 
     236#endif 
     237#if ! defined key_degrad && defined key_traldf_c2d && defined key_traldf_eiv 
     238      aeiw(:,:)        = sf_dyn(jf_eiw)%fnow(:,:,1) * tmask(:,:,1)    ! w-eiv 
     239      !                                                           ! Computes the horizontal values from the vertical value 
     240      DO jj = 2, jpjm1 
     241         DO ji = fs_2, fs_jpim1   ! vector opt. 
     242            aeiu(ji,jj) = .5 * ( aeiw(ji,jj) + aeiw(ji+1,jj  ) )  ! Average the diffusive coefficient at u- v- points 
     243            aeiv(ji,jj) = .5 * ( aeiw(ji,jj) + aeiw(ji  ,jj+1) )  ! at u- v- points 
     244         END DO 
     245      END DO 
     246      CALL lbc_lnk( aeiu, 'U', 1. )   ;   CALL lbc_lnk( aeiv, 'V', 1. )    ! lateral boundary condition 
     247#endif 
     248       
     249#if defined key_degrad 
     250      !                                          ! degrad option : diffusive and eiv coef are 3D 
     251      ahtu(:,:,:) = sf_dyn(jf_ahu)%fnow(:,:,:) * umask(:,:,:) 
     252      ahtv(:,:,:) = sf_dyn(jf_ahv)%fnow(:,:,:) * umask(:,:,:) 
     253      ahtw(:,:,:) = sf_dyn(jf_ahw)%fnow(:,:,:) * umask(:,:,:) 
     254#  if defined key_traldf_eiv 
     255      aeiu(:,:,:) = sf_dyn(jf_eiu)%fnow(:,:,:) * umask(:,:,:) 
     256      aeiv(:,:,:) = sf_dyn(jf_eiv)%fnow(:,:,:) * umask(:,:,:) 
     257      aeiw(:,:,:) = sf_dyn(jf_eiw)%fnow(:,:,:) * umask(:,:,:) 
     258#  endif 
     259#endif 
     260      ! 
     261      IF(ln_ctl) THEN                  ! print control 
     262         CALL prt_ctl(tab3d_1=tsn(:,:,:,jf_tem), clinfo1=' tn      - : ', mask1=tmask, ovlap=1, kdim=jpk   ) 
     263         CALL prt_ctl(tab3d_1=tsn(:,:,:,jf_sal), clinfo1=' sn      - : ', mask1=tmask, ovlap=1, kdim=jpk   ) 
    230264         CALL prt_ctl(tab3d_1=un               , clinfo1=' un      - : ', mask1=tmask, ovlap=1, kdim=jpk   ) 
    231265         CALL prt_ctl(tab3d_1=vn               , clinfo1=' vn      - : ', mask1=tmask, ovlap=1, kdim=jpk   ) 
     
    242276 
    243277 
    244    INTEGER FUNCTION dta_dyn_alloc() 
    245       !!--------------------------------------------------------------------- 
    246       !!                 ***  ROUTINE dta_dyn_alloc  *** 
    247       !!--------------------------------------------------------------------- 
    248  
    249       ALLOCATE( tdta    (jpi,jpj,jpk,2), sdta    (jpi,jpj,jpk,2),    & 
    250          &      udta    (jpi,jpj,jpk,2), vdta    (jpi,jpj,jpk,2),    & 
    251          &      wdta    (jpi,jpj,jpk,2), avtdta  (jpi,jpj,jpk,2),    & 
    252 #if defined key_ldfslp && ! defined key_c1d 
    253          &      uslpdta (jpi,jpj,jpk,2), vslpdta (jpi,jpj,jpk,2),    & 
    254          &      wslpidta(jpi,jpj,jpk,2), wslpjdta(jpi,jpj,jpk,2),    & 
    255 #endif 
    256 #if defined key_degrad 
    257          &      ahtudta (jpi,jpj,jpk,2), ahtvdta (jpi,jpj,jpk,2),    & 
    258          &      ahtwdta (jpi,jpj,jpk,2),                             & 
    259 # if defined key_traldf_eiv 
    260          &      aeiudta (jpi,jpj,jpk,2), aeivdta (jpi,jpj,jpk,2),    & 
    261          &      aeiwdta (jpi,jpj,jpk,2),                             & 
    262 # endif 
    263 #endif 
    264 #if ! defined key_degrad &&  defined key_traldf_c2d && defined key_traldf_eiv 
    265          &      aeiwdta (jpi,jpj,    2),                             & 
    266 #endif 
    267          &      hmlddta (jpi,jpj,    2), wspddta (jpi,jpj,    2),    & 
    268          &      frlddta (jpi,jpj,    2), qsrdta  (jpi,jpj,    2),    & 
    269          &      empdta  (jpi,jpj,    2),                         STAT=dta_dyn_alloc )  
    270          ! 
    271       IF( dta_dyn_alloc /= 0 )   CALL ctl_warn('dta_dyn_alloc: failed to allocate facvol array') 
    272       ! 
    273    END FUNCTION dta_dyn_alloc 
    274  
    275  
    276    SUBROUTINE dynrea( kt, kenr ) 
    277       !!---------------------------------------------------------------------- 
    278       !!                  ***  ROUTINE dynrea  *** 
    279       !! 
    280       !! ** Purpose : READ dynamics fiels from OPA9 netcdf output 
    281       !!  
    282       !! ** Method : READ the kenr records of DATA and store in udta(...,2), ....   
    283       !!---------------------------------------------------------------------- 
    284       USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released 
    285       USE wrk_nemo, ONLY: zu      => wrk_3d_3  , zv    => wrk_3d_4 , zw   => wrk_3d_5 
    286       USE wrk_nemo, ONLY: zt      => wrk_3d_6  , zs    => wrk_3d_7 , zavt => wrk_3d_8   
    287       USE wrk_nemo, ONLY: zemp    => wrk_2d_11 , zqsr  => wrk_2d_12, zmld => wrk_2d_13 
    288       USE wrk_nemo, ONLY: zice    => wrk_2d_14 , zwspd => wrk_2d_15  
    289       USE wrk_nemo, ONLY: ztaux   => wrk_2d_16 , ztauy => wrk_2d_17 
    290       USE wrk_nemo, ONLY: zbblx   => wrk_2d_18 , zbbly => wrk_2d_19 
    291       USE wrk_nemo, ONLY: zaeiw2d => wrk_2d_10 
    292       USE wrk_nemo, ONLY: ztsn    => wrk_4d_1 
    293       ! 
    294       INTEGER, INTENT(in) ::   kt, kenr   ! time index 
    295       !! 
    296       INTEGER ::  jkenr 
    297 #if defined key_degrad 
    298       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zahtu, zahtv, zahtw   ! Lateral diffusivity 
    299 # if defined key_traldf_eiv 
    300       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zaeiu, zaeiv, zaeiw   ! G&M coefficient 
    301 # endif 
    302 #endif 
    303       !!---------------------------------------------------------------------- 
    304       !  
    305       IF( wrk_in_use(3, 3,4,5,6,7,8) .OR. & 
    306           wrk_in_use(4, 1)                             .OR. & 
    307           wrk_in_use(2, 10,11,12,13,14,15,16,17,18,19)               ) THEN 
    308          CALL ctl_stop('domrea/dta_dyn: requested workspace arrays unavailable')   ;   RETURN 
    309       ENDIF 
    310  
    311 #if defined key_degrad 
    312       ALLOCATE( zahtu(jpi,jpj,jpk), zahtv(jpi,jpj,jpk), zahtw(jpi,jpj,jpk) )  
    313 # if defined key_traldf_eiv 
    314       ALLOCATE( zaeiu(jpi,jpj,jpk), zaeiv(jpi,jpj,jpk), zaeiw(jpi,jpj,jpk) ) 
    315 # endif 
    316 #endif 
    317        
    318       ! cas d'un fichier non periodique : on utilise deux fois le premier et 
    319       ! le dernier champ temporel 
    320  
    321       jkenr = kenr 
    322  
     278   SUBROUTINE dta_dyn_init 
     279      !!---------------------------------------------------------------------- 
     280      !!                  ***  ROUTINE dta_dyn_init  *** 
     281      !! 
     282      !! ** Purpose :   Initialisation of the dynamical data      
     283      !! ** Method  : - read the data namdta_dyn namelist 
     284      !! 
     285      !! ** Action  : - read parameters 
     286      !!---------------------------------------------------------------------- 
     287      INTEGER  :: ierr, ierr0, ierr1, ierr2, ierr3   ! return error code 
     288      INTEGER  :: ifpr                               ! dummy loop indice 
     289      INTEGER  :: jfld                               ! dummy loop arguments 
     290      INTEGER  :: inum, idv, idimv                   ! local integer 
     291      !! 
     292      CHARACTER(len=100)            ::  cn_dir   !   Root directory for location of core files 
     293      TYPE(FLD_N), DIMENSION(jpfld) ::  slf_d    ! array of namelist informations on the fields to read 
     294      TYPE(FLD_N) :: sn_tem, sn_sal, sn_mld, sn_emp, sn_ice, sn_qsr, sn_wnd  ! informations about the fields to be read 
     295      TYPE(FLD_N) :: sn_uwd, sn_vwd, sn_wwd, sn_avt, sn_ubl, sn_vbl          !   "                                 " 
     296      TYPE(FLD_N) :: sn_ahu, sn_ahv, sn_ahw, sn_eiu, sn_eiv, sn_eiw          !   "                                 " 
     297      ! 
     298      NAMELIST/namdta_dyn/cn_dir, ln_dynwzv, ln_dynbbl, ln_degrad,    & 
     299         &                sn_tem, sn_sal, sn_mld, sn_emp, sn_ice, sn_qsr, sn_wnd,  & 
     300         &                sn_uwd, sn_vwd, sn_wwd, sn_avt, sn_ubl, sn_vbl,          & 
     301         &                sn_ahu, sn_ahv, sn_ahw, sn_eiu, sn_eiv, sn_eiw 
     302 
     303      !!---------------------------------------------------------------------- 
     304      !                                   ! ============ 
     305      !                                   !   Namelist 
     306      !                                   ! ============ 
     307      ! (NB: frequency positive => hours, negative => months) 
     308      !                !   file      ! frequency !  variable  ! time intep !  clim  ! 'yearly' or ! weights  ! rotation   ! 
     309      !                !   name      !  (hours)  !   name     !   (T/F)    !  (T/F) !  'monthly'  ! filename ! pairs      ! 
     310      sn_tem  = FLD_N( 'dyna_grid_T' ,    120    , 'votemper' ,  .true.    , .true. ,   'yearly'  , ''       , ''         ) 
     311      sn_sal  = FLD_N( 'dyna_grid_T' ,    120    , 'vosaline' ,  .true.    , .true. ,   'yearly'  , ''       , ''         ) 
     312      sn_mld  = FLD_N( 'dyna_grid_T' ,    120    , 'somixght' ,  .true.    , .true. ,   'yearly'  , ''       , ''         ) 
     313      sn_emp  = FLD_N( 'dyna_grid_T' ,    120    , 'sowaflcd' ,  .true.    , .true. ,   'yearly'  , ''       , ''         ) 
     314      sn_ice  = FLD_N( 'dyna_grid_T' ,    120    , 'soicecov' ,  .true.    , .true. ,   'yearly'  , ''       , ''         ) 
     315      sn_qsr  = FLD_N( 'dyna_grid_T' ,    120    , 'soshfldo' ,  .true.    , .true. ,   'yearly'  , ''       , ''         ) 
     316      sn_wnd  = FLD_N( 'dyna_grid_T' ,    120    , 'sowindsp' ,  .true.    , .true. ,   'yearly'  , ''       , ''         ) 
     317      sn_uwd  = FLD_N( 'dyna_grid_U' ,    120    , 'vozocrtx' ,  .true.    , .true. ,   'yearly'  , ''       , ''         ) 
     318      sn_vwd  = FLD_N( 'dyna_grid_V' ,    120    , 'vomecrty' ,  .true.    , .true. ,   'yearly'  , ''       , ''         ) 
     319      sn_wwd  = FLD_N( 'dyna_grid_W' ,    120    , 'vovecrtz' ,  .true.    , .true. ,   'yearly'  , ''       , ''         ) 
     320      sn_avt  = FLD_N( 'dyna_grid_W' ,    120    , 'votkeavt' ,  .true.    , .true. ,   'yearly'  , ''       , ''         ) 
     321      sn_ubl  = FLD_N( 'dyna_grid_U' ,    120    , 'sobblcox' ,  .true.    , .true. ,   'yearly'  , ''       , ''         ) 
     322      sn_vbl  = FLD_N( 'dyna_grid_V' ,    120    , 'sobblcoy' ,  .true.    , .true. ,   'yearly'  , ''       , ''         ) 
     323      sn_ahu  = FLD_N( 'dyna_grid_U' ,    120    , 'vozoahtu' ,  .true.    , .true. ,   'yearly'  , ''       , ''         ) 
     324      sn_ahv  = FLD_N( 'dyna_grid_V' ,    120    , 'vomeahtv' ,  .true.    , .true. ,   'yearly'  , ''       , ''         ) 
     325      sn_ahw  = FLD_N( 'dyna_grid_W' ,    120    , 'voveahtz' ,  .true.    , .true. ,   'yearly'  , ''       , ''         ) 
     326      sn_eiu  = FLD_N( 'dyna_grid_U' ,    120    , 'vozoaeiu' ,  .true.    , .true. ,   'yearly'  , ''       , ''         ) 
     327      sn_eiv  = FLD_N( 'dyna_grid_V' ,    120    , 'vomeaeiv' ,  .true.    , .true. ,   'yearly'  , ''       , ''         ) 
     328      sn_eiw  = FLD_N( 'dyna_grid_W' ,    120    , 'voveaeiw' ,  .true.    , .true. ,   'yearly'  , ''       , ''         ) 
     329      ! 
     330      REWIND( numnam )                          ! read in namlist namdta_dyn 
     331      READ  ( numnam, namdta_dyn ) 
     332      !                                         ! store namelist information in an array 
     333      !                                         ! Control print 
    323334      IF(lwp) THEN 
    324335         WRITE(numout,*) 
    325          WRITE(numout,*) 'Dynrea : read dynamical fields, kenr = ', jkenr 
    326          WRITE(numout,*) '~~~~~~~' 
    327 #if defined key_degrad 
    328          WRITE(numout,*) ' Degraded fields' 
    329 #endif 
     336         WRITE(numout,*) 'dta_dyn : offline dynamics ' 
     337         WRITE(numout,*) '~~~~~~~ ' 
     338         WRITE(numout,*) '   Namelist namdta_dyn' 
     339         WRITE(numout,*) '      vertical velocity read from file (T) or computed (F) ln_dynwzv  = ', ln_dynwzv 
     340         WRITE(numout,*) '      bbl coef read from file (T) or computed (F)          ln_dynbbl  = ', ln_dynbbl 
     341         WRITE(numout,*) '      degradation option enabled (T) or not (F)            ln_degrad  = ', ln_degrad 
    330342         WRITE(numout,*) 
    331343      ENDIF 
    332  
    333  
    334       IF( kt == nit000 .AND. nlecoff == 0 ) THEN 
    335          nlecoff = 1 
    336          CALL  iom_open ( cfile_grid_T, numfl_t ) 
    337          CALL  iom_open ( cfile_grid_U, numfl_u ) 
    338          CALL  iom_open ( cfile_grid_V, numfl_v ) 
    339          CALL  iom_open ( cfile_grid_W, numfl_w ) 
    340       ENDIF 
    341  
    342       ! file grid-T 
    343       !--------------- 
    344       CALL iom_get( numfl_t, jpdom_data, 'votemper', zt   (:,:,:), jkenr ) 
    345       CALL iom_get( numfl_t, jpdom_data, 'vosaline', zs   (:,:,:), jkenr ) 
    346       CALL iom_get( numfl_t, jpdom_data, 'somixhgt', zmld (:,:  ), jkenr ) 
    347       CALL iom_get( numfl_t, jpdom_data, 'sowaflcd', zemp (:,:  ), jkenr ) 
    348       CALL iom_get( numfl_t, jpdom_data, 'soshfldo', zqsr (:,:  ), jkenr ) 
    349       CALL iom_get( numfl_t, jpdom_data, 'soicecov', zice (:,:  ), jkenr ) 
    350       IF( iom_varid( numfl_t, 'sowindsp', ldstop = .FALSE. ) > 0 ) THEN  
    351          CALL iom_get( numfl_t, jpdom_data, 'sowindsp', zwspd(:,:), jkenr )  
     344      !  
     345      IF( ln_degrad .AND. .NOT.lk_degrad ) THEN 
     346         CALL ctl_warn( 'dta_dyn_init: degradation option requires key_degrad activated ; force ln_degrad to false' ) 
     347         ln_degrad = .FALSE. 
     348      ENDIF 
     349      IF( ln_dynbbl .AND. .NOT.lk_trabbl ) THEN 
     350         CALL ctl_warn( 'dta_dyn_init: bbl option requires key_trabbl activated ; force ln_dynbbl to false' ) 
     351         ln_dynbbl = .FALSE. 
     352      ENDIF 
     353 
     354      jf_tem = 1   ;   jf_sal = 2   ;  jf_mld = 3   ;  jf_emp = 4   ;   jf_ice = 5   ;   jf_qsr = 6  
     355      jf_wnd = 7   ;   jf_uwd = 8   ;  jf_vwd = 9   ;  jf_wwd = 10  ;   jf_avt = 11  ;   jfld  = 11 
     356      ! 
     357      slf_d(jf_tem) = sn_tem   ;   slf_d(jf_sal) = sn_sal   ;   slf_d(jf_mld) = sn_mld 
     358      slf_d(jf_emp) = sn_emp   ;   slf_d(jf_ice) = sn_ice   ;   slf_d(jf_qsr) = sn_qsr 
     359      slf_d(jf_wnd) = sn_wnd   ;   slf_d(jf_uwd) = sn_uwd   ;   slf_d(jf_vwd) = sn_vwd 
     360      slf_d(jf_wwd) = sn_wwd   ;   slf_d(jf_avt) = sn_avt  
     361      ! 
     362      IF( .NOT.ln_degrad ) THEN     ! no degrad option 
     363         IF( lk_traldf_eiv .AND. ln_dynbbl ) THEN        ! eiv & bbl 
     364                 jf_ubl  = 12      ;         jf_vbl  = 13      ;         jf_eiw  = 14   ;   jfld = 14 
     365           slf_d(jf_ubl) = sn_ubl  ;   slf_d(jf_vbl) = sn_vbl  ;   slf_d(jf_eiw) = sn_eiw 
     366         ENDIF 
     367         IF( .NOT.lk_traldf_eiv .AND. ln_dynbbl ) THEN   ! no eiv & bbl 
     368                 jf_ubl  = 12      ;         jf_vbl  = 13      ;   jfld = 13 
     369           slf_d(jf_ubl) = sn_ubl  ;   slf_d(jf_vbl) = sn_vbl 
     370         ENDIF 
     371         IF( lk_traldf_eiv .AND. .NOT.ln_dynbbl ) THEN   ! eiv & no bbl 
     372           jf_eiw = 12   ;   jfld = 12   ;   slf_d(jf_eiw) = sn_eiw 
     373         ENDIF 
    352374      ELSE 
    353          CALL iom_get( numfl_u, jpdom_data, 'sozotaux', ztaux(:,:), jkenr ) 
    354          CALL iom_get( numfl_v, jpdom_data, 'sometauy', ztauy(:,:), jkenr ) 
    355          CALL tau2wnd( ztaux, ztauy, zwspd ) 
    356       ENDIF 
    357       ! files grid-U / grid_V 
    358       CALL iom_get( numfl_u, jpdom_data, 'vozocrtx', zu   (:,:,:), jkenr ) 
    359       CALL iom_get( numfl_v, jpdom_data, 'vomecrty', zv   (:,:,:), jkenr ) 
    360 #if defined key_trabbl 
    361       IF( .NOT. lk_c1d .AND. nn_bbl_ldf == 1 ) THEN 
    362          IF( iom_varid( numfl_u, 'ahu_bbl', ldstop = .FALSE. ) > 0  .AND. & 
    363          &   iom_varid( numfl_v, 'ahv_bbl', ldstop = .FALSE. ) > 0 ) THEN 
    364              CALL iom_get( numfl_u, jpdom_data, 'ahu_bbl', zbblx(:,:), jkenr ) 
    365              CALL iom_get( numfl_v, jpdom_data, 'ahv_bbl', zbbly(:,:), jkenr ) 
    366              l_offbbl = .TRUE. 
    367          ENDIF 
    368       ENDIF 
    369 #endif  
    370  
    371       ! file grid-W 
    372       ! CALL iom_get ( numfl_w, jpdom_data, 'vovecrtz', zw   (:,:,:), jkenr ) 
    373       ! Computation of vertical velocity using horizontal divergence 
    374       CALL wzv( zu, zv, zw ) 
    375  
    376       IF( iom_varid( numfl_w, 'voddmavs', ldstop = .FALSE. ) > 0 ) THEN          ! avs exist: it is used 
    377          CALL iom_get( numfl_w, jpdom_data, 'voddmavs', zavt (:,:,:), jkenr ) 
    378       ELSE                                                                       ! no avs: use avt 
    379          CALL iom_get( numfl_w, jpdom_data, 'votkeavt', zavt (:,:,:), jkenr ) 
    380       ENDIF 
    381  
    382 #if ! defined key_degrad && defined key_traldf_c2d && defined key_traldf_eiv  
    383       CALL iom_get( numfl_w, jpdom_data, 'soleaeiw', zaeiw2d(:,: ), jkenr ) 
    384 #endif 
    385  
    386 #if defined key_degrad 
    387       CALL iom_get( numfl_u, jpdom_data, 'vozoahtu', zahtu(:,:,:), jkenr ) 
    388       CALL iom_get( numfl_v, jpdom_data, 'vomeahtv', zahtv(:,:,:), jkenr ) 
    389       CALL iom_get( numfl_w, jpdom_data, 'voveahtw', zahtw(:,:,:), jkenr ) 
    390 #  if defined key_traldf_eiv 
    391       CALL iom_get( numfl_u, jpdom_data, 'vozoaeiu', zaeiu(:,:,:), jkenr ) 
    392       CALL iom_get( numfl_v, jpdom_data, 'vomeaeiv', zaeiv(:,:,:), jkenr ) 
    393       CALL iom_get( numfl_w, jpdom_data, 'voveaeiw', zaeiw(:,:,:), jkenr ) 
    394 #  endif 
    395 #endif 
    396  
    397       udta  (:,:,:,2) = zu  (:,:,:) * umask(:,:,:) 
    398       vdta  (:,:,:,2) = zv  (:,:,:) * vmask(:,:,:)  
    399       wdta  (:,:,:,2) = zw  (:,:,:) * tmask(:,:,:) 
    400       tdta  (:,:,:,2) = zt  (:,:,:) * tmask(:,:,:) 
    401       sdta  (:,:,:,2) = zs  (:,:,:) * tmask(:,:,:) 
    402       avtdta(:,:,:,2) = zavt(:,:,:) * tmask(:,:,:) 
    403  
    404 #if defined key_ldfslp && ! defined key_c1d 
    405       ! Computes slopes (here tsn and avt are used as workspace) 
    406       ztsn (:,:,:,jp_tem) = tdta  (:,:,:,2) 
    407       ztsn (:,:,:,jp_sal) = sdta  (:,:,:,2) 
    408       avt(:,:,:)          = avtdta(:,:,:,2) 
    409        
    410       CALL eos( ztsn, rhd, rhop )   ! Time-filtered in situ density  
    411       CALL bn2( ztsn, rn2 )         ! before Brunt-Vaisala frequency 
    412       IF( ln_zps )   & 
    413          &   CALL zps_hde( kt, jpts, ztsn, gtsu, gtsv,  &  ! Partial steps: before Horizontal DErivative 
    414          &                           rhd, gru , grv   )    ! of t, s, rd at the bottom ocean level 
    415       CALL zdf_mxl( kt )           ! mixed layer depth 
    416       CALL ldf_slp( kt, rhd, rn2 ) 
    417           
    418       uslpdta (:,:,:,2) = uslp (:,:,:) 
    419       vslpdta (:,:,:,2) = vslp (:,:,:) 
    420       wslpidta(:,:,:,2) = wslpi(:,:,:) 
    421       wslpjdta(:,:,:,2) = wslpj(:,:,:) 
    422 #endif 
    423  
    424 #if ! defined key_degrad && defined key_traldf_c2d && defined key_traldf_eiv 
    425       aeiwdta(:,:,2)  = zaeiw2d(:,:) * tmask(:,:,1) 
    426 #endif 
    427  
    428 #if defined key_degrad 
    429         ahtudta(:,:,:,2) = zahtu(:,:,:) * umask(:,:,:) 
    430         ahtvdta(:,:,:,2) = zahtv(:,:,:) * vmask(:,:,:) 
    431         ahtwdta(:,:,:,2) = zahtw(:,:,:) * tmask(:,:,:) 
    432 #  if defined key_traldf_eiv 
    433         aeiudta(:,:,:,2) = zaeiu(:,:,:) * umask(:,:,:) 
    434         aeivdta(:,:,:,2) = zaeiv(:,:,:) * vmask(:,:,:) 
    435         aeiwdta(:,:,:,2) = zaeiw(:,:,:) * tmask(:,:,:) 
    436 #  endif 
    437 #endif 
    438  
    439       ! fluxes  
    440       ! 
    441       wspddta(:,:,2)  = zwspd(:,:) * tmask(:,:,1) 
    442       frlddta(:,:,2)  = zice (:,:) * tmask(:,:,1) 
    443       empdta (:,:,2)  = zemp (:,:) * tmask(:,:,1) 
    444       qsrdta (:,:,2)  = zqsr (:,:) * tmask(:,:,1) 
    445       hmlddta(:,:,2)  = zmld (:,:) * tmask(:,:,1) 
    446  
    447 #if defined key_trabbl 
    448       IF( l_offbbl ) THEN  
    449          bblxdta(:,:,2) = zbblx(:,:)  * umask(:,:,1) 
    450          bblydta(:,:,2) = zbbly(:,:)  * vmask(:,:,1) 
    451       ENDIF 
    452 #endif 
    453        
    454       IF( kt == nitend ) THEN 
    455          CALL iom_close ( numfl_t ) 
    456          CALL iom_close ( numfl_u ) 
    457          CALL iom_close ( numfl_v ) 
    458          CALL iom_close ( numfl_w ) 
    459       ENDIF 
    460       !       
    461       IF( wrk_not_released(3, 3,4,5,6,7,8) .OR. & 
    462           wrk_not_released(4, 1                            ) .OR. & 
    463           wrk_not_released(2, 10,11,12,13,14,15,16,17,18,19)                ) THEN 
    464          CALL ctl_stop('domrea/dta_dyn: failed to release workspace arrays') 
    465       END IF 
    466 #if defined key_degrad 
    467       DEALLOCATE( zahtu )   ;   DEALLOCATE( zahtv )   ;   DEALLOCATE( zahtw ) 
    468 # if defined key_traldf_eiv 
    469       DEALLOCATE( zaeiu )   ;   DEALLOCATE( zaeiv )   ;   DEALLOCATE( zaeiw ) 
    470 # endif 
    471 #endif 
    472       ! 
    473    END SUBROUTINE dynrea 
    474  
    475  
    476    SUBROUTINE dta_dyn_init 
    477       !!---------------------------------------------------------------------- 
    478       !!                  ***  ROUTINE dta_dyn_init  *** 
    479       !! 
    480       !! ** Purpose :   initializations of parameters for the interpolation 
    481       !! 
    482       !! ** Method : 
    483       !!---------------------------------------------------------------------- 
    484       REAL(wp) :: znspyr   !: number of time step per year 
    485       ! 
    486       NAMELIST/namdyn/ ndtadyn, ndtatot, nsptint, lperdyn,  & 
    487          &             cfile_grid_T, cfile_grid_U, cfile_grid_V, cfile_grid_W 
    488       !!---------------------------------------------------------------------- 
    489       ! 
    490       IF( dta_dyn_alloc() /= 0 )  CALL ctl_stop( 'STOP', 'dta_dyn_alloc: unable to allocate standard ocean arrays' ) 
    491       ! 
    492       REWIND( numnam )              ! Read Namelist namdyn : Lateral physics on tracers 
    493       READ  ( numnam, namdyn ) 
    494       ! 
    495       IF(lwp) THEN                  ! control print 
    496          WRITE(numout,*) 
    497          WRITE(numout,*) 'namdyn : offline dynamical selection' 
    498          WRITE(numout,*) '~~~~~~~' 
    499          WRITE(numout,*) '  Namelist namdyn : set parameters for the lecture of the dynamical fields' 
    500          WRITE(numout,*)  
    501          WRITE(numout,*) ' number of elements in the FILE for a year  ndtadyn = ' , ndtadyn 
    502          WRITE(numout,*) ' total number of elements in the FILE       ndtatot = ' , ndtatot 
    503          WRITE(numout,*) ' type of interpolation                      nsptint = ' , nsptint 
    504          WRITE(numout,*) ' loop on the same FILE                      lperdyn = ' , lperdyn 
    505          WRITE(numout,*) '  ' 
    506          WRITE(numout,*) ' name of grid_T file                   cfile_grid_T = ', TRIM(cfile_grid_T)     
    507          WRITE(numout,*) ' name of grid_U file                   cfile_grid_U = ', TRIM(cfile_grid_U)  
    508          WRITE(numout,*) ' name of grid_V file                   cfile_grid_V = ', TRIM(cfile_grid_V)  
    509          WRITE(numout,*) ' name of grid_W file                   cfile_grid_W = ', TRIM(cfile_grid_W)       
    510          WRITE(numout,*) ' ' 
    511       ENDIF 
    512       ! 
    513       znspyr   = nyear_len(1) * rday / rdt   
    514       rnspdta  = znspyr / REAL( ndtadyn, wp ) 
    515       rnspdta2 = rnspdta * 0.5  
     375              jf_ahu  = 12      ;         jf_ahv  = 13      ;         jf_ahw  = 14   ;   jfld = 14 
     376        slf_d(jf_ahu) = sn_ahu  ;   slf_d(jf_ahv) = sn_ahv  ;   slf_d(jf_ahw) = sn_ahw 
     377        IF( lk_traldf_eiv .AND. ln_dynbbl ) THEN         ! eiv & bbl 
     378                 jf_ubl  = 15      ;         jf_vbl  = 16       
     379           slf_d(jf_ubl) = sn_ubl  ;   slf_d(jf_vbl) = sn_vbl   
     380                 jf_eiu  = 17      ;         jf_eiv  = 18      ;          jf_eiw  = 19   ;   jfld = 19 
     381           slf_d(jf_eiu) = sn_eiu  ;   slf_d(jf_eiv) = sn_eiv  ;    slf_d(jf_eiw) = sn_eiw 
     382        ENDIF 
     383        IF( .NOT.lk_traldf_eiv .AND. ln_dynbbl ) THEN    ! no eiv & bbl 
     384                 jf_ubl  = 15      ;         jf_vbl  = 16      ;   jfld = 16 
     385           slf_d(jf_ubl) = sn_ubl  ;   slf_d(jf_vbl) = sn_vbl 
     386        ENDIF 
     387        IF( lk_traldf_eiv .AND. .NOT.ln_dynbbl ) THEN    ! eiv & no bbl 
     388                 jf_eiu  = 15      ;         jf_eiv  = 16      ;         jf_eiw  = 17   ;   jfld = 17 
     389           slf_d(jf_eiu) = sn_eiu  ;   slf_d(jf_eiv) = sn_eiv  ;   slf_d(jf_eiw) = sn_eiw 
     390        ENDIF 
     391      ENDIF 
     392   
     393      ALLOCATE( sf_dyn(jfld), STAT=ierr )         ! set sf structure 
     394      IF( ierr > 0 ) THEN 
     395         CALL ctl_stop( 'dta_dyn: unable to allocate sf structure' )   ;   RETURN 
     396      ENDIF 
     397      ! Open file for each variable to get his number of dimension 
     398      DO ifpr = 1, jfld 
     399         CALL iom_open( slf_d(ifpr)%clname, inum ) 
     400         idv   = iom_varid( inum , slf_d(ifpr)%clvar )  ! id of the variable sdjf%clvar 
     401         idimv = iom_file ( inum )%ndims(idv)             ! number of dimension for variable sdjf%clvar 
     402         IF( inum /= 0 )   CALL iom_close( inum )       ! close file if already open 
     403         IF( idimv == 3 ) THEN    ! 2D variable 
     404                                      ALLOCATE( sf_dyn(ifpr)%fnow(jpi,jpj,1)    , STAT=ierr0 ) 
     405            IF( slf_d(ifpr)%ln_tint ) ALLOCATE( sf_dyn(ifpr)%fdta(jpi,jpj,1,2)  , STAT=ierr1 ) 
     406         ELSE                     ! 3D variable 
     407                                      ALLOCATE( sf_dyn(ifpr)%fnow(jpi,jpj,jpk)  , STAT=ierr0 ) 
     408            IF( slf_d(ifpr)%ln_tint ) ALLOCATE( sf_dyn(ifpr)%fdta(jpi,jpj,jpk,2), STAT=ierr1 ) 
     409         ENDIF 
     410         IF( ierr0 + ierr1 > 0 ) THEN 
     411            CALL ctl_stop( 'dta_dyn_init : unable to allocate sf_dyn array structure' )   ;   RETURN 
     412         ENDIF 
     413      END DO 
     414      !                                         ! fill sf with slf_i and control print 
     415      CALL fld_fill( sf_dyn, slf_d, cn_dir, 'dta_dyn_init', 'Data in file', 'namdta_dyn' ) 
     416      ! 
     417      IF( lk_ldfslp ) THEN                  ! slopes  
     418         IF( sf_dyn(jf_tem)%ln_tint ) THEN      ! time interpolation 
     419            ALLOCATE( uslpdta (jpi,jpj,jpk,2), vslpdta (jpi,jpj,jpk,2),    & 
     420            &         wslpidta(jpi,jpj,jpk,2), wslpjdta(jpi,jpj,jpk,2), STAT=ierr2 ) 
     421         ELSE 
     422            ALLOCATE( uslpnow (jpi,jpj,jpk)  , vslpnow (jpi,jpj,jpk)  ,    & 
     423            &         wslpinow(jpi,jpj,jpk)  , wslpjnow(jpi,jpj,jpk)  , STAT=ierr2 ) 
     424         ENDIF  
     425         IF( ierr2 > 0 ) THEN 
     426            CALL ctl_stop( 'dta_dyn_init : unable to allocate slope arrays' )   ;   RETURN 
     427         ENDIF 
     428      ENDIF 
     429      IF( ln_dynwzv ) THEN                  ! slopes  
     430         IF( sf_dyn(jf_uwd)%ln_tint ) THEN      ! time interpolation 
     431            ALLOCATE( wdta(jpi,jpj,jpk,2), STAT=ierr3 ) 
     432         ELSE 
     433            ALLOCATE( wnow(jpi,jpj,jpk)  , STAT=ierr3 ) 
     434         ENDIF  
     435         IF( ierr3 > 0 ) THEN 
     436            CALL ctl_stop( 'dta_dyn_init : unable to allocate wdta arrays' )   ;   RETURN 
     437         ENDIF 
     438      ENDIF 
     439      ! 
     440      nrecprev_tem = 0 
     441      nrecprev_uwd = 0 
    516442      ! 
    517443      CALL dta_dyn( nit000 ) 
     
    519445   END SUBROUTINE dta_dyn_init 
    520446 
    521  
    522    SUBROUTINE wzv( pu, pv, pw ) 
     447   SUBROUTINE dta_dyn_wzv( pu, pv, pw ) 
    523448      !!---------------------------------------------------------------------- 
    524449      !!                    ***  ROUTINE wzv  *** 
     
    534459      !!        The boundary conditions are w=0 at the bottom (no flux). 
    535460      !!---------------------------------------------------------------------- 
     461      USE oce, ONLY:  zhdiv => hdivn 
     462      ! 
    536463      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) :: pu, pv    !:  horizontal velocities 
    537       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(  out) :: pw        !:  verticla velocity 
     464      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(  out) :: pw        !:  vertical velocity 
    538465      !! 
    539466      INTEGER  ::  ji, jj, jk 
    540467      REAL(wp) ::  zu, zu1, zv, zv1, zet 
    541       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zhdiv     !:  horizontal divergence 
    542468      !!---------------------------------------------------------------------- 
    543469      ! 
    544470      ! Computation of vertical velocity using horizontal divergence 
    545       zhdiv(:,:,:) = 0. 
     471      zhdiv(:,:,:) = 0._wp 
    546472      DO jk = 1, jpkm1 
    547473         DO jj = 2, jpjm1 
     
    564490      END DO 
    565491      ! 
    566    END SUBROUTINE wzv 
    567  
    568  
    569    SUBROUTINE dta_eiv( kt ) 
    570       !!---------------------------------------------------------------------- 
    571       !!                  ***  ROUTINE dta_eiv  *** 
    572       !! 
    573       !! ** Purpose :   Compute the eddy induced velocity coefficient from the 
    574       !!      growth rate of baroclinic instability. 
    575       !! 
    576       !! ** Method : Specific to the offline model. Computes the horizontal 
    577       !!             values from the vertical value 
    578       !!---------------------------------------------------------------------- 
    579       INTEGER, INTENT( in ) ::   kt     ! ocean time-step inedx 
    580       !! 
    581       INTEGER ::   ji, jj           ! dummy loop indices 
    582       !!---------------------------------------------------------------------- 
    583       ! 
    584       IF( kt == nit000 ) THEN 
    585          IF(lwp) WRITE(numout,*) 
    586          IF(lwp) WRITE(numout,*) 'dta_eiv : eddy induced velocity coefficients' 
    587          IF(lwp) WRITE(numout,*) '~~~~~~~' 
    588       ENDIF 
    589       ! 
    590 #if defined key_ldfeiv 
    591       ! Average the diffusive coefficient at u- v- points 
    592       DO jj = 2, jpjm1 
    593          DO ji = fs_2, fs_jpim1   ! vector opt. 
    594             aeiu(ji,jj) = .5 * ( aeiw(ji,jj) + aeiw(ji+1,jj  ) ) 
    595             aeiv(ji,jj) = .5 * ( aeiw(ji,jj) + aeiw(ji  ,jj+1) ) 
    596          END DO 
    597       END DO 
    598       CALL lbc_lnk( aeiu, 'U', 1. )   ;   CALL lbc_lnk( aeiv, 'V', 1. )    ! lateral boundary condition 
     492   END SUBROUTINE dta_dyn_wzv 
     493 
     494   SUBROUTINE dta_dyn_slp( kt, pts, puslp, pvslp, pwslpi, pwslpj ) 
     495      !!--------------------------------------------------------------------- 
     496      !!                    ***  ROUTINE dta_dyn_slp  *** 
     497      !! 
     498      !! ** Purpose : Computation of slope 
     499      !! 
     500      !!--------------------------------------------------------------------- 
     501      INTEGER ,                              INTENT(in ) :: kt       ! time step 
     502      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in ) :: pts      ! temperature/salinity 
     503      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(out) :: puslp    ! zonal isopycnal slopes 
     504      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(out) :: pvslp    ! meridional isopycnal slopes 
     505      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(out) :: pwslpi   ! zonal diapycnal slopes 
     506      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(out) :: pwslpj   ! meridional diapycnal slopes 
     507      !!  
     508#if defined key_ldfslp && ! defined key_c1d 
     509      CALL eos( pts, rhd, rhop )   ! Time-filtered in situ density  
     510      CALL bn2( pts, rn2 )         ! before Brunt-Vaisala frequency 
     511      IF( ln_zps )   & 
     512         &  CALL zps_hde( kt, jpts, pts, gtsu, gtsv, rhd, gru, grv )  ! Partial steps: before Horizontal DErivative 
     513         !                                                            ! of t, s, rd at the bottom ocean level 
     514      CALL zdf_mxl( kt )            ! mixed layer depth 
     515      CALL ldf_slp( kt, rhd, rn2 )  ! slopes 
     516      puslp (:,:,:) = uslp (:,:,:)  
     517      pvslp (:,:,:) = vslp (:,:,:)  
     518      pwslpi(:,:,:) = wslpi(:,:,:)  
     519      pwslpj(:,:,:) = wslpj(:,:,:)  
     520#else 
     521      WRITE(*,*) 'dta_dyn_slp: You should not have seen this print! error?', & 
     522        &        kt, pts(1,1,1,1),puslp(1,1,1), pvslp(1,1,1), pwslpi(1,1,1), pwslpj(1,1,1) 
    599523#endif 
    600524      ! 
    601    END SUBROUTINE dta_eiv 
    602  
    603  
    604    SUBROUTINE tau2wnd( ptaux, ptauy, pwspd ) 
    605       !!--------------------------------------------------------------------- 
    606       !!                    ***  ROUTINE sbc_tau2wnd  *** 
    607       !! 
    608       !! ** Purpose : Estimation of wind speed as a function of wind stress 
    609       !! 
    610       !! ** Method  : |tau|=rhoa*Cd*|U|^2 
    611       !!--------------------------------------------------------------------- 
    612       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   ptaux, ptauy   ! wind stress in i-j direction resp. 
    613       REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) ::   pwspd          ! wind speed 
    614       !!  
    615       REAL(wp) ::   zrhoa  = 1.22_wp       ! Air density kg/m3 
    616       REAL(wp) ::   zcdrag = 1.5e-3_wp     ! drag coefficient 
    617       REAL(wp) ::   ztx, zty, ztau, zcoef  ! temporary variables 
    618       INTEGER  ::   ji, jj                 ! dummy indices 
    619       !!--------------------------------------------------------------------- 
    620       zcoef = 1. / ( zrhoa * zcdrag ) 
    621 !CDIR NOVERRCHK 
    622       DO jj = 2, jpjm1 
    623 !CDIR NOVERRCHK 
    624          DO ji = fs_2, fs_jpim1   ! vector opt. 
    625             ztx = ptaux(ji,jj) * umask(ji,jj,1) + ptaux(ji-1,jj  ) * umask(ji-1,jj  ,1) 
    626             zty = ptauy(ji,jj) * vmask(ji,jj,1) + ptauy(ji  ,jj-1) * vmask(ji  ,jj-1,1) 
    627             ztau = 0.5 * SQRT( ztx * ztx + zty * zty ) 
    628             pwspd(ji,jj) = SQRT ( ztau * zcoef ) * tmask(ji,jj,1) 
    629          END DO 
    630       END DO 
    631       CALL lbc_lnk( pwspd(:,:), 'T', 1. ) 
    632       ! 
    633    END SUBROUTINE tau2wnd 
    634  
    635  
    636    SUBROUTINE swap_dyn_data 
    637       !!---------------------------------------------------------------------- 
    638       !!                    ***  ROUTINE swap_dyn_data  *** 
    639       !! 
    640       !! ** Purpose :   swap array data 
    641       !!---------------------------------------------------------------------- 
    642       ! 
    643       ! swap from record 2 to 1 
    644       tdta   (:,:,:,1) = tdta   (:,:,:,2) 
    645       sdta   (:,:,:,1) = sdta   (:,:,:,2) 
    646       avtdta (:,:,:,1) = avtdta (:,:,:,2) 
    647       udta   (:,:,:,1) = udta   (:,:,:,2) 
    648       vdta   (:,:,:,1) = vdta   (:,:,:,2) 
    649       wdta   (:,:,:,1) = wdta   (:,:,:,2) 
    650 #if defined key_ldfslp && ! defined key_c1d 
    651       uslpdta (:,:,:,1) = uslpdta (:,:,:,2) 
    652       vslpdta (:,:,:,1) = vslpdta (:,:,:,2) 
    653       wslpidta(:,:,:,1) = wslpidta(:,:,:,2) 
    654       wslpjdta(:,:,:,1) = wslpjdta(:,:,:,2) 
    655 #endif 
    656       hmlddta(:,:,1) = hmlddta(:,:,2)  
    657       wspddta(:,:,1) = wspddta(:,:,2)  
    658       frlddta(:,:,1) = frlddta(:,:,2)  
    659       empdta (:,:,1) = empdta (:,:,2)  
    660       qsrdta (:,:,1) = qsrdta (:,:,2)  
    661       IF( l_offbbl ) THEN 
    662          bblxdta(:,:,1) = bblxdta(:,:,2) 
    663          bblydta(:,:,1) = bblydta(:,:,2)  
    664       ENDIF 
    665  
    666 #if ! defined key_degrad && defined key_traldf_c2d && defined key_traldf_eiv 
    667       aeiwdta(:,:,1) = aeiwdta(:,:,2) 
    668 #endif 
    669  
    670 #if defined key_degrad 
    671       ahtudta(:,:,:,1) = ahtudta(:,:,:,2) 
    672       ahtvdta(:,:,:,1) = ahtvdta(:,:,:,2) 
    673       ahtwdta(:,:,:,1) = ahtwdta(:,:,:,2) 
    674 #  if defined key_traldf_eiv 
    675       aeiudta(:,:,:,1) = aeiudta(:,:,:,2) 
    676       aeivdta(:,:,:,1) = aeivdta(:,:,:,2) 
    677       aeiwdta(:,:,:,1) = aeiwdta(:,:,:,2) 
    678 #  endif 
    679 #endif 
    680       ! 
    681    END SUBROUTINE swap_dyn_data 
    682  
    683  
    684    SUBROUTINE assign_dyn_data 
    685       !!---------------------------------------------------------------------- 
    686       !!                    ***  ROUTINE assign_dyn_data  *** 
    687       !! 
    688       !! ** Purpose :   Assign dynamical data to the data that have been read 
    689       !!                without time interpolation 
    690       !! 
    691       !!---------------------------------------------------------------------- 
    692        
    693       tsn(:,:,:,jp_tem) = tdta  (:,:,:,2) 
    694       tsn(:,:,:,jp_sal) = sdta  (:,:,:,2) 
    695       avt(:,:,:)        = avtdta(:,:,:,2) 
    696        
    697       un (:,:,:) = udta  (:,:,:,2)  
    698       vn (:,:,:) = vdta  (:,:,:,2) 
    699       wn (:,:,:) = wdta  (:,:,:,2) 
    700        
    701 #if defined key_ldfslp && ! defined key_c1d 
    702       uslp (:,:,:) = uslpdta (:,:,:,2)  
    703       vslp (:,:,:) = vslpdta (:,:,:,2)  
    704       wslpi(:,:,:) = wslpidta(:,:,:,2)  
    705       wslpj(:,:,:) = wslpjdta(:,:,:,2)  
    706 #endif 
    707  
    708       hmld(:,:) = hmlddta(:,:,2)  
    709       wndm(:,:) = wspddta(:,:,2)  
    710       fr_i(:,:) = frlddta(:,:,2)  
    711       emp (:,:) = empdta (:,:,2)  
    712       emps(:,:) = emp(:,:)  
    713       qsr (:,:) = qsrdta (:,:,2)  
    714 #if defined key_trabbl 
    715       IF( l_offbbl ) THEN 
    716          ahu_bbl(:,:) = bblxdta(:,:,2) 
    717          ahv_bbl(:,:) = bblydta(:,:,2)  
    718       ENDIF 
    719 #endif 
    720 #if ! defined key_degrad && defined key_traldf_c2d && defined key_traldf_eiv 
    721       aeiw(:,:) = aeiwdta(:,:,2) 
    722 #endif 
    723        
    724 #if defined key_degrad 
    725       ahtu(:,:,:) = ahtudta(:,:,:,2) 
    726       ahtv(:,:,:) = ahtvdta(:,:,:,2) 
    727       ahtw(:,:,:) = ahtwdta(:,:,:,2) 
    728 #  if defined key_traldf_eiv 
    729       aeiu(:,:,:) = aeiudta(:,:,:,2) 
    730       aeiv(:,:,:) = aeivdta(:,:,:,2) 
    731       aeiw(:,:,:) = aeiwdta(:,:,:,2) 
    732 #  endif 
    733 #endif 
    734       ! 
    735    END SUBROUTINE assign_dyn_data 
    736  
    737  
    738    SUBROUTINE linear_interp_dyn_data( pweigh ) 
    739       !!---------------------------------------------------------------------- 
    740       !!               ***  ROUTINE linear_interp_dyn_data  *** 
    741       !! 
    742       !! ** Purpose :   linear interpolation of data 
    743       !!---------------------------------------------------------------------- 
    744       REAL(wp), INTENT(in) ::   pweigh   ! weigh 
    745       !! 
    746       REAL(wp) :: zweighm1 
    747       !!---------------------------------------------------------------------- 
    748  
    749       zweighm1 = 1. - pweigh 
    750        
    751       tsn(:,:,:,jp_tem) = zweighm1 * tdta  (:,:,:,1) + pweigh * tdta  (:,:,:,2) 
    752       tsn(:,:,:,jp_sal) = zweighm1 * sdta  (:,:,:,1) + pweigh * sdta  (:,:,:,2) 
    753       avt(:,:,:)        = zweighm1 * avtdta(:,:,:,1) + pweigh * avtdta(:,:,:,2) 
    754        
    755       un (:,:,:) = zweighm1 * udta  (:,:,:,1) + pweigh * udta  (:,:,:,2)  
    756       vn (:,:,:) = zweighm1 * vdta  (:,:,:,1) + pweigh * vdta  (:,:,:,2) 
    757       wn (:,:,:) = zweighm1 * wdta  (:,:,:,1) + pweigh * wdta  (:,:,:,2) 
    758        
    759 #if defined key_ldfslp && ! defined key_c1d 
    760       uslp (:,:,:) = zweighm1 * uslpdta (:,:,:,1) + pweigh * uslpdta (:,:,:,2)  
    761       vslp (:,:,:) = zweighm1 * vslpdta (:,:,:,1) + pweigh * vslpdta (:,:,:,2)  
    762       wslpi(:,:,:) = zweighm1 * wslpidta(:,:,:,1) + pweigh * wslpidta(:,:,:,2)  
    763       wslpj(:,:,:) = zweighm1 * wslpjdta(:,:,:,1) + pweigh * wslpjdta(:,:,:,2)  
    764 #endif 
    765  
    766       hmld(:,:) = zweighm1 * hmlddta(:,:,1) + pweigh  * hmlddta(:,:,2)  
    767       wndm(:,:) = zweighm1 * wspddta(:,:,1) + pweigh  * wspddta(:,:,2)  
    768       fr_i(:,:) = zweighm1 * frlddta(:,:,1) + pweigh  * frlddta(:,:,2)  
    769       emp (:,:) = zweighm1 * empdta (:,:,1) + pweigh  * empdta (:,:,2)  
    770       emps(:,:) = emp(:,:)  
    771       qsr (:,:) = zweighm1 * qsrdta (:,:,1) + pweigh  * qsrdta (:,:,2)  
    772 #if defined key_trabbl 
    773       IF( l_offbbl ) THEN 
    774          ahu_bbl(:,:) = zweighm1 * bblxdta(:,:,1) +  pweigh  * bblxdta(:,:,2) 
    775          ahv_bbl(:,:) = zweighm1 * bblydta(:,:,1) +  pweigh  * bblydta(:,:,2) 
    776       ENDIF 
    777 #endif 
    778  
    779 #if ! defined key_degrad && defined key_traldf_c2d && defined key_traldf_eiv  
    780       aeiw(:,:) = zweighm1 * aeiwdta(:,:,1) + pweigh * aeiwdta(:,:,2) 
    781 #endif 
    782        
    783 #if defined key_degrad 
    784       ahtu(:,:,:) = zweighm1 * ahtudta(:,:,:,1) + pweigh * ahtudta(:,:,:,2) 
    785       ahtv(:,:,:) = zweighm1 * ahtvdta(:,:,:,1) + pweigh * ahtvdta(:,:,:,2) 
    786       ahtw(:,:,:) = zweighm1 * ahtwdta(:,:,:,1) + pweigh * ahtwdta(:,:,:,2) 
    787 #  if defined key_traldf_eiv 
    788       aeiu(:,:,:) = zweighm1 * aeiudta(:,:,:,1) + pweigh * aeiudta(:,:,:,2) 
    789       aeiv(:,:,:) = zweighm1 * aeivdta(:,:,:,1) + pweigh * aeivdta(:,:,:,2) 
    790       aeiw(:,:,:) = zweighm1 * aeiwdta(:,:,:,1) + pweigh * aeiwdta(:,:,:,2) 
    791 #  endif 
    792 #endif 
    793       !       
    794    END SUBROUTINE linear_interp_dyn_data 
    795  
     525   END SUBROUTINE dta_dyn_slp 
    796526   !!====================================================================== 
    797527END MODULE dtadyn 
  • branches/2011/dev_r2787_LOCEAN_offline_fldread/NEMOGCM/NEMO/OPA_SRC/trc_oce.F90

    r2715 r2821  
    2525   REAL(wp), PUBLIC                                      ::   r_si2   !: largest depth of extinction (blue & 0.01 mg.m-3)  (RGB) 
    2626   REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) ::   etot3   !: light absortion coefficient 
     27   REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) ::   facvol   !: volume for degraded regions 
    2728 
    2829#if defined key_top && defined key_pisces 
     
    4849   !!---------------------------------------------------------------------- 
    4950   LOGICAL, PUBLIC, PARAMETER ::   lk_offline = .FALSE.   !: offline flag 
     51#endif 
     52#if defined key_degrad 
     53   !!---------------------------------------------------------------------- 
     54   !!   'key_degrad'                                     Degradation mode           
     55   !!---------------------------------------------------------------------- 
     56   LOGICAL, PUBLIC, PARAMETER ::   lk_degrad = .TRUE.   !: degradation flag 
     57#else 
     58   !!---------------------------------------------------------------------- 
     59   !!   Default option                                   NO  Degradation mode           
     60   !!---------------------------------------------------------------------- 
     61   LOGICAL, PUBLIC, PARAMETER ::   lk_degrad = .FALSE.   !: degradation flag 
    5062#endif 
    5163 
     
    6375      !!                  ***  trc_oce_alloc  *** 
    6476      !!---------------------------------------------------------------------- 
    65       ALLOCATE( etot3(jpi,jpj,jpk)   , STAT= trc_oce_alloc ) 
     77      INTEGER ::   ierr(2)        ! Local variables 
     78      !!---------------------------------------------------------------------- 
     79      ierr(:) = 0 
     80                     ALLOCATE( etot3 (jpi,jpj,jpk), STAT=ierr(1) ) 
     81      IF( lk_degrad) ALLOCATE( facvol(jpi,jpj,jpk), STAT=ierr(2) ) 
     82      trc_oce_alloc  = MAXVAL( ierr ) 
    6683      ! 
    6784      IF( trc_oce_alloc /= 0 )   CALL ctl_warn('trc_oce_alloc: failed to allocate etot3 array') 
  • branches/2011/dev_r2787_LOCEAN_offline_fldread/NEMOGCM/NEMO/TOP_SRC/oce_trc.F90

    r2787 r2821  
    198198   USE oce , ONLY :   gru     =>    gru     !: 
    199199   USE oce , ONLY :   grv     =>    grv     !:  
    200 # if defined key_degrad 
    201    USE dommsk , ONLY :   facvol     =>   facvol     !: volume factor for degradation 
    202 # endif 
    203  
    204200#endif 
    205201 
Note: See TracChangeset for help on using the changeset viewer.