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 2797 for branches/2011/UKMO_MERCATOR_obc_bdy_merge/NEMOGCM/NEMO/OPA_SRC/SBC/fldread.F90 – NEMO

Ignore:
Timestamp:
2011-07-11T12:53:56+02:00 (13 years ago)
Author:
davestorkey
Message:

Delete BDY module and first implementation of new OBC module.

  1. Initial restructuring.
  2. Use fldread to read open boundary data.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2011/UKMO_MERCATOR_obc_bdy_merge/NEMOGCM/NEMO/OPA_SRC/SBC/fldread.F90

    r2777 r2797  
    5656      LOGICAL                         ::   rotn         ! flag to indicate whether field has been rotated 
    5757   END TYPE FLD 
     58 
     59   TYPE, PUBLIC ::   MAP_POINTER      !: Array of integer pointers to 1D arrays 
     60      INTEGER, POINTER   ::  ptr(:) 
     61   END TYPE MAP_POINTER 
    5862 
    5963!$AGRIF_DO_NOT_TREAT 
     
    98102CONTAINS 
    99103 
    100    SUBROUTINE fld_read( kt, kn_fsbc, sd ) 
     104   SUBROUTINE fld_read( kt, kn_fsbc, sd, map, jit, timeshift ) 
    101105      !!--------------------------------------------------------------------- 
    102106      !!                    ***  ROUTINE fld_read  *** 
     
    113117      INTEGER  , INTENT(in   )               ::   kn_fsbc   ! sbc computation period (in time step)  
    114118      TYPE(FLD), INTENT(inout), DIMENSION(:) ::   sd        ! input field related variables 
     119      TYPE(MAP_POINTER),INTENT(in), OPTIONAL, DIMENSION(:) ::   map   ! global-to-local mapping index 
     120      INTEGER  , INTENT(in   ), OPTIONAL     ::   jit       ! subcycle timestep for timesplitting option 
     121      INTEGER  , INTENT(in   ), OPTIONAL     ::   timeshift ! provide fields at time other than "now" 
    115122      !! 
    116123      INTEGER  ::   imf        ! size of the structure sd 
     
    127134      !!--------------------------------------------------------------------- 
    128135      ! Note that shifting time to be centrered in the middle of sbc time step impacts only nsec_* variables of the calendar  
    129       isecsbc = nsec_year + nsec1jan000 + NINT(0.5 * REAL(kn_fsbc - 1,wp) * rdttra(1))   ! middle of sbc time step 
     136      IF( present(timeshift) ) THEN 
     137         isecsbc = nsec_year + nsec1jan000 + NINT(0.5 * REAL(kn_fsbc - 1,wp) * rdttra(1)) + timeshift * rdttra(1)  ! middle of sbc time step 
     138      ELSE 
     139         isecsbc = nsec_year + nsec1jan000 + NINT(0.5 * REAL(kn_fsbc - 1,wp) * rdttra(1))  ! middle of sbc time step 
     140      ENDIF 
    130141      imf = SIZE( sd ) 
    131142      ! 
    132143      IF( kt == nit000 ) THEN                      ! initialization 
    133          DO jf = 1, imf  
    134             CALL fld_init( kn_fsbc, sd(jf) )       ! read each before field (put them in after as they will be swapped) 
    135          END DO 
     144         IF( PRESENT(map) ) THEN 
     145            DO jf = 1, imf  
     146               CALL fld_init( kn_fsbc, sd(jf), map(jf)%ptr )  ! read each before field (put them in after as they will be swapped) 
     147            END DO 
     148         ELSE 
     149            DO jf = 1, imf  
     150               CALL fld_init( kn_fsbc, sd(jf) )       ! read each before field (put them in after as they will be swapped) 
     151            END DO 
     152         ENDIF 
    136153         IF( lwp ) CALL wgt_print()                ! control print 
    137154         CALL fld_rot( kt, sd )                    ! rotate vector fiels if needed 
     
    212229 
    213230               ! read after data 
    214                CALL fld_get( sd(jf) ) 
     231               IF( PRESENT(map) ) THEN 
     232                  CALL fld_get( sd(jf), map(jf)%ptr ) 
     233               ELSE 
     234                  CALL fld_get( sd(jf) ) 
     235               ENDIF 
    215236 
    216237            ENDIF 
     
    230251               ! temporal interpolation weights 
    231252               ztinta =  REAL( isecsbc - sd(jf)%nrec_b(2), wp ) / REAL( sd(jf)%nrec_a(2) - sd(jf)%nrec_b(2), wp ) 
     253               IF( PRESENT(map) ) THEN  
     254                  IF(lwp) WRITE(numout,*) '============================================' 
     255                  IF(lwp) WRITE(numout,*) 'Output from fld_read(map) on timestep ',kt 
     256                  IF(lwp) WRITE(numout,*) '============================================' 
     257                  IF(lwp) WRITE(numout,*) 'sd(jf)%nrec_b(2), sd(jf)%nrec_a(2), isecsbc, ztinta, ztintb : ',sd(jf)%nrec_b(2),sd(jf)%nrec_a(2),isecsbc,ztinta,ztintb 
     258               ENDIF 
    232259               ztintb =  1. - ztinta 
    233260!CDIR COLLAPSE 
     
    253280 
    254281 
    255    SUBROUTINE fld_init( kn_fsbc, sdjf ) 
     282   SUBROUTINE fld_init( kn_fsbc, sdjf, map ) 
    256283      !!--------------------------------------------------------------------- 
    257284      !!                    ***  ROUTINE fld_init  *** 
     
    262289      INTEGER  , INTENT(in   ) ::   kn_fsbc   ! sbc computation period (in time step)  
    263290      TYPE(FLD), INTENT(inout) ::   sdjf      ! input field related variables 
     291      INTEGER  , INTENT(in), OPTIONAL, DIMENSION(:) :: map ! global-to-local mapping indices 
    264292      !! 
    265293      LOGICAL :: llprevyr              ! are we reading previous year  file? 
     
    364392 
    365393         ! read before data  
    366          CALL fld_get( sdjf )  ! read before values in after arrays(as we will swap it later) 
     394         IF( PRESENT(map) ) THEN 
     395            CALL fld_get( sdjf, map )  ! read before values in after arrays(as we will swap it later) 
     396         ELSE 
     397            CALL fld_get( sdjf )  ! read before values in after arrays(as we will swap it later) 
     398         ENDIF 
    367399 
    368400         clfmt = "('fld_init : time-interpolation for ', a, ' read previous record = ', i4, ' at time = ', f7.2, ' days')" 
     
    546578 
    547579 
    548    SUBROUTINE fld_get( sdjf ) 
    549       !!--------------------------------------------------------------------- 
    550       !!                    ***  ROUTINE fld_clopn  *** 
     580   SUBROUTINE fld_get( sdjf, map ) 
     581      !!--------------------------------------------------------------------- 
     582      !!                    ***  ROUTINE fld_get  *** 
    551583      !! 
    552584      !! ** Purpose :   read the data 
    553585      !!---------------------------------------------------------------------- 
    554586      TYPE(FLD), INTENT(inout) ::   sdjf   ! input field related variables 
     587      INTEGER  , INTENT(in), OPTIONAL, DIMENSION(:) :: map ! global-to-local mapping indices 
    555588      !! 
    556589      INTEGER                  ::   ipk    ! number of vertical levels of sdjf%fdta ( 2D: ipk=1 ; 3D: ipk=jpk ) 
     
    559592             
    560593      ipk = SIZE( sdjf%fnow, 3 ) 
    561       IF( LEN(TRIM(sdjf%wgtname)) > 0 ) THEN 
     594 
     595      IF( PRESENT(map) ) THEN 
     596         IF( sdjf%ln_tint ) THEN   ;   CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_a(1), map ) 
     597         ELSE                      ;   CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fnow(:,:,:  ), sdjf%nrec_a(1), map ) 
     598         ENDIF 
     599      ELSE IF( LEN(TRIM(sdjf%wgtname)) > 0 ) THEN 
    562600         CALL wgt_list( sdjf, iw ) 
    563601         IF( sdjf%ln_tint ) THEN   ;   CALL fld_interp( sdjf%num, sdjf%clvar, iw , ipk  , sdjf%fdta(:,:,:,2), sdjf%nrec_a(1) ) 
     
    581619   END SUBROUTINE fld_get 
    582620 
     621   SUBROUTINE fld_map( num, clvar, dta, nrec, map ) 
     622      !!--------------------------------------------------------------------- 
     623      !!                    ***  ROUTINE fld_get  *** 
     624      !! 
     625      !! ** Purpose :   read global data from file and map onto local data 
     626      !!                using a general mapping (for open boundaries) 
     627      !!---------------------------------------------------------------------- 
     628      USE obc_oce, ONLY:  dta_global         ! workspace to read in global data arrays 
     629 
     630      INTEGER                   , INTENT(in ) ::   num     ! stream number 
     631      CHARACTER(LEN=*)          , INTENT(in ) ::   clvar   ! variable name 
     632      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   dta     ! output field on model grid 
     633      INTEGER                   , INTENT(in ) ::   nrec    ! record number to read (ie time slice) 
     634      INTEGER,  DIMENSION(:)    , INTENT(in ) ::   map     ! global-to-local mapping indices 
     635      !! 
     636      INTEGER                  ::   ipi      ! length of boundary data on local process 
     637      INTEGER                  ::   ipj      ! length of dummy dimension ( = 1 ) 
     638      INTEGER                  ::   ipk      ! number of vertical levels of dta ( 2D: ipk=1 ; 3D: ipk=jpk ) 
     639      INTEGER                  ::   ilendta  ! length of data in file 
     640      INTEGER                  ::   idvar    ! variable ID 
     641      INTEGER                  ::   ib, ik   ! loop counters 
     642      INTEGER                  ::   ierr 
     643      !! 
     644      CHARACTER(len=80)                   :: zfile 
     645      !!--------------------------------------------------------------------- 
     646             
     647      ipi = SIZE( dta, 1 ) 
     648      ipj = 1 
     649      ipk = SIZE( dta, 3 ) 
     650 
     651      idvar   = iom_varid( num, clvar ) 
     652      ilendta = iom_file(num)%dimsz(1,idvar) 
     653      IF(lwp) WRITE(numout,*) 'Dim size for ',TRIM(clvar),' is ', ilendta 
     654 
     655      CALL iom_get ( num, jpdom_unknown, clvar, dta_global(1:ilendta,1:ipj,1:ipk), nrec ) 
     656      ! 
     657      DO ib = 1, ipi 
     658         DO ik = 1, ipk 
     659            dta(ib,1,ik) =  dta_global(map(ib),1,ik) 
     660         END DO 
     661      END DO 
     662 
     663   END SUBROUTINE fld_map 
    583664 
    584665   SUBROUTINE fld_rot( kt, sd ) 
    585666      !!--------------------------------------------------------------------- 
    586       !!                    ***  ROUTINE fld_clopn  *** 
     667      !!                    ***  ROUTINE fld_rot  *** 
    587668      !! 
    588669      !! ** Purpose :   Vector fields may need to be rotated onto the local grid direction 
     
    672753      ! 
    673754      CALL iom_open( sdjf%clname, sdjf%num, ldstop = ldstop, ldiof =  LEN(TRIM(sdjf%wgtname)) > 0 ) 
    674       ! 
     755     ! 
    675756   END SUBROUTINE fld_clopn 
    676757 
Note: See TracChangeset for help on using the changeset viewer.