New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 2236 for branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/SBC/fldread.F90 – NEMO

Ignore:
Timestamp:
2010-10-12T20:49:32+02:00 (14 years ago)
Author:
cetlod
Message:

First guess of NEMO_v3.3

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/SBC/fldread.F90

    r2004 r2236  
    1515   USE oce             ! ocean dynamics and tracers 
    1616   USE dom_oce         ! ocean space and time domain 
     17   USE ioipsl, ONLY :   ymds2ju, ju2ymds   ! for calendar 
    1718   USE phycst          ! ??? 
    1819   USE in_out_manager  ! I/O manager 
     
    2930      LOGICAL              ::   ln_tint     ! time interpolation or not (T/F) 
    3031      LOGICAL              ::   ln_clim     ! climatology or not (T/F) 
    31       CHARACTER(len = 7)   ::   cltype      ! type of data file 'daily', 'monthly' or yearly' 
     32      CHARACTER(len = 8)   ::   cltype      ! type of data file 'daily', 'monthly' or yearly' 
    3233      CHARACTER(len = 34)  ::   wname       ! generic name of a NetCDF weights file to be used, blank if not 
    3334      CHARACTER(len = 34)  ::   vcomp       ! symbolic component name if a vector that needs rotation 
     
    4344      LOGICAL                         ::   ln_tint      ! time interpolation or not (T/F) 
    4445      LOGICAL                         ::   ln_clim      ! climatology or not (T/F) 
    45       CHARACTER(len = 7)              ::   cltype       ! type of data file 'daily', 'monthly' or yearly' 
     46      CHARACTER(len = 8)              ::   cltype       ! type of data file 'daily', 'monthly' or yearly' 
    4647      INTEGER                         ::   num          ! iom id of the jpfld files to be read 
    4748      INTEGER                         ::   nswap_sec    ! swapping time in second since Jan. 1st 00h of nit000 year 
     
    7879      INTEGER, DIMENSION(:,:,:), POINTER      ::   data_jpj     ! array of source integers 
    7980      REAL(wp), DIMENSION(:,:,:), POINTER     ::   data_wgt     ! array of weights on model grid 
    80       REAL(wp), DIMENSION(:,:), POINTER       ::   fly_dta      ! array of values on input grid 
    81       REAL(wp), DIMENSION(:,:), POINTER       ::   col2         ! temporary array for reading in columns 
     81      REAL(wp), DIMENSION(:,:,:), POINTER       ::   fly_dta      ! array of values on input grid 
     82      REAL(wp), DIMENSION(:,:,:), POINTER       ::   col2         ! temporary array for reading in columns 
    8283   END TYPE WGT 
    8384 
     
    9394   !!   OPA 9.0 , LOCEAN-IPSL (2006)  
    9495   !! $Id$ 
    95    !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
     96   !! Software governed by the CeCILL licence  (NEMOGCM/License_CeCILL.txt) 
    9697   !!---------------------------------------------------------------------- 
    9798 
     
    159160 
    160161               ! last record to be read in the current file 
    161                IF( sd(jf)%nfreqh == -1 ) THEN                  ;   ireclast = 12 
     162               IF( sd(jf)%nfreqh == -1 ) THEN 
     163                  IF(     sd(jf)%cltype == 'monthly'   ) THEN  ;   ireclast = 1 
     164                  ELSE                                         ;   ireclast = 12 
     165                  ENDIF 
    162166               ELSE                              
    163                   IF(     sd(jf)%cltype == 'monthly'   ) THEN  ;   ireclast = 24 * nmonth_len(nmonth) / sd(jf)%nfreqh  
    164                   ELSEIF( sd(jf)%cltype == 'daily'     ) THEN  ;   ireclast = 24                      / sd(jf)%nfreqh 
    165                   ELSE                                         ;   ireclast = 24 * nyear_len(     1 ) / sd(jf)%nfreqh  
     167                  IF(     sd(jf)%cltype      == 'monthly' ) THEN  ;   ireclast = 24 * nmonth_len(nmonth) / sd(jf)%nfreqh  
     168                  ELSEIF( sd(jf)%cltype(1:4) == 'week'    ) THEN  ;   ireclast = 24.* 7                  / sd(jf)%nfreqh 
     169                  ELSEIF( sd(jf)%cltype      == 'daily'   ) THEN  ;   ireclast = 24                      / sd(jf)%nfreqh 
     170                  ELSE                                            ;   ireclast = 24 * nyear_len(     1 ) / sd(jf)%nfreqh  
    166171                  ENDIF 
    167172               ENDIF 
     
    207212            IF( LEN(TRIM(sd(jf)%wgtname)) > 0 ) THEN 
    208213               CALL wgt_list( sd(jf), kw ) 
    209                DO jk = 1, ipk 
    210                   CALL fld_interp( sd(jf)%num, sd(jf)%clvar, kw, sd(jf)%fdta(:,:,jk,2), sd(jf)%nrec_a(1) ) 
    211                END DO 
     214               ipk = SIZE(sd(jf)%fnow,3) 
     215               IF( sd(jf)%ln_tint ) THEN 
     216                  CALL fld_interp( sd(jf)%num, sd(jf)%clvar , kw , ipk, sd(jf)%fdta(:,:,:,2) , sd(jf)%nrec_a(1) ) 
     217               ELSE 
     218                  CALL fld_interp( sd(jf)%num, sd(jf)%clvar , kw , ipk, sd(jf)%fnow(:,:,:)   , sd(jf)%nrec_a(1) ) 
     219               ENDIF 
    212220            ELSE 
    213                IF( ipk == 1 ) THEN  
    214                   CALL iom_get( sd(jf)%num, jpdom_data, sd(jf)%clvar, sd(jf)%fdta(:,:,1,2), sd(jf)%nrec_a(1) ) 
    215                ELSE 
    216                   CALL iom_get( sd(jf)%num, jpdom_data, sd(jf)%clvar, sd(jf)%fdta(:,:,:,2), sd(jf)%nrec_a(1) ) 
    217                ENDIF 
     221               SELECT CASE( SIZE(sd(jf)%fnow,3) ) 
     222               CASE(1)    
     223                  IF( sd(jf)%ln_tint ) THEN 
     224                     CALL iom_get( sd(jf)%num, jpdom_data, sd(jf)%clvar, sd(jf)%fdta(:,:,1,2), sd(jf)%nrec_a(1) ) 
     225                  ELSE 
     226                     CALL iom_get( sd(jf)%num, jpdom_data, sd(jf)%clvar, sd(jf)%fnow(:,:,1)  , sd(jf)%nrec_a(1) ) 
     227                  ENDIF  
     228               CASE(jpk) 
     229                  IF( sd(jf)%ln_tint ) THEN 
     230                     CALL iom_get( sd(jf)%num, jpdom_data, sd(jf)%clvar, sd(jf)%fdta(:,:,:,2), sd(jf)%nrec_a(1) ) 
     231                  ELSE 
     232                     CALL iom_get( sd(jf)%num, jpdom_data, sd(jf)%clvar, sd(jf)%fnow(:,:,:)  , sd(jf)%nrec_a(1) ) 
     233                  ENDIF  
     234               END SELECT 
    218235            ENDIF 
    219236            sd(jf)%rotn(2) = .FALSE. 
     
    249266                IF( kf > 0 ) THEN 
    250267                   !! fields jf,kf are two components which need to be rotated together 
    251                    DO nf = 1,2 
     268                   IF( sd(jf)%ln_tint )THEN 
     269                      DO nf = 1,2 
     270                         !! check each time level of this pair 
     271                         IF( .NOT. sd(jf)%rotn(nf) .AND. .NOT. sd(kf)%rotn(nf) ) THEN 
     272                            utmp(:,:) = 0.0 
     273                            vtmp(:,:) = 0.0 
     274                            ! 
     275                            ipk = SIZE( sd(kf)%fnow(:,:,:) ,3 ) 
     276                            DO jk = 1,ipk 
     277                               CALL rot_rep( sd(jf)%fdta(:,:,jk,nf),sd(kf)%fdta(:,:,jk,nf),'T', 'en->i', utmp(:,:) ) 
     278                               CALL rot_rep( sd(jf)%fdta(:,:,jk,nf),sd(kf)%fdta(:,:,jk,nf),'T', 'en->j', vtmp(:,:) ) 
     279                               sd(jf)%fdta(:,:,jk,nf) = utmp(:,:) 
     280                               sd(kf)%fdta(:,:,jk,nf) = vtmp(:,:) 
     281                            ENDDO 
     282                            ! 
     283                            sd(jf)%rotn(nf) = .TRUE. 
     284                            sd(kf)%rotn(nf) = .TRUE. 
     285                            IF( lwp .AND. kt == nit000 ) & 
     286                                      WRITE(numout,*) 'fld_read: vector pair (',  & 
     287                                                      TRIM(sd(jf)%clvar),',',TRIM(sd(kf)%clvar), & 
     288                                                      ') rotated on to model grid' 
     289                         ENDIF 
     290                      END DO 
     291                   ELSE  
    252292                      !! check each time level of this pair 
    253293                      IF( .NOT. sd(jf)%rotn(nf) .AND. .NOT. sd(kf)%rotn(nf) ) THEN 
     
    255295                         vtmp(:,:) = 0.0 
    256296                         ! 
    257                          DO jk = 1, SIZE( sd(kf)%fdta, 3 ) 
    258                             CALL rot_rep( sd(jf)%fdta(:,:,jk,nf),sd(kf)%fdta(:,:,jk,nf),'T', 'en->i', utmp(:,:) ) 
    259                             CALL rot_rep( sd(jf)%fdta(:,:,jk,nf),sd(kf)%fdta(:,:,jk,nf),'T', 'en->j', vtmp(:,:) ) 
    260                             sd(jf)%fdta(:,:,jk,nf) = utmp(:,:) 
    261                             sd(kf)%fdta(:,:,jk,nf) = vtmp(:,:) 
    262                          END DO 
     297                         ipk = SIZE( sd(kf)%fnow(:,:,:) ,3 ) 
     298                         DO jk = 1,ipk 
     299                            CALL rot_rep( sd(jf)%fnow(:,:,jk),sd(kf)%fnow(:,:,jk),'T', 'en->i', utmp(:,:) ) 
     300                            CALL rot_rep( sd(jf)%fnow(:,:,jk),sd(kf)%fnow(:,:,jk),'T', 'en->j', vtmp(:,:) ) 
     301                            sd(jf)%fnow(:,:,jk) = utmp(:,:) 
     302                            sd(kf)%fnow(:,:,jk) = vtmp(:,:) 
     303                         ENDDO 
    263304                         ! 
    264305                         sd(jf)%rotn(nf) = .TRUE. 
     
    269310                                                   ') rotated on to model grid' 
    270311                      ENDIF 
    271                    END DO 
     312                   ENDIF 
    272313                ENDIF 
    273314             ENDIF 
     
    301342               ENDIF 
    302343!CDIR COLLAPSE 
    303                sd(jf)%fnow(:,:,:) = sd(jf)%fdta(:,:,:,2)   ! piecewise constant field 
    304   
    305344            ENDIF 
    306345            ! 
     
    326365      TYPE(FLD), INTENT(inout) ::   sdjf        ! input field related variables 
    327366      !! 
    328       LOGICAL :: llprevyr       ! are we reading previous year  file? 
    329       LOGICAL :: llprevmth      ! are we reading previous month file? 
    330       LOGICAL :: llprevday      ! are we reading previous day   file? 
    331       LOGICAL :: llprev         ! llprevyr .OR. llprevmth .OR. llprevday 
    332       INTEGER :: idvar          ! variable id  
    333       INTEGER :: inrec          ! number of record existing for this variable 
     367      LOGICAL :: llprevyr              ! are we reading previous year  file? 
     368      LOGICAL :: llprevmth             ! are we reading previous month file? 
     369      LOGICAL :: llprevweek            ! are we reading previous week file? 
     370      LOGICAL :: llprevday             ! are we reading previous day   file? 
     371      LOGICAL :: llprev                ! llprevyr .OR. llprevmth .OR. llprevday 
     372      INTEGER :: idvar                 ! variable id  
     373      INTEGER :: inrec                 ! number of record existing for this variable 
    334374      INTEGER :: kwgt 
    335       INTEGER :: jk             ! vertical loop variable 
    336       INTEGER :: ipk            ! number of vertical levels of sdjf%fdta ( 2D: ipk=1 ; 3D: ipk=jpk ) 
     375      INTEGER :: jk             !vertical loop variable 
     376      INTEGER :: ipk            !number of vertical levels of sdjf%fdta ( 2D: ipk=1 ; 3D: ipk=jpk ) 
     377      INTEGER :: iyear, imonth, iday   ! first day of the current file in yyyy mm dd 
     378      INTEGER :: isec_week             ! number of seconds since start of the weekly file 
    337379      CHARACTER(LEN=1000) ::   clfmt   ! write format 
    338380      !!--------------------------------------------------------------------- 
    339  
     381       
    340382      ! some default definitions... 
    341383      sdjf%num = 0   ! default definition for non-opened file 
    342384      IF( sdjf%ln_clim )   sdjf%clname = TRIM( sdjf%clrootname )   ! file name defaut definition, never change in this case 
    343       llprevyr  = .FALSE. 
    344       llprevmth = .FALSE. 
    345       llprevday = .FALSE. 
     385      llprevyr   = .FALSE. 
     386      llprevmth  = .FALSE. 
     387      llprevweek = .FALSE. 
     388      llprevday  = .FALSE. 
     389      isec_week  = 0 
    346390             
    347391      ! define record informations 
     
    365409                  llprevmth = .NOT. sdjf%ln_clim                                           ! use previous month file? 
    366410                  llprevyr  = llprevmth .AND. nmonth == 1                                  ! use previous year  file? 
     411               ELSE IF ( sdjf%cltype(1:4) == 'week' ) THEN !weekly file 
     412                  isec_week = 86400 * 7 
     413                  sdjf%nrec_b(1) = 24. / sdjf%nfreqh * 7                                   ! last record of previous weekly file 
    367414               ELSEIF( sdjf%cltype == 'daily' ) THEN ! daily file 
    368415                  sdjf%nrec_b(1) = 24 / sdjf%nfreqh                                        ! last record of previous day 
     
    376423            ENDIF 
    377424         ENDIF 
    378          llprev = llprevyr .OR. llprevmth .OR. llprevday 
     425         llprev = llprevyr .OR. llprevmth .OR. llprevweek .OR. llprevday 
    379426 
    380427         CALL fld_clopn( sdjf, nyear  - COUNT((/llprevyr /))                                              ,               & 
    381428            &                  nmonth - COUNT((/llprevmth/)) + 12                   * COUNT((/llprevyr /)),               & 
    382429            &                  nday   - COUNT((/llprevday/)) + nmonth_len(nmonth-1) * COUNT((/llprevmth/)), .NOT. llprev ) 
    383           
     430 
     431         IF ( sdjf%cltype(1:4) == 'week' ) THEN 
     432            isec_week  = ksec_week( sdjf%cltype(6:8) ) 
     433            if(lwp)write(numout,*)'cbr test2 isec_week = ',isec_week 
     434            llprevmth  = ( isec_week .GT. nsec_month ) 
     435            llprevyr   = llprevmth  .AND. nmonth==1 
     436         ENDIF 
     437         ! 
     438         iyear  = nyear  - COUNT((/llprevyr /)) 
     439         imonth = nmonth - COUNT((/llprevmth/)) + 12* COUNT((/llprevyr /)) 
     440         iday   = nday   - COUNT((/llprevday/)) + nmonth_len(nmonth-1) * COUNT((/llprevmth/)) - INT( isec_week )/86400 
     441         ! 
     442         CALL fld_clopn( sdjf , iyear , imonth , iday , .NOT. llprev ) 
     443 
    384444         ! if previous year/month/day file does not exist, we switch to the current year/month/day 
    385445         IF( llprev .AND. sdjf%num <= 0 ) THEN 
     
    399459 
    400460         ! read before data into sdjf%fdta(:,:,2) because we will swap data in the following part of fld_read 
    401          ipk = SIZE( sdjf%fdta, 3 ) 
    402461         IF( LEN(TRIM(sdjf%wgtname)) > 0 ) THEN 
    403462            CALL wgt_list( sdjf, kwgt ) 
    404             DO jk = 1, ipk 
    405                CALL fld_interp( sdjf%num, sdjf%clvar, kwgt, sdjf%fdta(:,:,jk,2), sdjf%nrec_b(1) ) 
    406             END DO 
     463            ipk = SIZE(sdjf%fnow,3) 
     464            IF( sdjf%ln_tint ) THEN 
     465               CALL fld_interp( sdjf%num, sdjf%clvar, kwgt, ipk, sdjf%fdta(:,:,:,2), sdjf%nrec_a(1) ) 
     466            ELSE 
     467               CALL fld_interp( sdjf%num, sdjf%clvar, kwgt, ipk, sdjf%fnow(:,:,:)  , sdjf%nrec_a(1) ) 
     468            ENDIF 
    407469         ELSE 
    408             IF( ipk == 1 ) THEN 
    409                CALL iom_get( sdjf%num, jpdom_data, sdjf%clvar, sdjf%fdta(:,:,1,2), sdjf%nrec_b(1) ) 
    410             ELSE 
    411                CALL iom_get( sdjf%num, jpdom_data, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_b(1) ) 
    412             ENDIF 
     470            SELECT CASE( SIZE(sdjf%fnow,3) ) 
     471            CASE(1) 
     472               IF( sdjf%ln_tint ) THEN 
     473                  CALL iom_get( sdjf%num, jpdom_data, sdjf%clvar, sdjf%fdta(:,:,1,2), sdjf%nrec_b(1) ) 
     474               ELSE 
     475                  CALL iom_get( sdjf%num, jpdom_data, sdjf%clvar, sdjf%fnow(:,:,1)  , sdjf%nrec_b(1) ) 
     476               ENDIF 
     477            CASE(jpk) 
     478               IF( sdjf%ln_tint ) THEN 
     479                  CALL iom_get( sdjf%num, jpdom_data, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_b(1) ) 
     480               ELSE 
     481                  CALL iom_get( sdjf%num, jpdom_data, sdjf%clvar, sdjf%fnow(:,:,:)  , sdjf%nrec_b(1) ) 
     482               ENDIF 
     483            END SELECT 
    413484         ENDIF 
    414485         sdjf%rotn(2) = .FALSE. 
     
    422493 
    423494      IF( sdjf%num <= 0 )   CALL fld_clopn( sdjf, nyear, nmonth, nday )   ! make sure current year/month/day file is opened 
     495      ! make sure current year/month/day file is opened 
     496      IF( sdjf%num == 0 ) THEN 
     497         isec_week   = 0 
     498         llprevyr    = .FALSE. 
     499         llprevmth   = .FALSE. 
     500         llprevweek  = .FALSE. 
     501         ! 
     502         IF ( sdjf%cltype(1:4) == 'week' ) THEN 
     503            isec_week  = ksec_week( sdjf%cltype(6:8) ) 
     504            llprevmth  = ( isec_week .GT. nsec_month ) 
     505            llprevyr   = llprevmth  .AND. nmonth==1 
     506         ENDIF 
     507         ! 
     508         iyear  = nyear  - COUNT((/llprevyr /)) 
     509         imonth = nmonth - COUNT((/llprevmth/)) + 12* COUNT((/llprevyr /)) 
     510         iday   = nday   + nmonth_len(nmonth-1) * COUNT((/llprevmth/)) - isec_week/86400 
     511         ! 
     512         CALL fld_clopn( sdjf, iyear, imonth, iday ) 
     513      ENDIF  
    424514 
    425515      sdjf%nswap_sec = nsec_year + nsec1jan000 - 1   ! force read/update the after data in the following part of fld_read  
    426        
     516      
     517 
    427518   END SUBROUTINE fld_init 
    428519 
     
    442533      REAL(wp) ::   ztmp        ! temporary variable 
    443534      INTEGER  ::   ifreq_sec   ! frequency mean (in seconds) 
     535      INTEGER  ::   isec_week   ! number of seconds since the start of the weekly file 
    444536      !!---------------------------------------------------------------------- 
    445537      ! 
     
    458550            !       forcing record :  nmonth  
    459551            !                             
     552            ztmp  = 0.e0 
    460553            ztmp  = REAL( nday, wp ) / REAL( nmonth_len(nmonth), wp ) + 0.5 
    461554         ELSE 
     
    468561         ENDIF 
    469562 
    470          sdjf%nrec_a(:) = (/ irec, nmonth_half(irec) + nsec1jan000 /)   ! define after  record number and time 
    471          irec = irec - 1                                                ! move back to previous record 
    472          sdjf%nrec_b(:) = (/ irec, nmonth_half(irec) + nsec1jan000 /)   ! define before record number and time 
     563         IF( sdjf%cltype == 'monthly' ) THEN 
     564 
     565            sdjf%nrec_b(:) = (/ 0, nmonth_half(irec - 1 ) + nsec1jan000 /) 
     566            sdjf%nrec_a(:) = (/ 1, nmonth_half(irec     ) + nsec1jan000 /) 
     567 
     568            IF( ztmp  == 1. ) THEN 
     569              sdjf%nrec_b(1) = 1 
     570              sdjf%nrec_a(1) = 2 
     571            ENDIF 
     572 
     573         ELSE 
     574 
     575            sdjf%nrec_a(:) = (/ irec, nmonth_half(irec) + nsec1jan000 /)   ! define after  record number and time 
     576            irec = irec - 1                                                ! move back to previous record 
     577            sdjf%nrec_b(:) = (/ irec, nmonth_half(irec) + nsec1jan000 /)   ! define before record number and time 
     578 
     579         ENDIF 
    473580         ! 
    474581      ELSE                              ! higher frequency mean (in hours) 
    475582         ! 
    476583         ifreq_sec = sdjf%nfreqh * 3600   ! frequency mean (in seconds) 
     584         IF( sdjf%cltype(1:4) == 'week'    ) isec_week = ksec_week( sdjf%cltype(6:8)) !since the first day of the current week 
    477585         ! number of second since the beginning of the file 
    478          IF(     sdjf%cltype == 'monthly' ) THEN   ;   ztmp = REAL(nsec_month,wp)   ! since 00h on the 1st day of the current month 
    479          ELSEIF( sdjf%cltype == 'daily'   ) THEN   ;   ztmp = REAL(nsec_day  ,wp)   ! since 00h of the current day 
    480          ELSE                                      ;   ztmp = REAL(nsec_year ,wp)   ! since 00h on Jan 1 of the current year 
     586         IF(     sdjf%cltype      == 'monthly' ) THEN   ;   ztmp = REAL(nsec_month ,wp)  ! since 00h on the 1st day of the current month 
     587         ELSEIF( sdjf%cltype(1:4) == 'week'    ) THEN   ;   ztmp = REAL(isec_week  ,wp)  ! since the first day of the current week 
     588         ELSEIF( sdjf%cltype      == 'daily'   ) THEN   ;   ztmp = REAL(nsec_day   ,wp)  ! since 00h of the current day 
     589         ELSE                                           ;   ztmp = REAL(nsec_year  ,wp)  ! since 00h on Jan 1 of the current year 
    481590         ENDIF 
    482591         IF( sdjf%ln_tint ) THEN                ! time interpolation, shift by 1/2 record 
     
    514623         ! after record index and second since Jan. 1st 00h of nit000 year 
    515624         sdjf%nrec_a(:) = (/ irec, ifreq_sec * irec - ifreq_sec / 2 + nsec1jan000 /) 
    516          IF( sdjf%cltype == 'monthly' )   &   ! add the number of seconds between 00h Jan 1 and the end of previous month 
     625         IF( sdjf%cltype == 'monthly' )       &   ! add the number of seconds between 00h Jan 1 and the end of previous month 
    517626            sdjf%nrec_a(2) = sdjf%nrec_a(2) + isecd * SUM(nmonth_len(1:nmonth -1))   ! ok if nmonth=1 
    518          IF( sdjf%cltype == 'daily'   )   &   ! add the number of seconds between 00h Jan 1 and the end of previous day 
     627         IF( sdjf%cltype(1:4) == 'week'   )   &   ! add the number of seconds between 00h Jan 1 and the end of previous week  
     628            sdjf%nrec_a(2) = sdjf%nrec_a(2) + ( nsec_year - isec_week ) 
     629         IF( sdjf%cltype == 'daily'   )       &   ! add the number of seconds between 00h Jan 1 and the end of previous day 
    519630            sdjf%nrec_a(2) = sdjf%nrec_a(2) + isecd * ( nday_year - 1 ) 
    520631 
     
    522633         irec = irec - 1.                           ! move back to previous record 
    523634         sdjf%nrec_b(:) = (/ irec, ifreq_sec * irec - ifreq_sec / 2 + nsec1jan000 /) 
    524          IF( sdjf%cltype == 'monthly' )   &   ! add the number of seconds between 00h Jan 1 and the end of previous month 
     635         IF( sdjf%cltype == 'monthly' )       &   ! add the number of seconds between 00h Jan 1 and the end of previous month 
    525636            sdjf%nrec_b(2) = sdjf%nrec_b(2) + isecd * SUM(nmonth_len(1:nmonth -1))   ! ok if nmonth=1 
    526          IF( sdjf%cltype == 'daily'   )   &   ! add the number of seconds between 00h Jan 1 and the end of previous day 
     637         IF( sdjf%cltype(1:4) == 'week'   )   &   ! add the number of seconds between 00h Jan 1 and the end of previous week 
     638            sdjf%nrec_b(2) = sdjf%nrec_b(2) + ( nsec_year - isec_week ) 
     639         IF( sdjf%cltype == 'daily'   )       &   ! add the number of seconds between 00h Jan 1 and the end of previous day 
    527640            sdjf%nrec_b(2) = sdjf%nrec_b(2) + isecd * ( nday_year - 1 ) 
    528641 
     
    545658      !! ** Method  :    
    546659      !!---------------------------------------------------------------------- 
    547       TYPE(FLD), INTENT(inout)           ::   sdjf     ! input field related variables 
    548       INTEGER  , INTENT(in   )           ::   kyear    ! year value 
    549       INTEGER  , INTENT(in   )           ::   kmonth   ! month value 
    550       INTEGER  , INTENT(in   )           ::   kday     ! day value 
    551       LOGICAL  , INTENT(in   ), OPTIONAL ::   ldstop   ! stop if open to read a non-existing file (default = .TRUE.) 
     660      TYPE(FLD), INTENT(inout)           ::   sdjf                      ! input field related variables 
     661      INTEGER  , INTENT(in   )           ::   kyear                     ! year value 
     662      INTEGER  , INTENT(in   )           ::   kmonth                    ! month value 
     663      INTEGER  , INTENT(in   )           ::   kday                      ! day value 
     664      LOGICAL  , INTENT(in   ), OPTIONAL ::   ldstop                    ! stop if open to read a non-existing file (default = .TRUE.) 
     665      INTEGER                            ::   iyear, imonth, iday       ! firt day of the current week in yyyy mm dd 
     666      REAL(wp)                           ::   zsec, zjul                !temp variable 
    552667 
    553668      IF( sdjf%num /= 0 )   CALL iom_close( sdjf%num )   ! close file if already open 
    554669      ! build the new filename if not climatological data 
    555       IF( .NOT. sdjf%ln_clim ) THEN   ;   WRITE(sdjf%clname, '(a,"_y",i4.4)' ) TRIM( sdjf%clrootname ), kyear    ! add year 
    556          IF( sdjf%cltype /= 'yearly' )    WRITE(sdjf%clname, '(a,"m" ,i2.2)' ) TRIM( sdjf%clname     ), kmonth   ! add month 
    557          IF( sdjf%cltype == 'daily'  )    WRITE(sdjf%clname, '(a,"d" ,i2.2)' ) TRIM( sdjf%clname     ), kday     ! add day 
     670      sdjf%clname=TRIM(sdjf%clrootname) 
     671      ! 
     672      IF(  sdjf%cltype(1:4) == 'week' .AND. nn_leapy==0 )CALL ctl_stop( 'fld_clopn: weekly file and nn_leapy=0 are not compatible' ) 
     673      ! 
     674      IF( .NOT. sdjf%ln_clim ) THEN    
     675         WRITE(sdjf%clname, '(a,"_y",i4.4)' ) TRIM( sdjf%clrootname ), kyear    ! add year 
     676         IF( sdjf%cltype /= 'yearly'        )   &  
     677            &     WRITE(sdjf%clname, '(a,"m" ,i2.2)' ) TRIM( sdjf%clname ), kmonth   ! add month 
     678         IF( sdjf%cltype == 'daily'  .OR. sdjf%cltype(1:4) == 'week' ) & 
     679            &     WRITE(sdjf%clname, '(a,"d" ,i2.2)' ) TRIM( sdjf%clname ), kday     ! add day 
     680      ELSE 
     681         ! build the new filename if climatological data 
     682         IF( sdjf%cltype == 'monthly' )   WRITE(sdjf%clname, '(a,"_m" ,i2.2)' ) TRIM( sdjf%clrootname ), kmonth   ! add month 
    558683      ELSE 
    559684         ! build the new filename if climatological data 
     
    610735               &                          ' pairing    : '    , TRIM( sdf(jf)%vcomp      ),   & 
    611736               &                          ' data type: '      ,       sdf(jf)%cltype 
     737            call flush(numout) 
    612738         END DO 
    613739      ENDIF 
     
    707833      INTEGER                                 ::   inum          ! temporary logical unit 
    708834      INTEGER                                 ::   id            ! temporary variable id 
     835      INTEGER                                 ::   ipk           ! temporary vertical dimension 
    709836      CHARACTER (len=5)                       ::   aname 
    710837      INTEGER , DIMENSION(3)                  ::   ddims 
     
    869996         ! SA: +3 stencil is a patch to avoid out-of-bound computation in some configuration.  
    870997         ! a more robust solution will be given in next release 
    871          ALLOCATE( ref_wgts(nxt_wgt)%fly_dta(ref_wgts(nxt_wgt)%jpiwgt+3, ref_wgts(nxt_wgt)%jpjwgt+3) ) 
    872          IF( ref_wgts(nxt_wgt)%cyclic ) ALLOCATE( ref_wgts(nxt_wgt)%col2(2,ref_wgts(nxt_wgt)%jpjwgt+3) ) 
     998         ipk =  SIZE(sd%fnow,3) 
     999         ALLOCATE( ref_wgts(nxt_wgt)%fly_dta(ref_wgts(nxt_wgt)%jpiwgt+3, ref_wgts(nxt_wgt)%jpjwgt+3 ,ipk) ) 
     1000         IF( ref_wgts(nxt_wgt)%cyclic ) ALLOCATE( ref_wgts(nxt_wgt)%col2(2,ref_wgts(nxt_wgt)%jpjwgt+3,ipk) ) 
    8731001 
    8741002         nxt_wgt = nxt_wgt + 1 
     
    8801008   END SUBROUTINE fld_weight 
    8811009 
    882    SUBROUTINE fld_interp(num, clvar, kw, dta, nrec) 
     1010   SUBROUTINE fld_interp(num, clvar, kw, kk, dta, nrec) 
    8831011      !!--------------------------------------------------------------------- 
    8841012      !!                    ***  ROUTINE fld_interp  *** 
     
    8921020      CHARACTER(LEN=*), INTENT(in)                        ::   clvar               ! variable name 
    8931021      INTEGER,          INTENT(in)                        ::   kw                  ! weights number 
    894       REAL(wp),         INTENT(inout), DIMENSION(jpi,jpj) ::   dta                 ! output field on model grid 
     1022      INTEGER,          INTENT(in)                        ::   kk                  ! vertical dimension of kk 
     1023      REAL(wp),         INTENT(inout), DIMENSION(jpi,jpj,kk) ::   dta              ! output field on model grid 
    8951024      INTEGER,          INTENT(in)                        ::   nrec                ! record number to read (ie time slice) 
    8961025      !!  
    897       INTEGER, DIMENSION(2)                               ::   rec1,recn           ! temporary arrays for start and length 
     1026      INTEGER, DIMENSION(3)                               ::   rec1,recn           ! temporary arrays for start and length 
    8981027      INTEGER                                             ::  jk, jn, jm           ! loop counters 
    8991028      INTEGER                                             ::  ni, nj               ! lengths 
     
    9181047      rec1(1) = MAX( jpimin-1, 1 ) 
    9191048      rec1(2) = MAX( jpjmin-1, 1 ) 
     1049      rec1(3) = 1 
    9201050      recn(1) = MIN( jpiwid+2, ref_wgts(kw)%ddims(1)-rec1(1)+1 ) 
    9211051      recn(2) = MIN( jpjwid+2, ref_wgts(kw)%ddims(2)-rec1(2)+1 ) 
     1052      recn(3) = kk 
    9221053 
    9231054      !! where we need to read it to 
     
    9271058      jpj2 = jpj1 + recn(2) - 1 
    9281059 
    929       ref_wgts(kw)%fly_dta(:,:) = 0.0 
    930       CALL iom_get( num, jpdom_unknown, clvar, ref_wgts(kw)%fly_dta(jpi1:jpi2,jpj1:jpj2), nrec, rec1, recn) 
     1060      ref_wgts(kw)%fly_dta(:,:,:) = 0.0 
     1061      SELECT CASE( SIZE(ref_wgts(kw)%fly_dta(jpi1:jpi2,jpj1:jpj2,:),3) ) 
     1062      CASE(1) 
     1063           CALL iom_get( num, jpdom_unknown, clvar, ref_wgts(kw)%fly_dta(jpi1:jpi2,jpj1:jpj2,1), nrec, rec1, recn) 
     1064      CASE(jpk)   
     1065           CALL iom_get( num, jpdom_unknown, clvar, ref_wgts(kw)%fly_dta(jpi1:jpi2,jpj1:jpj2,:), nrec, rec1, recn) 
     1066      END SELECT  
    9311067 
    9321068      !! first four weights common to both bilinear and bicubic 
    9331069      !! note that we have to offset by 1 into fly_dta array because of halo 
    934       dta(:,:) = 0.0 
     1070      dta(:,:,:) = 0.0 
    9351071      DO jk = 1,4 
    936         DO jn = 1, jpj 
    937           DO jm = 1,jpi 
     1072        DO jn = 1, nlcj 
     1073          DO jm = 1,nlci 
    9381074            ni = ref_wgts(kw)%data_jpi(jm,jn,jk) 
    9391075            nj = ref_wgts(kw)%data_jpj(jm,jn,jk) 
    940             dta(jm,jn) = dta(jm,jn) + ref_wgts(kw)%data_wgt(jm,jn,jk) * ref_wgts(kw)%fly_dta(ni+1,nj+1) 
     1076            dta(jm,jn,:) = dta(jm,jn,:) + ref_wgts(kw)%data_wgt(jm,jn,jk) * ref_wgts(kw)%fly_dta(ni+1,nj+1,jk) 
    9411077          END DO 
    9421078        END DO 
     
    9471083        !! fix up halo points that we couldnt read from file 
    9481084        IF( jpi1 == 2 ) THEN 
    949            ref_wgts(kw)%fly_dta(jpi1-1,:) = ref_wgts(kw)%fly_dta(jpi1,:) 
     1085           ref_wgts(kw)%fly_dta(jpi1-1,:,:) = ref_wgts(kw)%fly_dta(jpi1,:,:) 
    9501086        ENDIF 
    9511087        IF( jpi2 + jpimin - 1 == ref_wgts(kw)%ddims(1)+1 ) THEN 
    952            ref_wgts(kw)%fly_dta(jpi2+1,:) = ref_wgts(kw)%fly_dta(jpi2,:) 
     1088           ref_wgts(kw)%fly_dta(jpi2+1,:,:) = ref_wgts(kw)%fly_dta(jpi2,:,:) 
    9531089        ENDIF 
    9541090        IF( jpj1 == 2 ) THEN 
    955            ref_wgts(kw)%fly_dta(:,jpj1-1) = ref_wgts(kw)%fly_dta(:,jpj1) 
     1091           ref_wgts(kw)%fly_dta(:,jpj1-1,:) = ref_wgts(kw)%fly_dta(:,jpj1,:) 
    9561092        ENDIF 
    9571093        IF( jpj2 + jpjmin - 1 == ref_wgts(kw)%ddims(2)+1 .AND. jpj2 .lt. jpjwid+2 ) THEN 
    958            ref_wgts(kw)%fly_dta(:,jpj2+1) = 2.0*ref_wgts(kw)%fly_dta(:,jpj2) - ref_wgts(kw)%fly_dta(:,jpj2-1) 
     1094           ref_wgts(kw)%fly_dta(:,jpj2+1,:) = 2.0*ref_wgts(kw)%fly_dta(:,jpj2,:) - ref_wgts(kw)%fly_dta(:,jpj2-1,:) 
    9591095        ENDIF 
    9601096 
     
    9691105           IF( jpi1 == 2 ) THEN 
    9701106              rec1(1) = ref_wgts(kw)%ddims(1) - 1 
    971               CALL iom_get( num, jpdom_unknown, clvar, ref_wgts(kw)%col2(:,jpj1:jpj2), nrec, rec1, recn) 
    972               ref_wgts(kw)%fly_dta(jpi1-1,jpj1:jpj2) = ref_wgts(kw)%col2(ref_wgts(kw)%offset+1,jpj1:jpj2) 
     1107              SELECT CASE( SIZE( ref_wgts(kw)%col2(:,jpj1:jpj2,:),3) ) 
     1108              CASE(1) 
     1109                   CALL iom_get( num, jpdom_unknown, clvar, ref_wgts(kw)%col2(:,jpj1:jpj2,1), nrec, rec1, recn) 
     1110              CASE(jpk)          
     1111                   CALL iom_get( num, jpdom_unknown, clvar, ref_wgts(kw)%col2(:,jpj1:jpj2,:), nrec, rec1, recn) 
     1112              END SELECT       
     1113              ref_wgts(kw)%fly_dta(jpi1-1,jpj1:jpj2,:) = ref_wgts(kw)%col2(ref_wgts(kw)%offset+1,jpj1:jpj2,:) 
    9731114           ENDIF 
    9741115           IF( jpi2 + jpimin - 1 == ref_wgts(kw)%ddims(1)+1 ) THEN 
    9751116              rec1(1) = 1 
    976               CALL iom_get( num, jpdom_unknown, clvar, ref_wgts(kw)%col2(:,jpj1:jpj2), nrec, rec1, recn) 
    977               ref_wgts(kw)%fly_dta(jpi2+1,jpj1:jpj2) = ref_wgts(kw)%col2(2-ref_wgts(kw)%offset,jpj1:jpj2) 
     1117              SELECT CASE( SIZE( ref_wgts(kw)%col2(:,jpj1:jpj2,:),3) ) 
     1118              CASE(1) 
     1119                   CALL iom_get( num, jpdom_unknown, clvar, ref_wgts(kw)%col2(:,jpj1:jpj2,1), nrec, rec1, recn) 
     1120              CASE(jpk) 
     1121                   CALL iom_get( num, jpdom_unknown, clvar, ref_wgts(kw)%col2(:,jpj1:jpj2,:), nrec, rec1, recn) 
     1122              END SELECT 
     1123              ref_wgts(kw)%fly_dta(jpi2+1,jpj1:jpj2,:) = ref_wgts(kw)%col2(2-ref_wgts(kw)%offset,jpj1:jpj2,:) 
    9781124           ENDIF 
    9791125        ENDIF 
     
    9811127        ! gradient in the i direction 
    9821128        DO jk = 1,4 
    983           DO jn = 1, jpj 
    984             DO jm = 1,jpi 
     1129          DO jn = 1, nlcj 
     1130            DO jm = 1,nlci 
    9851131              ni = ref_wgts(kw)%data_jpi(jm,jn,jk) 
    9861132              nj = ref_wgts(kw)%data_jpj(jm,jn,jk) 
    987               dta(jm,jn) = dta(jm,jn) + ref_wgts(kw)%data_wgt(jm,jn,jk+4) * 0.5 *         & 
    988                                (ref_wgts(kw)%fly_dta(ni+2,nj+1) - ref_wgts(kw)%fly_dta(ni,nj+1)) 
     1133              dta(jm,jn,:) = dta(jm,jn,:) + ref_wgts(kw)%data_wgt(jm,jn,jk+4) * 0.5 *         & 
     1134                               (ref_wgts(kw)%fly_dta(ni+2,nj+1,:) - ref_wgts(kw)%fly_dta(ni,nj+1,:)) 
    9891135            END DO 
    9901136          END DO 
     
    9931139        ! gradient in the j direction 
    9941140        DO jk = 1,4 
    995           DO jn = 1, jpj 
    996             DO jm = 1,jpi 
     1141          DO jn = 1, nlcj 
     1142            DO jm = 1,nlci 
    9971143              ni = ref_wgts(kw)%data_jpi(jm,jn,jk) 
    9981144              nj = ref_wgts(kw)%data_jpj(jm,jn,jk) 
    999               dta(jm,jn) = dta(jm,jn) + ref_wgts(kw)%data_wgt(jm,jn,jk+8) * 0.5 *         & 
    1000                                (ref_wgts(kw)%fly_dta(ni+1,nj+2) - ref_wgts(kw)%fly_dta(ni+1,nj)) 
     1145              dta(jm,jn,:) = dta(jm,jn,:) + ref_wgts(kw)%data_wgt(jm,jn,jk+8) * 0.5 *         & 
     1146                               (ref_wgts(kw)%fly_dta(ni+1,nj+2,:) - ref_wgts(kw)%fly_dta(ni+1,nj,:)) 
    10011147            END DO 
    10021148          END DO 
     
    10091155              ni = ref_wgts(kw)%data_jpi(jm,jn,jk) 
    10101156              nj = ref_wgts(kw)%data_jpj(jm,jn,jk) 
    1011               dta(jm,jn) = dta(jm,jn) + ref_wgts(kw)%data_wgt(jm,jn,jk+12) * 0.25 * ( & 
    1012                                (ref_wgts(kw)%fly_dta(ni+2,nj+2) - ref_wgts(kw)%fly_dta(ni  ,nj+2)) -   & 
    1013                                (ref_wgts(kw)%fly_dta(ni+2,nj  ) - ref_wgts(kw)%fly_dta(ni  ,nj  ))) 
     1157              dta(jm,jn,:) = dta(jm,jn,:) + ref_wgts(kw)%data_wgt(jm,jn,jk+12) * 0.25 * ( & 
     1158                               (ref_wgts(kw)%fly_dta(ni+2,nj+2,:) - ref_wgts(kw)%fly_dta(ni  ,nj+2,:)) -   & 
     1159                               (ref_wgts(kw)%fly_dta(ni+2,nj  ,:) - ref_wgts(kw)%fly_dta(ni  ,nj  ,:))) 
    10141160            END DO 
    10151161          END DO 
     
    10191165 
    10201166   END SUBROUTINE fld_interp 
    1021    
     1167 
     1168   FUNCTION ksec_week( cdday ) 
     1169      !!--------------------------------------------------------------------- 
     1170      !!                    ***  FUNCTION kshift_week ***  
     1171      !! 
     1172      !! ** Purpose :   
     1173      !! 
     1174      !! ** Method  : 
     1175      !!--------------------------------------------------------------------- 
     1176      CHARACTER(len=*), INTENT(in)   ::   cdday   !3 first letters of the first day of the weekly file 
     1177      !! 
     1178      INTEGER                        ::   ksec_week  ! output variable 
     1179      INTEGER                        ::   ijul       !temp variable 
     1180      INTEGER                        ::   ishift     !temp variable 
     1181      CHARACTER(len=3),DIMENSION(7)  ::   cl_week  
     1182      !!---------------------------------------------------------------------- 
     1183      cl_week = (/"sun","sat","fri","thu","wed","tue","mon"/) 
     1184      DO ijul=1,7 
     1185         IF(  cl_week(ijul)==TRIM(cdday) ) EXIT 
     1186      ENDDO 
     1187      IF( ijul .GT. 7 ) CALL ctl_stop( 'ksec_week: wrong day for sdjf%cltype(6:8): ',TRIM(cdday) ) 
     1188      ! 
     1189      ishift = ( ijul  ) * 86400 
     1190      !  
     1191      ksec_week = nsec_week + ishift 
     1192      ksec_week = MOD( ksec_week , 86400*7 ) 
     1193      if(lwp)write(numout,*)'cbr ijul ksec_week ',ijul,ksec_week 
     1194      !  
     1195   END FUNCTION ksec_week 
     1196 
    10221197END MODULE fldread 
Note: See TracChangeset for help on using the changeset viewer.