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 2125 for branches/DEV_r1784_3DF/NEMO/OPA_SRC/SBC/fldread.F90 – NEMO

Ignore:
Timestamp:
2010-09-27T12:22:04+02:00 (14 years ago)
Author:
cbricaud
Message:

modification: don't allocate fdta arrays when time-interpollation is not used

File:
1 edited

Legend:

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

    r2051 r2125  
    7878      INTEGER, DIMENSION(:,:,:), POINTER      ::   data_jpj     ! array of source integers 
    7979      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 
     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 
    8282   END TYPE WGT 
    8383 
     
    146146!CDIR COLLAPSE 
    147147               sd(jf)%fdta(:,:,:,1) = sd(jf)%fdta(:,:,:,2) 
    148                sd(jf)%rotn(1)       = sd(jf)%rotn(2) 
     148               sd(jf)%rotn(1)     = sd(jf)%rotn(2) 
    149149            ENDIF 
    150150 
     
    209209            IF( LEN(TRIM(sd(jf)%wgtname)) > 0 ) THEN 
    210210               CALL wgt_list( sd(jf), kw ) 
    211                ipk =  SIZE(sd(jf)%fdta,3) 
    212                CALL fld_interp( sd(jf)%num, sd(jf)%clvar , kw , ipk, sd(jf)%fdta(:,:,:,2) , sd(jf)%nrec_a(1) ) 
     211               ipk = SIZE(sd(jf)%fnow,3) 
     212               IF( sd(jf)%ln_tint ) THEN 
     213                  CALL fld_interp( sd(jf)%num, sd(jf)%clvar , kw , ipk, sd(jf)%fdta(:,:,:,2) , sd(jf)%nrec_a(1) ) 
     214               ELSE 
     215                  CALL fld_interp( sd(jf)%num, sd(jf)%clvar , kw , ipk, sd(jf)%fnow(:,:,:)   , sd(jf)%nrec_a(1) ) 
     216               ENDIF 
    213217            ELSE 
    214                SELECT CASE( SIZE(sd(jf)%fdta,3) ) 
    215                CASE(1) 
    216                   CALL iom_get( sd(jf)%num, jpdom_data, sd(jf)%clvar, sd(jf)%fdta(:,:,1,2), sd(jf)%nrec_a(1) ) 
     218               SELECT CASE( SIZE(sd(jf)%fnow,3) ) 
     219               CASE(1)    
     220                  IF( sd(jf)%ln_tint ) THEN 
     221                     CALL iom_get( sd(jf)%num, jpdom_data, sd(jf)%clvar, sd(jf)%fdta(:,:,1,2), sd(jf)%nrec_a(1) ) 
     222                  ELSE 
     223                     CALL iom_get( sd(jf)%num, jpdom_data, sd(jf)%clvar, sd(jf)%fnow(:,:,1)  , sd(jf)%nrec_a(1) ) 
     224                  ENDIF  
    217225               CASE(jpk) 
    218                   CALL iom_get( sd(jf)%num, jpdom_data, sd(jf)%clvar, sd(jf)%fdta(:,:,:,2), sd(jf)%nrec_a(1) ) 
     226                  IF( sd(jf)%ln_tint ) THEN 
     227                     CALL iom_get( sd(jf)%num, jpdom_data, sd(jf)%clvar, sd(jf)%fdta(:,:,:,2), sd(jf)%nrec_a(1) ) 
     228                  ELSE 
     229                     CALL iom_get( sd(jf)%num, jpdom_data, sd(jf)%clvar, sd(jf)%fnow(:,:,:)  , sd(jf)%nrec_a(1) ) 
     230                  ENDIF  
    219231               END SELECT 
    220232            ENDIF 
     
    251263                IF( kf > 0 ) THEN 
    252264                   !! fields jf,kf are two components which need to be rotated together 
    253                    DO nf = 1,2 
     265                   IF( sd(jf)%ln_tint )THEN 
     266                      DO nf = 1,2 
     267                         !! check each time level of this pair 
     268                         IF( .NOT. sd(jf)%rotn(nf) .AND. .NOT. sd(kf)%rotn(nf) ) THEN 
     269                            utmp(:,:) = 0.0 
     270                            vtmp(:,:) = 0.0 
     271                            ! 
     272                            ipk = SIZE( sd(kf)%fnow(:,:,:) ,3 ) 
     273                            DO jk = 1,ipk 
     274                               CALL rot_rep( sd(jf)%fdta(:,:,jk,nf),sd(kf)%fdta(:,:,jk,nf),'T', 'en->i', utmp(:,:) ) 
     275                               CALL rot_rep( sd(jf)%fdta(:,:,jk,nf),sd(kf)%fdta(:,:,jk,nf),'T', 'en->j', vtmp(:,:) ) 
     276                               sd(jf)%fdta(:,:,jk,nf) = utmp(:,:) 
     277                               sd(kf)%fdta(:,:,jk,nf) = vtmp(:,:) 
     278                            ENDDO 
     279                            ! 
     280                            sd(jf)%rotn(nf) = .TRUE. 
     281                            sd(kf)%rotn(nf) = .TRUE. 
     282                            IF( lwp .AND. kt == nit000 ) & 
     283                                      WRITE(numout,*) 'fld_read: vector pair (',  & 
     284                                                      TRIM(sd(jf)%clvar),',',TRIM(sd(kf)%clvar), & 
     285                                                      ') rotated on to model grid' 
     286                         ENDIF 
     287                      END DO 
     288                   ELSE  
    254289                      !! check each time level of this pair 
    255290                      IF( .NOT. sd(jf)%rotn(nf) .AND. .NOT. sd(kf)%rotn(nf) ) THEN 
     
    257292                         vtmp(:,:) = 0.0 
    258293                         ! 
    259                          ipk = SIZE( sd(kf)%fdta(:,:,:,nf) ,3 ) 
     294                         ipk = SIZE( sd(kf)%fnow(:,:,:) ,3 ) 
    260295                         DO jk = 1,ipk 
    261                             CALL rot_rep( sd(jf)%fdta(:,:,jk,nf),sd(kf)%fdta(:,:,jk,nf),'T', 'en->i', utmp(:,:) ) 
    262                             CALL rot_rep( sd(jf)%fdta(:,:,jk,nf),sd(kf)%fdta(:,:,jk,nf),'T', 'en->j', vtmp(:,:) ) 
    263                             sd(jf)%fdta(:,:,jk,nf) = utmp(:,:) 
    264                             sd(kf)%fdta(:,:,jk,nf) = vtmp(:,:) 
    265                          END DO 
     296                            CALL rot_rep( sd(jf)%fnow(:,:,jk),sd(kf)%fnow(:,:,jk),'T', 'en->i', utmp(:,:) ) 
     297                            CALL rot_rep( sd(jf)%fnow(:,:,jk),sd(kf)%fnow(:,:,jk),'T', 'en->j', vtmp(:,:) ) 
     298                            sd(jf)%fnow(:,:,jk) = utmp(:,:) 
     299                            sd(kf)%fnow(:,:,jk) = vtmp(:,:) 
     300                         ENDDO 
    266301                         ! 
    267302                         sd(jf)%rotn(nf) = .TRUE. 
     
    272307                                                   ') rotated on to model grid' 
    273308                      ENDIF 
    274                    END DO 
     309                   ENDIF 
    275310                ENDIF 
    276311             ENDIF 
     
    304339               ENDIF 
    305340!CDIR COLLAPSE 
    306                sd(jf)%fnow(:,:,:) = sd(jf)%fdta(:,:,:,2)   ! piecewise constant field 
    307   
    308341            ENDIF 
    309342            ! 
     
    405438         IF( LEN(TRIM(sdjf%wgtname)) > 0 ) THEN 
    406439            CALL wgt_list( sdjf, kwgt ) 
    407             ipk = SIZE(sdjf%fdta,3) 
    408             CALL fld_interp( sdjf%num, sdjf%clvar, kwgt, ipk, sdjf%fdta(:,:,:,2), sdjf%nrec_a(1) ) 
     440            ipk = SIZE(sdjf%fnow,3) 
     441            IF( sdjf%ln_tint ) THEN 
     442               CALL fld_interp( sdjf%num, sdjf%clvar, kwgt, ipk, sdjf%fdta(:,:,:,2), sdjf%nrec_a(1) ) 
     443            ELSE 
     444               CALL fld_interp( sdjf%num, sdjf%clvar, kwgt, ipk, sdjf%fnow(:,:,:)  , sdjf%nrec_a(1) ) 
     445            ENDIF 
    409446         ELSE 
    410             SELECT CASE ( SIZE(sdjf%fdta,3) ) 
     447            write(narea+200,*)' sdjf%ln_tint SIZE(sdjf%fnow,3) ',sdjf%ln_tint,SIZE(sdjf%fnow,3) ; call flush(narea+200) 
     448            write(narea+200,*)' SIZE(sdjf%fdta,3)  SIZE(sdjf%fdta,4) ',SIZE(sdjf%fdta,3),SIZE(sdjf%fdta,4)  ; call flush(narea+200) 
     449            SELECT CASE( SIZE(sdjf%fnow,3) ) 
    411450            CASE(1) 
    412                 CALL iom_get( sdjf%num, jpdom_data, sdjf%clvar, sdjf%fdta(:,:,1,2), sdjf%nrec_b(1) ) 
     451               IF( sdjf%ln_tint ) THEN 
     452                  CALL iom_get( sdjf%num, jpdom_data, sdjf%clvar, sdjf%fdta(:,:,1,2), sdjf%nrec_b(1) ) 
     453               ELSE 
     454                  CALL iom_get( sdjf%num, jpdom_data, sdjf%clvar, sdjf%fnow(:,:,1)  , sdjf%nrec_b(1) ) 
     455               ENDIF 
    413456            CASE(jpk) 
    414                 CALL iom_get( sdjf%num, jpdom_data, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_b(1) ) 
     457               IF( sdjf%ln_tint ) THEN 
     458                  CALL iom_get( sdjf%num, jpdom_data, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_b(1) ) 
     459               ELSE 
     460                  CALL iom_get( sdjf%num, jpdom_data, sdjf%clvar, sdjf%fnow(:,:,:)  , sdjf%nrec_b(1) ) 
     461               ENDIF 
    415462            END SELECT 
     463            write(narea+200,*)' test1 ok ' ; call flush(narea+200) 
    416464         ENDIF 
    417465         sdjf%rotn(2) = .FALSE. 
     
    629677               &                          ' pairing    : '    , TRIM( sdf(jf)%vcomp      ),   & 
    630678               &                          ' data type: '      ,       sdf(jf)%cltype 
     679            call flush(numout) 
    631680         END DO 
    632681      ENDIF 
     
    891940         ! SA: +3 stencil is a patch to avoid out-of-bound computation in some configuration.  
    892941         ! a more robust solution will be given in next release 
    893          ipk =  SIZE(sd%fdta,3) 
     942         ipk =  SIZE(sd%fnow,3) 
    894943         ALLOCATE( ref_wgts(nxt_wgt)%fly_dta(ref_wgts(nxt_wgt)%jpiwgt+3, ref_wgts(nxt_wgt)%jpjwgt+3 ,ipk) ) 
    895944         IF( ref_wgts(nxt_wgt)%cyclic ) ALLOCATE( ref_wgts(nxt_wgt)%col2(2,ref_wgts(nxt_wgt)%jpjwgt+3,ipk) ) 
     
    912961      !! ** Method  :    
    913962      !!---------------------------------------------------------------------- 
    914       INTEGER,          INTENT(in)                           ::   num                 ! stream number 
    915       CHARACTER(LEN=*), INTENT(in)                           ::   clvar               ! variable name 
    916       INTEGER,          INTENT(in)                           ::   kw                  ! weights number 
    917       INTEGER,          INTENT(in)                           ::   kk                  ! vertical dimension of kk 
    918       REAL(wp),         INTENT(inout), DIMENSION(jpi,jpj,kk) ::   dta                 ! output field on model grid 
    919       INTEGER,          INTENT(in)                           ::   nrec                ! record number to read (ie time slice) 
     963      INTEGER,          INTENT(in)                        ::   num                 ! stream number 
     964      CHARACTER(LEN=*), INTENT(in)                        ::   clvar               ! variable name 
     965      INTEGER,          INTENT(in)                        ::   kw                  ! weights number 
     966      INTEGER,          INTENT(in)                        ::   kk                  ! vertical dimension of kk 
     967      REAL(wp),         INTENT(inout), DIMENSION(jpi,jpj,kk) ::   dta              ! output field on model grid 
     968      INTEGER,          INTENT(in)                        ::   nrec                ! record number to read (ie time slice) 
    920969      !!  
    921       INTEGER, DIMENSION(3)                                  ::   rec1,recn           ! temporary arrays for start and length 
    922       INTEGER                                                ::  jk, jn, jm           ! loop counters 
    923       INTEGER                                                ::  ni, nj               ! lengths 
    924       INTEGER                                                ::  jpimin,jpiwid        ! temporary indices 
    925       INTEGER                                                ::  jpjmin,jpjwid        ! temporary indices 
    926       INTEGER                                                ::  jpi1,jpi2,jpj1,jpj2  ! temporary indices 
     970      INTEGER, DIMENSION(3)                               ::   rec1,recn           ! temporary arrays for start and length 
     971      INTEGER                                             ::  jk, jn, jm           ! loop counters 
     972      INTEGER                                             ::  ni, nj               ! lengths 
     973      INTEGER                                             ::  jpimin,jpiwid        ! temporary indices 
     974      INTEGER                                             ::  jpjmin,jpjwid        ! temporary indices 
     975      INTEGER                                             ::  jpi1,jpi2,jpj1,jpj2  ! temporary indices 
    927976      !!---------------------------------------------------------------------- 
    928977      ! 
Note: See TracChangeset for help on using the changeset viewer.