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 4792 for branches/2014/dev_r4621_NOC4_BDY_VERT_INTERP/NEMOGCM/NEMO/OPA_SRC/SBC/fldread.F90 – NEMO

Ignore:
Timestamp:
2014-09-26T13:04:47+02:00 (10 years ago)
Author:
jamesharle
Message:

Updates to code after first successful test + merge with HEAD of trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2014/dev_r4621_NOC4_BDY_VERT_INTERP/NEMOGCM/NEMO/OPA_SRC/SBC/fldread.F90

    r4694 r4792  
    4040      LOGICAL              ::   ln_clim     ! climatology or not (T/F) 
    4141      CHARACTER(len = 8)   ::   cltype      ! type of data file 'daily', 'monthly' or yearly' 
    42       CHARACTER(len = 34) ::   wname       ! generic name of a NetCDF weights file to be used, blank if not 
     42      CHARACTER(len = 256) ::   wname       ! generic name of a NetCDF weights file to be used, blank if not 
    4343      CHARACTER(len = 34)  ::   vcomp       ! symbolic component name if a vector that needs rotation 
    4444      !                                     ! a string starting with "U" or "V" for each component    
     
    489489            !       forcing record :    1  
    490490            !                             
    491             ztmp = REAL( nday, wp ) / REAL( nyear_len(1), wp ) + 0.5 + REAL( it_offset, wp ) 
     491            ztmp = REAL( nsec_year, wp ) / ( REAL( nyear_len(1), wp ) * rday ) + 0.5 & 
     492           &       + REAL( it_offset, wp ) / ( REAL( nyear_len(1), wp ) * rday ) 
    492493            sdjf%nrec_a(1) = 1 + INT( ztmp ) - COUNT((/llbefore/)) 
    493494            ! swap at the middle of the year 
    494             IF( llbefore ) THEN   ;   sdjf%nrec_a(2) = nsec1jan000 - NINT(0.5 * rday) * nyear_len(0) 
    495             ELSE                  ;   sdjf%nrec_a(2) = nsec1jan000 + NINT(0.5 * rday) * nyear_len(1)    
     495            IF( llbefore ) THEN   ;   sdjf%nrec_a(2) = nsec1jan000 - (1 - INT(ztmp)) * NINT(0.5 * rday) * nyear_len(0) + & 
     496                                    & INT(ztmp) * NINT( 0.5 * rday) * nyear_len(1)  
     497            ELSE                  ;   sdjf%nrec_a(2) = nsec1jan000 + (1 - INT(ztmp)) * NINT(0.5 * rday) * nyear_len(1) + & 
     498                                    & INT(ztmp) * INT(rday) * nyear_len(1) + INT(ztmp) * NINT( 0.5 * rday) * nyear_len(2)  
    496499            ENDIF 
    497500         ELSE                                    ! no time interpolation 
     
    517520            !       forcing record :  nmonth  
    518521            !                             
    519             ztmp = REAL( nday, wp ) / REAL( nmonth_len(nmonth), wp ) + 0.5 + REAL( it_offset, wp ) 
     522            ztmp = REAL( nsec_month, wp ) / ( REAL( nmonth_len(nmonth), wp ) * rday ) + 0.5 & 
     523           &       + REAL( it_offset, wp ) / ( REAL( nmonth_len(nmonth), wp ) * rday ) 
    520524            imth = nmonth + INT( ztmp ) - COUNT((/llbefore/)) 
    521525            IF( sdjf%cltype == 'monthly' ) THEN   ;   sdjf%nrec_a(1) = 1 + INT( ztmp ) - COUNT((/llbefore/)) 
     
    689693      !!---------------------------------------------------------------------- 
    690694#if defined key_bdy 
    691       USE bdy_oce, ONLY:  dta_global, dta_global2         ! workspace to read in global data arrays 
     695      USE bdy_oce, ONLY:  dta_global, dta_global_z, dta_global2, dta_global2_z         ! workspace to read in global data arrays 
    692696#endif  
    693697      INTEGER                   , INTENT(in ) ::   num     ! stream number 
     
    706710      INTEGER                                 ::   ib, ik, ji, jj   ! loop counters 
    707711      INTEGER                                 ::   ierr 
     712      REAL(wp)                                ::   fv ! fillvalue and alternative -ABS(fv) 
    708713      REAL(wp), POINTER, DIMENSION(:,:,:)     ::   dta_read    ! work space for global data 
    709714      REAL(wp), POINTER, DIMENSION(:,:,:)     ::   dta_read_z  ! work space for global data 
     
    753758         END SELECT 
    754759         CALL iom_getatt(num, '_FillValue', fv, cdvar=clvar ) 
     760#if defined key_bdy 
    755761         CALL fld_bdy_interp(dta_read, dta_read_z, map, jpk_bdy, igrd, ibdy, fv, dta) 
     762#endif 
    756763      ELSE ! boundary data assumed to be on model grid 
    757764         CALL iom_get ( num, jpdom_unknown, clvar, dta_read(1:ilendta,1:ipj,1:ipk), nrec )                     
     
    776783   END SUBROUTINE fld_map 
    777784    
     785#if defined key_bdy 
    778786   SUBROUTINE fld_bdy_interp(dta_read, dta_read_z, map, jpk_bdy, igrd, ibdy, fv, dta) 
    779787 
     
    784792      !!                boundary data from non-native vertical grid 
    785793      !!---------------------------------------------------------------------- 
    786 #if defined key_bdy 
    787794      USE bdy_oce, ONLY:  idx_bdy         ! indexing for map <-> ij transformation 
    788 #endif  
    789795 
    790796      REAL(wp), POINTER, DIMENSION(:,:,:), INTENT(in )     ::   dta_read    ! work space for global data 
     
    792798      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   dta        ! output field on model grid (2 dimensional) 
    793799      INTEGER,  DIMENSION(:)    , INTENT(in ) ::   map        ! global-to-local mapping indices 
    794       INTEGER  , INTENT(in)                   ::   igrd, ib_bdy, jpk_bdy      ! number of levels in bdy data 
     800      INTEGER  , INTENT(in)                   ::   igrd, ibdy, jpk_bdy      ! number of levels in bdy data 
    795801      INTEGER                                 ::   jpkm1_bdy    ! number of levels in bdy data minus 1 
     802      REAL(wp) , INTENT(in)                                ::   fv ! fillvalue and alternative -ABS(fv) 
    796803      !! 
    797804      INTEGER                                 ::   ipi        ! length of boundary data on local process 
     
    800807      INTEGER                                 ::   ilendta    ! length of data in file 
    801808      INTEGER                                 ::   ib, ik, ikk! loop counters 
     809      INTEGER                                 ::   ji, jj ! loop counters 
    802810      REAL(wp)                                ::   zl, zi     ! tmp variable for current depth and interpolation factor 
    803       REAL(wp)                                ::   fv, fv_alt ! fillvalue and alternative -ABS(fv) 
     811      REAL(wp)                                ::   fv_alt ! fillvalue and alternative -ABS(fv) 
    804812      !!--------------------------------------------------------------------- 
    805813 
     
    824832         DO ib = 1, ipi 
    825833            DO ik = 1, ipk                       
    826                zl =  gdept_1(idx_bdy(ib_bdy)%nbi(ib,igrd),idx_bdy(ib_bdy)%nbj(ib,igrd),ik)   ! if using in step could use fsdept instead of gdept_1? 
     834               zl =  gdept_0(idx_bdy(ibdy)%nbi(ib,igrd),idx_bdy(ibdy)%nbj(ib,igrd),ik)   ! if using in step could use fsdept instead of gdept_0? 
    827835               IF( zl < dta_read_z(map(ib),1,1) ) THEN                                         ! above the first level of external data 
    828836                  dta(ib,1,ik) =  dta_read(map(ib),1,1) 
     
    830838                  dta(ib,1,ik) =  dta_read(map(ib),1,MAXLOC(dta_read_z(map(ib),1,:),1)) 
    831839               ELSE                                                                          ! inbetween : vertical interpolation between ikk & ikk+1 
    832                   DO ikk = 1, jpkm1_bdy                                                          ! when  gdept_1(ikk) < zl < gdept_1(ikk+1) 
     840                  DO ikk = 1, jpkm1_bdy                                                          ! when  gdept_0(ikk) < zl < gdept_0(ikk+1) 
    833841                     IF( ( (zl-dta_read_z(map(ib),1,ikk)) * (zl-dta_read_z(map(ib),1,ikk+1)) <= 0._wp)   & 
    834842                    &    .AND. (dta_read_z(map(ib),1,ikk+1) /= fv_alt)) THEN 
     
    857865            ji=map(ib)-(jj-1)*ilendta 
    858866            DO ik = 1, ipk                       
    859                zl =  gdept_1(idx_bdy(ib_bdy)%nbi(ib,igrd),idx_bdy(ib_bdy)%nbj(ib,igrd),ik)   ! if using in step could use fsdept instead of gdept_1? 
     867               zl =  gdept_0(idx_bdy(ibdy)%nbi(ib,igrd),idx_bdy(ibdy)%nbj(ib,igrd),ik)   ! if using in step could use fsdept instead of gdept_0? 
    860868               IF( zl < dta_read_z(ji,jj,1) ) THEN                                         ! above the first level of external data 
    861                   dta(ib,1,ik) =  dta_read(ji,jj,1,1) 
     869                  dta(ib,1,ik) =  dta_read(ji,jj,1) 
    862870               ELSEIF( zl > MAXVAL(dta_read_z(ji,ji,:),1) ) THEN                           ! below the last level of external data  
    863871                  dta(ib,1,ik) =  dta_read(ji,jj,MAXLOC(dta_read_z(ji,jj,:),1)) 
    864872               ELSE                                                                          ! inbetween : vertical interpolation between ikk & ikk+1 
    865                   DO ikk = 1, jpkm1_bdy                                                          ! when  gdept_1(ikk) < zl < gdept_1(ikk+1) 
     873                  DO ikk = 1, jpkm1_bdy                                                          ! when  gdept_0(ikk) < zl < gdept_0(ikk+1) 
    866874                     IF( ( (zl-dta_read_z(ji,jj,ikk)) * (zl-dta_read_z(ji,jj,ikk+1)) <= 0._wp)   & 
    867875                    &    .AND. (dta_read_z(ji,jj,ikk+1) /= fv_alt)) THEN 
    868876                        zi = ( zl - dta_read_z(ji,jj,ikk) ) / (dta_read_z(ji,jj,ikk+1)-dta_read_z(ji,jj,ikk)) 
    869877                        dta(ib,1,ik) = dta_read(ji,jj,ikk) + & 
    870                       &                ( dta_read(ji,jj,1,ikk+1) -  dta_read(ji,jj,ikk) ) * zi 
     878                      &                ( dta_read(ji,jj,ikk+1) -  dta_read(ji,jj,ikk) ) * zi 
    871879                     ENDIF 
    872880                  END DO 
     
    877885 
    878886   END SUBROUTINE fld_bdy_interp 
     887#endif 
    879888 
    880889   SUBROUTINE fld_rot( kt, sd ) 
Note: See TracChangeset for help on using the changeset viewer.