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 9987 for branches/UKMO/dev_r5518_obs_oper_update_icethick/NEMOGCM/NEMO/TOP_SRC/trcstp.F90 – NEMO

Ignore:
Timestamp:
2018-07-23T11:33:03+02:00 (6 years ago)
Author:
emmafiedler
Message:

Merge with GO6 FOAMv14 package branch r9288

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/dev_r5518_obs_oper_update_icethick/NEMOGCM/NEMO/TOP_SRC/trcstp.F90

    r7960 r9987  
    3232   REAL(wp), DIMENSION(:,:,:), SAVE, ALLOCATABLE ::   qsr_arr ! save qsr during TOP time-step 
    3333   REAL(wp) :: rdt_sampl 
    34    INTEGER  :: nb_rec_per_days 
     34   INTEGER  :: nb_rec_per_day 
    3535   INTEGER  :: isecfst, iseclast 
    3636   LOGICAL  :: llnew 
     
    5555      !!              Update the passive tracers 
    5656      !!------------------------------------------------------------------- 
     57 
     58      USE dom_oce, ONLY: narea 
     59 
    5760      INTEGER, INTENT( in ) ::  kt      ! ocean time-step index 
    5861      INTEGER               ::  jk, jn  ! dummy loop indices 
    5962      REAL(wp)              ::  ztrai 
    6063      CHARACTER (len=25)    ::  charout  
    61  
    6264      !!------------------------------------------------------------------- 
    6365      ! 
     
    9395         ENDIF 
    9496                                   CALL trc_sms      ( kt )       ! tracers: sinks and sources 
     97# if defined key_debug_medusa 
     98         IF(lwp) WRITE(numout,*) ' MEDUSA trc_stp SMS complete at kt =', kt 
     99         CALL trc_rst_stat 
     100         CALL trc_rst_tra_stat 
     101         CALL flush(numout) 
     102# endif 
    95103                                   CALL trc_trp      ( kt )       ! transport of passive tracers 
     104# if defined key_debug_medusa 
     105         IF(lwp) WRITE(numout,*) ' MEDUSA trc_stp transport complete at kt =', kt 
     106         CALL trc_rst_stat 
     107         CALL trc_rst_tra_stat 
     108         CALL flush(numout) 
     109# endif 
    96110         IF( kt == nittrc000 ) THEN 
    97111            CALL iom_close( numrtr )       ! close input tracer restart file 
     
    105119      ENDIF 
    106120      ! 
    107       ztrai = 0._wp                                                   !  content of all tracers 
    108       DO jn = 1, jptra 
    109          ztrai = ztrai + glob_sum( trn(:,:,:,jn) * cvol(:,:,:)   ) 
    110       END DO 
    111       IF( lwp ) WRITE(numstr,9300) kt,  ztrai / areatot 
    112 9300  FORMAT(i10,e18.10) 
     121      IF (ln_ctl) THEN  
     122         ! The following code is very expensive since it involves multiple  
     123         ! reproducible global sums over all tracer fields and is potentially   
     124         ! called on every timestep. The results it produces are purely for  
     125         ! informational purposes and do not affect model evolution.  
     126         ! Hence we restrict its use by protecting it with the ln_ctl RTL  
     127         ! which should normally only be used under debugging conditions  
     128         ! and not in operational runs. We also need to restrict output   
     129         ! to the master PE since there's no point duplicating the same results  
     130         ! on all processors.     
     131         ztrai = 0._wp                                                   !  content of all tracers 
     132         DO jn = 1, jptra 
     133            ztrai = ztrai + glob_sum( trn(:,:,:,jn) * cvol(:,:,:)   ) 
     134         END DO 
     135         IF( numstr /= -1 ) WRITE(numstr,9300) kt,  ztrai / areatot 
     1369300     FORMAT(i10,D23.16) 
     137      ENDIF 
    113138      ! 
    114139      IF( nn_timing == 1 )   CALL timing_stop('trc_stp') 
     
    123148      !!               of diurnal cycle 
    124149      !! 
    125       !! ** Method  : store in TOP the qsr every hour ( or every time-step the latter  
     150      !! ** Method  : store in TOP the qsr every hour ( or every time-step if the latter  
    126151      !!              is greater than 1 hour ) and then, compute the  mean with  
    127152      !!              a moving average over 24 hours.  
     
    130155      INTEGER, INTENT(in) ::   kt 
    131156      INTEGER  :: jn 
     157      REAL(wp) :: zsecfst 
     158      CHARACTER(len=1)               ::   cl1                      ! 1 character 
     159      CHARACTER(len=2)               ::   cl2                      ! 2 characters 
    132160 
    133161      IF( kt == nittrc000 ) THEN 
    134162         IF( ln_cpl )  THEN   
    135163            rdt_sampl = 86400. / ncpl_qsr_freq 
    136             nb_rec_per_days = ncpl_qsr_freq 
     164            nb_rec_per_day = ncpl_qsr_freq 
    137165         ELSE   
    138166            rdt_sampl = MAX( 3600., rdt * nn_dttrc ) 
    139             nb_rec_per_days = INT( 86400 / rdt_sampl ) 
     167            nb_rec_per_day = INT( 86400 / rdt_sampl ) 
    140168         ENDIF 
    141169         ! 
    142170         IF( lwp ) THEN 
    143171            WRITE(numout,*)  
    144             WRITE(numout,*) ' Sampling frequency dt = ', rdt_sampl, 's','   Number of sampling per day  nrec = ', nb_rec_per_days 
     172            WRITE(numout,*) ' Sampling frequency dt = ', rdt_sampl, 's','   Number of sampling per day  nrec = ', nb_rec_per_day 
    145173            WRITE(numout,*)  
    146174         ENDIF 
    147175         ! 
    148          ALLOCATE( qsr_arr(jpi,jpj,nb_rec_per_days ) ) 
    149          DO jn = 1, nb_rec_per_days 
    150             qsr_arr(:,:,jn) = qsr(:,:) 
    151          ENDDO 
    152          qsr_mean(:,:) = qsr(:,:) 
    153          ! 
    154          isecfst  = nsec_year + nsec1jan000   !   number of seconds between Jan. 1st 00h of nit000 year and the middle of time step 
    155          iseclast = isecfst 
     176         ALLOCATE( qsr_arr(jpi,jpj,nb_rec_per_day ) ) 
     177         ! 
     178         !                                            !* Restart: read in restart file 
     179         IF( ln_rsttr .AND. iom_varid( numrtr, 'qsr_mean' , ldstop = .FALSE. ) > 0 .AND. & 
     180                            iom_varid( numrtr, 'qsr_arr_1', ldstop = .FALSE. ) > 0 .AND. & 
     181                            iom_varid( numrtr, 'zsecfst'  , ldstop = .FALSE. ) > 0 ) THEN  
     182            IF(lwp) WRITE(numout,*) 'trc_qsr_mean:   qsr_mean read in the restart file' 
     183            CALL iom_get( numrtr, jpdom_autoglo, 'qsr_mean', qsr_mean )   !  A mean of qsr 
     184            CALL iom_get( numrtr, 'zsecfst', zsecfst )   !  A mean of qsr 
     185            isecfst = INT( zsecfst ) 
     186            DO jn = 1, nb_rec_per_day  
     187             IF( jn <= 9 )  THEN 
     188               WRITE(cl1,'(i1)') jn 
     189               CALL iom_get( numrtr, jpdom_autoglo, 'qsr_arr_'//cl1, qsr_arr(:,:,jn) )   !  A mean of qsr 
     190             ELSE 
     191               WRITE(cl2,'(i2.2)') jn 
     192               CALL iom_get( numrtr, jpdom_autoglo, 'qsr_arr_'//cl2, qsr_arr(:,:,jn) )   !  A mean of qsr 
     193             ENDIF 
     194           ENDDO 
     195         ELSE                                         !* no restart: set from nit000 values 
     196            IF(lwp) WRITE(numout,*) 'trc_qsr_mean:   qsr_mean set to nit000 values' 
     197            isecfst  = nsec_year + nsec1jan000   !   number of seconds between Jan. 1st 00h of nit000 year and the middle of time step 
     198            ! 
     199            qsr_mean(:,:) = qsr(:,:) 
     200            DO jn = 1, nb_rec_per_day 
     201               qsr_arr(:,:,jn) = qsr_mean(:,:) 
     202            ENDDO 
     203         ENDIF 
    156204         ! 
    157205      ENDIF 
    158206      ! 
    159207      iseclast = nsec_year + nsec1jan000 
     208      ! 
    160209      llnew   = ( iseclast - isecfst )  > INT( rdt_sampl )   !   new shortwave to store 
    161       IF( kt /= nittrc000 .AND. llnew ) THEN 
     210      IF( llnew ) THEN 
    162211          IF( lwp ) WRITE(numout,*) ' New shortwave to sample for TOP at time kt = ', kt, & 
    163212             &                      ' time = ', (iseclast+rdt*nn_dttrc/2.)/3600.,'hours ' 
    164213          isecfst = iseclast 
    165           DO jn = 1, nb_rec_per_days - 1 
     214          DO jn = 1, nb_rec_per_day - 1 
    166215             qsr_arr(:,:,jn) = qsr_arr(:,:,jn+1) 
    167216          ENDDO 
    168           qsr_arr (:,:,nb_rec_per_days) = qsr(:,:) 
    169           qsr_mean(:,:                ) = SUM( qsr_arr(:,:,:), 3 ) / nb_rec_per_days 
     217          qsr_arr (:,:,nb_rec_per_day) = qsr(:,:) 
     218          qsr_mean(:,:                ) = SUM( qsr_arr(:,:,:), 3 ) / nb_rec_per_day 
     219      ENDIF 
     220      ! 
     221      IF( lrst_trc ) THEN    !* Write the mean of qsr in restart file  
     222         IF(lwp) WRITE(numout,*) 
     223         IF(lwp) WRITE(numout,*) 'trc_mean_qsr : write qsr_mean in restart file  kt =', kt 
     224         IF(lwp) WRITE(numout,*) '~~~~~~~' 
     225          DO jn = 1, nb_rec_per_day  
     226             IF( jn <= 9 )  THEN 
     227               WRITE(cl1,'(i1)') jn 
     228               CALL iom_rstput( kt, nitrst, numrtw, 'qsr_arr_'//cl1, qsr_arr(:,:,jn) ) 
     229             ELSE 
     230               WRITE(cl2,'(i2.2)') jn 
     231               CALL iom_rstput( kt, nitrst, numrtw, 'qsr_arr_'//cl2, qsr_arr(:,:,jn) ) 
     232             ENDIF 
     233         ENDDO 
     234         CALL iom_rstput( kt, nitrst, numrtw, 'qsr_mean', qsr_mean(:,:) ) 
     235         zsecfst = REAL( isecfst, wp ) 
     236         CALL iom_rstput( kt, nitrst, numrtw, 'zsecfst', zsecfst ) 
    170237      ENDIF 
    171238      ! 
Note: See TracChangeset for help on using the changeset viewer.