- Timestamp:
- 2020-09-14T17:40:34+02:00 (4 years ago)
- Location:
- NEMO/branches/2019/dev_r11351_fldread_with_XIOS
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r11351_fldread_with_XIOS
- Property svn:externals
-
old new 3 3 ^/utils/build/mk@HEAD mk 4 4 ^/utils/tools@HEAD tools 5 ^/vendors/AGRIF/dev @HEADext/AGRIF5 ^/vendors/AGRIF/dev_r12970_AGRIF_CMEMS ext/AGRIF 6 6 ^/vendors/FCM@HEAD ext/FCM 7 7 ^/vendors/IOIPSL@HEAD ext/IOIPSL 8 9 # SETTE 10 ^/utils/CI/sette@13382 sette
-
- Property svn:externals
-
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/TOP/trcstp.F90
r10570 r13463 5 5 !!====================================================================== 6 6 !! History : 1.0 ! 2004-03 (C. Ethe) Original 7 !! 4.1 ! 2019-08 (A. Coward, D. Storkey) rewrite in preparation for new timestepping scheme 7 8 !!---------------------------------------------------------------------- 8 9 #if defined key_top … … 17 18 USE trcwri 18 19 USE trcrst 19 USE trcsub !20 20 USE trdtrc_oce 21 21 USE trdmxl_trc 22 22 USE sms_pisces, ONLY : ln_check_mass 23 23 ! 24 USE prtctl _trc! Print control for debbuging24 USE prtctl ! Print control for debbuging 25 25 USE iom ! 26 26 USE in_out_manager ! … … 37 37 REAL(wp), DIMENSION(:,:,:), SAVE, ALLOCATABLE :: qsr_arr ! save qsr during TOP time-step 38 38 39 # include "domzgr_substitute.h90" 39 40 !!---------------------------------------------------------------------- 40 41 !! NEMO/TOP 4.0 , NEMO Consortium (2018) … … 44 45 CONTAINS 45 46 46 SUBROUTINE trc_stp( kt )47 SUBROUTINE trc_stp( kt, Kbb, Kmm, Krhs, Kaa ) 47 48 !!------------------------------------------------------------------- 48 49 !! *** ROUTINE trc_stp *** … … 53 54 !! Update the passive tracers 54 55 !!------------------------------------------------------------------- 55 INTEGER, INTENT( in ) :: kt ! ocean time-step index 56 INTEGER, INTENT( in ) :: kt ! ocean time-step index 57 INTEGER, INTENT( in ) :: Kbb, Kmm, Krhs, Kaa ! time level indices 56 58 ! 57 59 INTEGER :: jk, jn ! dummy loop indices … … 63 65 IF( ln_timing ) CALL timing_start('trc_stp') 64 66 ! 65 IF( ( neuler == 0 .AND. kt == nittrc000 ).OR. ln_top_euler ) THEN ! at nittrc00066 r 2dttrc = rdttrc ! = rdttrc(use or restarting with Euler time stepping)67 ELSEIF( kt <= nittrc000 + nn_dttrc ) THEN ! at nittrc000 or nittrc000+168 r 2dttrc = 2. * rdttrc ! = 2 rdttrc (leapfrog)69 ENDIF 70 ! 71 ll_trcstat = ( ln_ctl .OR.sn_cfctl%l_trcstat ) .AND. &67 IF( l_1st_euler .OR. ln_top_euler ) THEN ! at nittrc000 68 rDt_trc = rn_Dt ! = rn_Dt (use or restarting with Euler time stepping) 69 ELSEIF( kt <= nittrc000 + 1 ) THEN ! at nittrc000 or nittrc000+1 70 rDt_trc = 2. * rn_Dt ! = 2 rn_Dt (leapfrog) 71 ENDIF 72 ! 73 ll_trcstat = ( sn_cfctl%l_trcstat ) .AND. & 72 74 & ( ( MOD( kt, sn_cfctl%ptimincr ) == 0 ) .OR. ( kt == nitend ) ) 75 76 IF( kt == nittrc000 ) CALL trc_stp_ctl ! control 73 77 IF( kt == nittrc000 .AND. lk_trdmxl_trc ) CALL trd_mxl_trc_init ! trends: Mixed-layer 74 78 ! 75 79 IF( .NOT.ln_linssh ) THEN ! update ocean volume due to ssh temporal evolution 76 80 DO jk = 1, jpk 77 cvol(:,:,jk) = e1e2t(:,:) * e3t _n(:,:,jk) * tmask(:,:,jk)81 cvol(:,:,jk) = e1e2t(:,:) * e3t(:,:,jk,Kmm) * tmask(:,:,jk) 78 82 END DO 79 IF ( l n_ctl .OR. kt == nitrst .OR. ( ln_check_mass .AND. kt == nitend )&83 IF ( ll_trcstat .OR. kt == nitrst .OR. ( ln_check_mass .AND. kt == nitend ) & 80 84 & .OR. iom_use( "pno3tot" ) .OR. iom_use( "ppo4tot" ) .OR. iom_use( "psiltot" ) & 81 85 & .OR. iom_use( "palktot" ) .OR. iom_use( "pfertot" ) ) & … … 85 89 IF( l_trcdm2dc ) CALL trc_mean_qsr( kt ) 86 90 ! 87 IF( nn_dttrc /= 1 ) CALL trc_sub_stp( kt ) ! averaging physical variables for sub-stepping 88 ! 89 IF( MOD( kt , nn_dttrc ) == 0 ) THEN ! only every nn_dttrc time step 90 ! 91 IF(ln_ctl) THEN 92 WRITE(charout,FMT="('kt =', I4,' d/m/y =',I2,I2,I4)") kt, nday, nmonth, nyear 93 CALL prt_ctl_trc_info(charout) 94 ENDIF 95 ! 96 tra(:,:,:,:) = 0.e0 97 ! 98 CALL trc_rst_opn ( kt ) ! Open tracer restart file 99 IF( lrst_trc ) CALL trc_rst_cal ( kt, 'WRITE' ) ! calendar 100 CALL trc_wri ( kt ) ! output of passive tracers with iom I/O manager 101 CALL trc_sms ( kt ) ! tracers: sinks and sources 102 CALL trc_trp ( kt ) ! transport of passive tracers 103 IF( kt == nittrc000 ) THEN 104 CALL iom_close( numrtr ) ! close input tracer restart file 105 IF(lwm) CALL FLUSH( numont ) ! flush namelist output 106 ENDIF 107 IF( lrst_trc ) CALL trc_rst_wri ( kt ) ! write tracer restart file 108 IF( lk_trdmxl_trc ) CALL trd_mxl_trc ( kt ) ! trends: Mixed-layer 109 ! 110 IF( nn_dttrc /= 1 ) CALL trc_sub_reset( kt ) ! resetting physical variables when sub-stepping 111 ! 91 ! 92 IF(sn_cfctl%l_prttrc) THEN 93 WRITE(charout,FMT="('kt =', I4,' d/m/y =',I2,I2,I4)") kt, nday, nmonth, nyear 94 CALL prt_ctl_info( charout, cdcomp = 'top' ) 95 ENDIF 96 ! 97 tr(:,:,:,:,Krhs) = 0._wp 98 ! 99 CALL trc_rst_opn ( kt ) ! Open tracer restart file 100 IF( lrst_trc ) CALL trc_rst_cal ( kt, 'WRITE' ) ! calendar 101 CALL trc_wri ( kt, Kmm ) ! output of passive tracers with iom I/O manager 102 CALL trc_sms ( kt, Kbb, Kmm, Krhs ) ! tracers: sinks and sources 103 CALL trc_trp ( kt, Kbb, Kmm, Krhs, Kaa ) ! transport of passive tracers 104 ! 105 ! Note passive tracers have been time-filtered in trc_trp but the time level 106 ! indices will not be swapped until after tra_atf/dyn_atf/ssh_atf in stp. Subsequent calls here 107 ! anticipate this update which will be: Nrhs= Nbb ; Nbb = Nnn ; Nnn = Naa ; Naa = Nrhs 108 ! and use the filtered levels explicitly. 109 ! 110 IF( kt == nittrc000 ) THEN 111 CALL iom_close( numrtr ) ! close input tracer restart file 112 IF(lwm) CALL FLUSH( numont ) ! flush namelist output 113 ENDIF 114 IF( lrst_trc ) CALL trc_rst_wri ( kt, Kmm, Kaa, Kbb ) ! write tracer restart file 115 IF( lk_trdmxl_trc ) CALL trd_mxl_trc ( kt, Kaa ) ! trends: Mixed-layer 116 ! 117 IF( ln_top_euler ) THEN 118 ! For Euler timestepping for TOP we need to copy the "after" to the "now" fields 119 ! here then after the (leapfrog) swapping of the time-level indices in OCE/step.F90 we have 120 ! "before" fields = "now" fields. 121 tr(:,:,:,:,Kmm) = tr(:,:,:,:,Kaa) 112 122 ENDIF 113 123 ! … … 115 125 ztrai = 0._wp ! content of all tracers 116 126 DO jn = 1, jptra 117 ztrai = ztrai + glob_sum( 'trcstp', tr n(:,:,:,jn) * cvol(:,:,:) )127 ztrai = ztrai + glob_sum( 'trcstp', tr(:,:,:,jn,Kaa) * cvol(:,:,:) ) 118 128 END DO 119 129 IF( lwm ) WRITE(numstr,9300) kt, ztrai / areatot … … 124 134 ! 125 135 END SUBROUTINE trc_stp 136 137 138 SUBROUTINE trc_stp_ctl 139 !!---------------------------------------------------------------------- 140 !! *** ROUTINE trc_stp_ctl *** 141 !! ** Purpose : Control + ocean volume 142 !!---------------------------------------------------------------------- 143 ! 144 ! Define logical parameter ton control dirunal cycle in TOP 145 l_trcdm2dc = ln_dm2dc .OR. ( ln_cpl .AND. ncpl_qsr_freq /= 1 .AND. ncpl_qsr_freq /= 0 ) 146 l_trcdm2dc = l_trcdm2dc .AND. .NOT. l_offline 147 ! 148 IF( l_trcdm2dc .AND. lwp ) CALL ctl_warn( 'Coupling with passive tracers and used of diurnal cycle.', & 149 & 'Computation of a daily mean shortwave for some biogeochemical models ' ) 150 ! 151 END SUBROUTINE trc_stp_ctl 126 152 127 153 … … 153 179 nb_rec_per_day = ncpl_qsr_freq 154 180 ELSE 155 rdt_sampl = MAX( 3600., r dttrc)181 rdt_sampl = MAX( 3600., rn_Dt ) 156 182 nb_rec_per_day = INT( rday / rdt_sampl ) 157 183 ENDIF … … 172 198 173 199 CALL iom_get( numrtr, 'ktdcy', zkt ) 174 rsecfst = INT( zkt ) * r dttrc200 rsecfst = INT( zkt ) * rn_Dt 175 201 IF(lwp) WRITE(numout,*) 'trc_qsr_mean: qsr_mean read in the restart file at time-step rsecfst =', rsecfst, ' s ' 176 CALL iom_get( numrtr, jpdom_auto glo, 'qsr_mean', qsr_mean ) ! A mean of qsr202 CALL iom_get( numrtr, jpdom_auto, 'qsr_mean', qsr_mean ) ! A mean of qsr 177 203 CALL iom_get( numrtr, 'nrdcy', zrec ) ! Number of record per days 178 204 IF( INT( zrec ) == nb_rec_per_day ) THEN … … 180 206 IF( jn <= 9 ) THEN 181 207 WRITE(cl1,'(i1)') jn 182 CALL iom_get( numrtr, jpdom_auto glo, 'qsr_arr_'//cl1, qsr_arr(:,:,jn) ) ! A mean of qsr208 CALL iom_get( numrtr, jpdom_auto, 'qsr_arr_'//cl1, qsr_arr(:,:,jn) ) ! A mean of qsr 183 209 ELSE 184 210 WRITE(cl2,'(i2.2)') jn 185 CALL iom_get( numrtr, jpdom_auto glo, 'qsr_arr_'//cl2, qsr_arr(:,:,jn) ) ! A mean of qsr211 CALL iom_get( numrtr, jpdom_auto, 'qsr_arr_'//cl2, qsr_arr(:,:,jn) ) ! A mean of qsr 186 212 ENDIF 187 213 END DO … … 193 219 ELSE !* no restart: set from nit000 values 194 220 IF(lwp) WRITE(numout,*) 'trc_qsr_mean: qsr_mean set to nit000 values' 195 rsecfst = kt * r dttrc221 rsecfst = kt * rn_Dt 196 222 ! 197 223 qsr_mean(:,:) = qsr(:,:) … … 203 229 ENDIF 204 230 ! 205 rseclast = kt * r dttrc231 rseclast = kt * rn_Dt 206 232 ! 207 233 llnew = ( rseclast - rsecfst ) .ge. rdt_sampl ! new shortwave to store
Note: See TracChangeset
for help on using the changeset viewer.