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 6606 – NEMO

Changeset 6606


Ignore:
Timestamp:
2016-05-23T17:06:46+02:00 (8 years ago)
Author:
cetlod
Message:

Bugfix on passive tracers restoring ; the previous one was not properly done, see ticket 16677

Location:
branches/2015/nemo_v3_6_STABLE/NEMOGCM/NEMO/TOP_SRC
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/2015/nemo_v3_6_STABLE/NEMOGCM/NEMO/TOP_SRC/TRP/trcdmp.F90

    r6308 r6606  
    3535   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   restotr   ! restoring coeff. on tracers (s-1) 
    3636 
    37    INTEGER, PARAMETER           ::   npncts   = 5        ! number of closed sea 
     37   INTEGER, PARAMETER           ::   npncts   = 8        ! number of closed sea 
    3838   INTEGER, DIMENSION(npncts)   ::   nctsi1, nctsj1      ! south-west closed sea limits (i,j) 
    3939   INTEGER, DIMENSION(npncts)   ::   nctsi2, nctsj2      ! north-east closed sea limits (i,j) 
     
    8585      CHARACTER (len=22) :: charout 
    8686      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztrtrd 
    87       REAL(wp), POINTER, DIMENSION(:,:,:) ::  ztrcdta   ! 3D  workspace 
     87      REAL(wp), POINTER, DIMENSION(:,:,:,:) ::  ztrcdta   ! 3D  workspace 
    8888      !!---------------------------------------------------------------------- 
    8989      ! 
     
    9898      IF( nb_trcdta > 0 ) THEN  ! Initialisation of tracer from a file that may also be used for damping 
    9999         ! 
    100          CALL wrk_alloc( jpi, jpj, jpk, ztrcdta )    ! Memory allocation 
     100         CALL wrk_alloc( jpi, jpj, jpk, nb_trcdta, ztrcdta )    ! Memory allocation 
     101         CALL trc_dta( kt, ztrcdta )   ! read tracer data at nit000 
    101102         !                                                          ! =========== 
    102103         DO jn = 1, jptra                                           ! tracer loop 
     
    105106            ! 
    106107            IF( ln_trc_ini(jn) ) THEN      ! update passive tracers arrays with input data read from file 
    107                 
    108108               jl = n_trc_index(jn)  
    109                CALL trc_dta( kt, sf_trcdta(jl) )   ! read tracer data at nit000 
    110                ztrcdta(:,:,:) = sf_trcdta(jl)%fnow(:,:,:) * tmask(:,:,:) * rf_trfac(jl) 
    111  
    112109               SELECT CASE ( nn_zdmp_tr ) 
    113110               ! 
     
    116113                     DO jj = 2, jpjm1 
    117114                        DO ji = fs_2, fs_jpim1   ! vector opt. 
    118                            ztra = restotr(ji,jj,jk) * ( ztrcdta(ji,jj,jk) - trb(ji,jj,jk,jn) ) 
     115                           ztra = restotr(ji,jj,jk) * ( ztrcdta(ji,jj,jk,jl) * rf_trfac(jl) - trb(ji,jj,jk,jn) ) 
    119116                           tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) + ztra 
    120117                        END DO 
     
    127124                        DO ji = fs_2, fs_jpim1   ! vector opt. 
    128125                           IF( avt(ji,jj,jk) <= 5.e-4_wp )  THEN  
    129                               ztra = restotr(ji,jj,jk) * ( ztrcdta(ji,jj,jk) - trb(ji,jj,jk,jn) ) 
     126                              ztra = restotr(ji,jj,jk) * ( ztrcdta(ji,jj,jk,jl) * rf_trfac(jl) - trb(ji,jj,jk,jn) ) 
    130127                              tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) + ztra 
    131128                           ENDIF 
     
    139136                        DO ji = fs_2, fs_jpim1   ! vector opt. 
    140137                           IF( fsdept(ji,jj,jk) >= hmlp (ji,jj) ) THEN 
    141                               ztra = restotr(ji,jj,jk) * ( ztrcdta(ji,jj,jk) - trb(ji,jj,jk,jn) ) 
     138                              ztra = restotr(ji,jj,jk) * ( ztrcdta(ji,jj,jk,jl) * rf_trfac(jl) - trb(ji,jj,jk,jn) ) 
    142139                              tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) + ztra 
    143140                           END IF 
     
    157154         END DO                                                     ! tracer loop 
    158155         !                                                          ! =========== 
    159          CALL wrk_dealloc( jpi, jpj, jpk, ztrcdta ) 
     156         CALL wrk_dealloc( jpi, jpj, jpk, nb_trcdta, ztrcdta ) 
    160157      ENDIF 
    161158      ! 
     
    187184      INTEGER :: ji , jj, jk, jn, jl, jc                     ! dummy loop indicesa 
    188185      INTEGER :: isrow                                      ! local index 
     186      REAL(wp), POINTER, DIMENSION(:,:,:,:) ::  ztrcdta   ! 3D  workspace 
    189187 
    190188      !!---------------------------------------------------------------------- 
     
    207205            ! 
    208206                                                        ! Caspian Sea 
    209             nctsi1(1)   = 332  ; nctsj1(1)   = 243 - isrow 
    210             nctsi2(1)   = 344  ; nctsj2(1)   = 275 - isrow 
    211             !                                         
     207            nctsi1(1)   = 333  ; nctsj1(1)   = 243 - isrow 
     208            nctsi2(1)   = 342  ; nctsj2(1)   = 274 - isrow 
     209            !                                           ! Lake Superior 
     210            nctsi1(2)   = 198  ; nctsj1(2)   = 258 - isrow 
     211            nctsi2(2)   = 204  ; nctsj2(2)   = 262 - isrow 
     212            !                                           ! Lake Michigan 
     213            nctsi1(3)   = 201  ; nctsj1(3)   = 250 - isrow 
     214            nctsi2(3)   = 203  ; nctsj2(3)   = 256 - isrow 
     215            !                                           ! Lake Huron 
     216            nctsi1(4)   = 204  ; nctsj1(4)   = 252 - isrow 
     217            nctsi2(4)   = 209  ; nctsj2(4)   = 256 - isrow 
     218            !                                           ! Lake Erie 
     219            nctsi1(5)   = 206  ; nctsj1(5)   = 249 - isrow 
     220            nctsi2(5)   = 209  ; nctsj2(5)   = 251 - isrow 
     221            !                                           ! Lake Ontario 
     222            nctsi1(6)   = 210  ; nctsj1(6)   = 252 - isrow 
     223            nctsi2(6)   = 212  ; nctsj2(6)   = 252 - isrow 
     224            !                                           ! Victoria Lake 
     225            nctsi1(7)   = 321  ; nctsj1(7)   = 180 - isrow 
     226            nctsi2(7)   = 322  ; nctsj2(7)   = 189 - isrow 
     227            !                                           ! Baltic Sea 
     228            nctsi1(8)   = 297  ; nctsj1(8)   = 270 - isrow 
     229            nctsi2(8)   = 308  ; nctsj2(8)   = 293 - isrow 
     230                                 
    212231            !                                           ! ======================= 
    213232            CASE ( 2 )                                  !  ORCA_R2 configuration 
     
    277296         IF(lwp)  WRITE(numout,*) 
    278297         ! 
     298         CALL wrk_alloc( jpi, jpj, jpk, nb_trcdta, ztrcdta )    ! Memory allocation 
     299         CALL trc_dta( kt, ztrcdta )   ! read tracer data at nit000 
     300         ! 
    279301         DO jn = 1, jptra 
    280302            IF( ln_trc_ini(jn) ) THEN      ! update passive tracers arrays with input data read from file 
    281303                jl = n_trc_index(jn) 
    282                 CALL trc_dta( kt, sf_trcdta(jl) )   ! read tracer data at nit000 
     304                IF(lwp)  WRITE(numout,*) 
    283305                DO jc = 1, npncts 
    284306                   DO jk = 1, jpkm1 
    285307                      DO jj = nctsj1(jc), nctsj2(jc) 
    286308                         DO ji = nctsi1(jc), nctsi2(jc) 
    287                             trn(ji,jj,jk,jn) = sf_trcdta(jl)%fnow(ji,jj,jk) * tmask(ji,jj,jk) * rf_trfac(jl) 
     309                            trn(ji,jj,jk,jn) = ztrcdta(ji,jj,jk,jl) * rf_trfac(jl) 
    288310                            trb(ji,jj,jk,jn) = trn(ji,jj,jk,jn) 
    289311                         ENDDO 
     
    293315             ENDIF 
    294316          ENDDO 
     317          CALL wrk_dealloc( jpi, jpj, jpk, nb_trcdta, ztrcdta )    ! Memory allocation 
    295318          ! 
    296319      ENDIF 
  • branches/2015/nemo_v3_6_STABLE/NEMOGCM/NEMO/TOP_SRC/trcdta.F90

    r6308 r6606  
    151151 
    152152 
    153    SUBROUTINE trc_dta( kt, sf_dta ) 
     153   SUBROUTINE trc_dta( kt, ptrc ) 
    154154      !!---------------------------------------------------------------------- 
    155155      !!                   ***  ROUTINE trc_dta  *** 
     
    161161      !!              - ln_trcdmp=F: deallocates the data structure as they are not used 
    162162      !! 
    163       !! ** Action  :   sf_dta   passive tracer data on medl mesh and interpolated at time-step kt 
    164       !!---------------------------------------------------------------------- 
    165       INTEGER                     , INTENT(in   ) ::   kt     ! ocean time-step 
    166       TYPE(FLD), DIMENSION(1)   , INTENT(inout) ::   sf_dta     ! array of information on the field to read 
     163      !! ** Action  :   sf_trcdta   passive tracer data on medl mesh and interpolated at time-step kt 
     164      !!---------------------------------------------------------------------- 
     165      INTEGER                       , INTENT(in   ) ::   kt     ! ocean time-step 
     166      REAL(wp), DIMENSION(jpi,jpj,jpk,nb_trcdta), INTENT(inout) ::   ptrc     ! array of information on the field to read 
    167167      ! 
    168168      INTEGER ::   ji, jj, jk, jl, jkk, ik    ! dummy loop indices 
     
    176176      IF( nb_trcdta > 0 ) THEN 
    177177         ! 
    178          CALL fld_read( kt, 1, sf_dta )      !==   read data at kt time step   ==! 
     178         CALL fld_read( kt, 1, sf_trcdta )      !==   read data at kt time step   ==! 
     179         ! 
     180         DO jl = 1, nb_trcdta 
     181            ptrc(:,:,:,jl) = sf_trcdta(jl)%fnow(:,:,:) * tmask(:,:,:)    ! Mask 
     182         ENDDO 
    179183         ! 
    180184         IF( ln_sco ) THEN                   !==   s- or mixed s-zps-coordinate   ==! 
     
    184188               WRITE(numout,*) 'trc_dta: interpolates passive tracer data onto the s- or mixed s-z-coordinate mesh' 
    185189            ENDIF 
    186             ! 
     190            DO jl = 1, nb_trcdta 
    187191               DO jj = 1, jpj                         ! vertical interpolation of T & S 
    188192                  DO ji = 1, jpi 
     
    190194                        zl = fsdept_n(ji,jj,jk) 
    191195                        IF(     zl < gdept_1d(1  ) ) THEN         ! above the first level of data 
    192                            ztp(jk) =  sf_dta(1)%fnow(ji,jj,1) 
     196                           ztp(jk) =  ptrc(ji,jj,1,jl) 
    193197                        ELSEIF( zl > gdept_1d(jpk) ) THEN         ! below the last level of data 
    194                            ztp(jk) =  sf_dta(1)%fnow(ji,jj,jpkm1) 
     198                           ztp(jk) =  ptrc(ji,jj,jpkm1,jl) 
    195199                        ELSE                                      ! inbetween : vertical interpolation between jkk & jkk+1 
    196200                           DO jkk = 1, jpkm1                                  ! when  gdept(jkk) < zl < gdept(jkk+1) 
    197201                              IF( (zl-gdept_1d(jkk)) * (zl-gdept_1d(jkk+1)) <= 0._wp ) THEN 
    198202                                 zi = ( zl - gdept_1d(jkk) ) / (gdept_1d(jkk+1)-gdept_1d(jkk)) 
    199                                  ztp(jk) = sf_dta(1)%fnow(ji,jj,jkk) + ( sf_dta(1)%fnow(ji,jj,jkk+1) - & 
    200                                            sf_dta(1)%fnow(ji,jj,jkk) ) * zi  
     203                                 ztp(jk) = ptrc(ji,jj,jkk,jl) + ( ptrc(ji,jj,jkk+1,jl) - ptrc(ji,jj,jkk,jl) ) * zi  
    201204                              ENDIF 
    202205                           END DO 
     
    204207                     END DO 
    205208                     DO jk = 1, jpkm1 
    206                         sf_dta(1)%fnow(ji,jj,jk) = ztp(jk) * tmask(ji,jj,jk)     ! mask required for mixed zps-s-coord 
     209                        ptrc(ji,jj,jk,jl) = ztp(jk) * tmask(ji,jj,jk)     ! mask required for mixed zps-s-coord 
    207210                     END DO 
    208                      sf_dta(1)%fnow(ji,jj,jpk) = 0._wp 
     211                     ptrc(ji,jj,jpk,jl) = 0._wp 
    209212                  END DO 
    210213               END DO 
     214            END DO 
    211215            !  
    212216         ELSE                                !==   z- or zps- coordinate   ==! 
    213217            !                              
    214                sf_dta(1)%fnow(:,:,:) = sf_dta(1)%fnow(:,:,:) * tmask(:,:,:)    ! Mask 
    215                ! 
    216                IF( ln_zps ) THEN                      ! zps-coordinate (partial steps) interpolation at the last ocean level 
     218            IF( ln_zps ) THEN                      ! zps-coordinate (partial steps) interpolation at the last ocean level 
     219               DO jl = 1, nb_trcdta 
     220                  ! 
    217221                  DO jj = 1, jpj 
    218222                     DO ji = 1, jpi 
     
    220224                        IF( ik > 1 ) THEN 
    221225                           zl = ( gdept_1d(ik) - fsdept_n(ji,jj,ik) ) / ( gdept_1d(ik) - gdept_1d(ik-1) ) 
    222                            sf_dta(1)%fnow(ji,jj,ik) = (1.-zl) * sf_dta(1)%fnow(ji,jj,ik) + zl * sf_dta(1)%fnow(ji,jj,ik-1) 
     226                           ptrc(ji,jj,ik,jl) = (1.-zl) * ptrc(ji,jj,ik,jl) + zl * ptrc(ji,jj,ik-1,jl) 
    223227                        ENDIF 
    224228                        ik = mikt(ji,jj) 
    225229                        IF( ik > 1 ) THEN 
    226230                           zl = ( gdept_0(ji,jj,ik) - gdept_1d(ik) ) / ( gdept_1d(ik+1) - gdept_1d(ik) ) 
    227                            sf_dta(1)%fnow(ji,jj,ik) = (1.-zl) * sf_dta(1)%fnow(ji,jj,ik) + zl * sf_dta(1)%fnow(ji,jj,ik+1) 
     231                           ptrc(ji,jj,ik,jl) = (1.-zl) * ptrc(ji,jj,ik,jl) + zl * ptrc(ji,jj,ik+1,jl) 
    228232                        ENDIF 
    229233                     END DO 
    230234                  END DO 
    231                ENDIF 
     235              END DO 
     236            ENDIF 
    232237            ! 
    233238         ENDIF 
    234239         ! 
    235          IF( lwp .AND. kt == nit000 ) THEN 
    236                clndta = TRIM( sf_dta(1)%clvar )  
    237                WRITE(numout,*) ''//clndta//' data ' 
    238                WRITE(numout,*) 
    239                WRITE(numout,*)'  level = 1' 
    240                CALL prihre( sf_dta(1)%fnow(:,:,1), jpi, jpj, 1, jpi, 20, 1, jpj, 20, 1., numout ) 
    241                WRITE(numout,*)'  level = ', jpk/2 
    242                CALL prihre( sf_dta(1)%fnow(:,:,jpk/2), jpi, jpj, 1, jpi, 20, 1, jpj, 20, 1., numout ) 
    243                WRITE(numout,*)'  level = ', jpkm1 
    244                CALL prihre( sf_dta(1)%fnow(:,:,jpkm1), jpi, jpj, 1, jpi, 20, 1, jpj, 20, 1., numout ) 
    245                WRITE(numout,*) 
    246          ENDIF 
     240      ENDIF 
     241      !  
     242      IF( .NOT.ln_trcdmp .AND. .NOT.ln_trcdmp_clo ) THEN      !== deallocate data structure   ==! 
     243        !                                                    (data used only for initialisation) 
     244        IF(lwp) WRITE(numout,*) 'trc_dta: deallocate data arrays as they are only used to initialize the run' 
     245        DO jl = 1, nb_trcdta 
     246                                        DEALLOCATE( sf_trcdta(jl)%fnow)     !  arrays in the structure 
     247           IF( sf_trcdta(jl)%ln_tint )  DEALLOCATE( sf_trcdta(jl)%fdta) 
     248        ENDDO 
    247249      ENDIF 
    248250      ! 
     
    255257   !!---------------------------------------------------------------------- 
    256258CONTAINS 
    257    SUBROUTINE trc_dta( kt, sf_dta, zrf_trfac )        ! Empty routine 
     259   SUBROUTINE trc_dta( kt, sf_trcdta, zrf_trfac )        ! Empty routine 
    258260      WRITE(*,*) 'trc_dta: You should not have seen this print! error?', kt 
    259261   END SUBROUTINE trc_dta 
  • branches/2015/nemo_v3_6_STABLE/NEMOGCM/NEMO/TOP_SRC/trcini.F90

    r6308 r6606  
    3030   USE trcsub          ! variables to substep passive tracers 
    3131   USE lib_mpp         ! distribued memory computing library 
     32   USE wrk_nemo 
    3233   USE sbc_oce 
    3334   USE trcice          ! tracers in sea ice 
     
    6162      INTEGER ::   jk, jn, jl    ! dummy loop indices 
    6263      CHARACTER (len=25) :: charout 
     64      REAL(wp), POINTER, DIMENSION(:,:,:,:) :: ztrcdta 
    6365      !!--------------------------------------------------------------------- 
    6466      ! 
     
    120122        IF( ln_trcdta .AND. nb_trcdta > 0 ) THEN  ! Initialisation of tracer from a file that may also be used for damping 
    121123            ! 
     124            CALL wrk_alloc( jpi, jpj, jpk, nb_trcdta, ztrcdta ) 
     125            ! 
     126            CALL trc_dta( nit000, ztrcdta )   ! read tracer data at nit000 
     127            ! 
    122128            DO jn = 1, jptra 
    123129               IF( ln_trc_ini(jn) ) THEN      ! update passive tracers arrays with input data read from file 
    124130                  jl = n_trc_index(jn)  
    125                   CALL trc_dta( nit000, sf_trcdta(jl) )   ! read tracer data at nit000 
    126                   trn(:,:,:,jn) = sf_trcdta(jl)%fnow(:,:,:) * tmask(:,:,:) * rf_trfac(jl) 
    127                   ! 
    128                   IF( .NOT.ln_trcdmp .AND. .NOT.ln_trcdmp_clo ) THEN      !== deallocate data structure   ==! 
    129                      !                                                    (data used only for initialisation) 
    130                      IF(lwp) WRITE(numout,*) 'trc_dta: deallocate data arrays as they are only used to initialize the run' 
    131                                                   DEALLOCATE( sf_trcdta(jl)%fnow )     !  arrays in the structure 
    132                      IF( sf_trcdta(jl)%ln_tint )  DEALLOCATE( sf_trcdta(jl)%fdta ) 
    133                      ! 
    134                   ENDIF 
     131                  trn(:,:,:,jn) = ztrcdta(:,:,:,jl) * rf_trfac(jl) 
    135132               ENDIF 
    136133            ENDDO 
    137134            ! 
     135            CALL wrk_dealloc( jpi, jpj, jpk, nb_trcdta, ztrcdta ) 
     136            !  
    138137        ENDIF 
    139138        ! 
Note: See TracChangeset for help on using the changeset viewer.