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

Ignore:
Timestamp:
2018-06-21T11:58:42+02:00 (6 years ago)
Author:
dancopsey
Message:

Merged in GO6 package branch up to revision 8356.

File:
1 edited

Legend:

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

    r9816 r9817  
    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      ! 
     
    8789         tra(:,:,:,:) = 0.e0 
    8890         ! 
     91# if defined key_debug_medusa 
     92         IF(lwp) WRITE(numout,*) ' MEDUSA trc_stp begins at kt =', kt 
     93         CALL flush(numout) 
     94# endif 
    8995                                   CALL trc_rst_opn  ( kt )       ! Open tracer restart file  
     96# if defined key_debug_medusa 
     97                                   CALL trc_rst_stat  
     98                                   CALL trc_rst_tra_stat 
     99# endif 
    90100         IF( lrst_trc )            CALL trc_rst_cal  ( kt, 'WRITE' )   ! calendar 
    91101         IF( lk_iomput ) THEN  ;   CALL trc_wri      ( kt )       ! output of passive tracers with iom I/O manager 
     
    93103         ENDIF 
    94104                                   CALL trc_sms      ( kt )       ! tracers: sinks and sources 
     105# if defined key_debug_medusa 
     106         IF(lwp) WRITE(numout,*) ' MEDUSA trc_stp SMS complete at kt =', kt 
     107         CALL trc_rst_stat 
     108         CALL trc_rst_tra_stat 
     109         CALL flush(numout) 
     110# endif 
    95111                                   CALL trc_trp      ( kt )       ! transport of passive tracers 
     112# if defined key_debug_medusa 
     113         IF(lwp) WRITE(numout,*) ' MEDUSA trc_stp transport complete at kt =', kt 
     114         CALL trc_rst_stat 
     115         CALL trc_rst_tra_stat 
     116         CALL flush(numout) 
     117# endif 
    96118         IF( kt == nittrc000 ) THEN 
    97119            CALL iom_close( numrtr )       ! close input tracer restart file 
     
    102124         ! 
    103125         IF( nn_dttrc /= 1   )     CALL trc_sub_reset( kt )       ! resetting physical variables when sub-stepping 
    104          ! 
    105       ENDIF 
    106       ! 
    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) 
     126# if defined key_debug_medusa 
     127         IF(lwp) WRITE(numout,*) ' MEDUSA trc_stp ends at kt =', kt 
     128         CALL flush(numout) 
     129# endif 
     130         ! 
     131      ENDIF 
     132      ! 
     133      IF (ln_ctl) THEN  
     134         ! The following code is very expensive since it involves multiple  
     135         ! reproducible global sums over all tracer fields and is potentially   
     136         ! called on every timestep. The results it produces are purely for  
     137         ! informational purposes and do not affect model evolution.  
     138         ! Hence we restrict its use by protecting it with the ln_ctl RTL  
     139         ! which should normally only be used under debugging conditions  
     140         ! and not in operational runs. We also need to restrict output   
     141         ! to the master PE since there's no point duplicating the same results  
     142         ! on all processors.     
     143         ztrai = 0._wp                                                   !  content of all tracers 
     144         DO jn = 1, jptra 
     145            ztrai = ztrai + glob_sum( trn(:,:,:,jn) * cvol(:,:,:)   ) 
     146         END DO 
     147         IF( numstr /= -1 ) WRITE(numstr,9300) kt,  ztrai / areatot 
     1489300     FORMAT(i10,D23.16) 
     149      ENDIF 
    113150      ! 
    114151      IF( nn_timing == 1 )   CALL timing_stop('trc_stp') 
     
    123160      !!               of diurnal cycle 
    124161      !! 
    125       !! ** Method  : store in TOP the qsr every hour ( or every time-step the latter  
     162      !! ** Method  : store in TOP the qsr every hour ( or every time-step if the latter  
    126163      !!              is greater than 1 hour ) and then, compute the  mean with  
    127164      !!              a moving average over 24 hours.  
     
    130167      INTEGER, INTENT(in) ::   kt 
    131168      INTEGER  :: jn 
     169      REAL(wp) :: zsecfst 
     170      CHARACTER(len=1)               ::   cl1                      ! 1 character 
     171      CHARACTER(len=2)               ::   cl2                      ! 2 characters 
    132172 
    133173      IF( kt == nittrc000 ) THEN 
    134174         IF( ln_cpl )  THEN   
    135175            rdt_sampl = 86400. / ncpl_qsr_freq 
    136             nb_rec_per_days = ncpl_qsr_freq 
     176            nb_rec_per_day = ncpl_qsr_freq 
    137177         ELSE   
    138178            rdt_sampl = MAX( 3600., rdt * nn_dttrc ) 
    139             nb_rec_per_days = INT( 86400 / rdt_sampl ) 
     179            nb_rec_per_day = INT( 86400 / rdt_sampl ) 
    140180         ENDIF 
    141181         ! 
    142182         IF( lwp ) THEN 
    143183            WRITE(numout,*)  
    144             WRITE(numout,*) ' Sampling frequency dt = ', rdt_sampl, 's','   Number of sampling per day  nrec = ', nb_rec_per_days 
     184            WRITE(numout,*) ' Sampling frequency dt = ', rdt_sampl, 's','   Number of sampling per day  nrec = ', nb_rec_per_day 
    145185            WRITE(numout,*)  
    146186         ENDIF 
    147187         ! 
    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 
     188         ALLOCATE( qsr_arr(jpi,jpj,nb_rec_per_day ) ) 
     189         ! 
     190         !                                            !* Restart: read in restart file 
     191         IF( ln_rsttr .AND. iom_varid( numrtr, 'qsr_mean' , ldstop = .FALSE. ) > 0 .AND. & 
     192                            iom_varid( numrtr, 'qsr_arr_1', ldstop = .FALSE. ) > 0 .AND. & 
     193                            iom_varid( numrtr, 'zsecfst'  , ldstop = .FALSE. ) > 0 ) THEN  
     194            IF(lwp) WRITE(numout,*) 'trc_qsr_mean:   qsr_mean read in the restart file' 
     195            CALL iom_get( numrtr, jpdom_autoglo, 'qsr_mean', qsr_mean )   !  A mean of qsr 
     196            CALL iom_get( numrtr, 'zsecfst', zsecfst )   !  A mean of qsr 
     197            isecfst = INT( zsecfst ) 
     198            DO jn = 1, nb_rec_per_day  
     199             IF( jn <= 9 )  THEN 
     200               WRITE(cl1,'(i1)') jn 
     201               CALL iom_get( numrtr, jpdom_autoglo, 'qsr_arr_'//cl1, qsr_arr(:,:,jn) )   !  A mean of qsr 
     202             ELSE 
     203               WRITE(cl2,'(i2.2)') jn 
     204               CALL iom_get( numrtr, jpdom_autoglo, 'qsr_arr_'//cl2, qsr_arr(:,:,jn) )   !  A mean of qsr 
     205             ENDIF 
     206           ENDDO 
     207         ELSE                                         !* no restart: set from nit000 values 
     208            IF(lwp) WRITE(numout,*) 'trc_qsr_mean:   qsr_mean set to nit000 values' 
     209            isecfst  = nsec_year + nsec1jan000   !   number of seconds between Jan. 1st 00h of nit000 year and the middle of time step 
     210            ! 
     211            qsr_mean(:,:) = qsr(:,:) 
     212            DO jn = 1, nb_rec_per_day 
     213               qsr_arr(:,:,jn) = qsr_mean(:,:) 
     214            ENDDO 
     215         ENDIF 
    156216         ! 
    157217      ENDIF 
    158218      ! 
    159219      iseclast = nsec_year + nsec1jan000 
     220      ! 
    160221      llnew   = ( iseclast - isecfst )  > INT( rdt_sampl )   !   new shortwave to store 
    161       IF( kt /= nittrc000 .AND. llnew ) THEN 
     222      IF( llnew ) THEN 
    162223          IF( lwp ) WRITE(numout,*) ' New shortwave to sample for TOP at time kt = ', kt, & 
    163224             &                      ' time = ', (iseclast+rdt*nn_dttrc/2.)/3600.,'hours ' 
    164225          isecfst = iseclast 
    165           DO jn = 1, nb_rec_per_days - 1 
     226          DO jn = 1, nb_rec_per_day - 1 
    166227             qsr_arr(:,:,jn) = qsr_arr(:,:,jn+1) 
    167228          ENDDO 
    168           qsr_arr (:,:,nb_rec_per_days) = qsr(:,:) 
    169           qsr_mean(:,:                ) = SUM( qsr_arr(:,:,:), 3 ) / nb_rec_per_days 
     229          qsr_arr (:,:,nb_rec_per_day) = qsr(:,:) 
     230          qsr_mean(:,:                ) = SUM( qsr_arr(:,:,:), 3 ) / nb_rec_per_day 
     231      ENDIF 
     232      ! 
     233      IF( lrst_trc ) THEN    !* Write the mean of qsr in restart file  
     234         IF(lwp) WRITE(numout,*) 
     235         IF(lwp) WRITE(numout,*) 'trc_mean_qsr : write qsr_mean in restart file  kt =', kt 
     236         IF(lwp) WRITE(numout,*) '~~~~~~~' 
     237          DO jn = 1, nb_rec_per_day  
     238             IF( jn <= 9 )  THEN 
     239               WRITE(cl1,'(i1)') jn 
     240               CALL iom_rstput( kt, nitrst, numrtw, 'qsr_arr_'//cl1, qsr_arr(:,:,jn) ) 
     241             ELSE 
     242               WRITE(cl2,'(i2.2)') jn 
     243               CALL iom_rstput( kt, nitrst, numrtw, 'qsr_arr_'//cl2, qsr_arr(:,:,jn) ) 
     244             ENDIF 
     245         ENDDO 
     246         CALL iom_rstput( kt, nitrst, numrtw, 'qsr_mean', qsr_mean(:,:) ) 
     247         zsecfst = REAL( isecfst, wp ) 
     248         CALL iom_rstput( kt, nitrst, numrtw, 'zsecfst', zsecfst ) 
    170249      ENDIF 
    171250      ! 
Note: See TracChangeset for help on using the changeset viewer.