- Timestamp:
- 2020-04-08T21:37:59+02:00 (4 years ago)
- Location:
- NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3
- Files:
-
- 110 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3
- Property svn:externals
-
old new 3 3 ^/utils/build/mk@HEAD mk 4 4 ^/utils/tools@HEAD tools 5 ^/vendors/AGRIF/dev _r11615_ENHANCE-04_namelists_as_internalfiles_agrif@HEAD ext/AGRIF5 ^/vendors/AGRIF/dev@HEAD ext/AGRIF 6 6 ^/vendors/FCM@HEAD ext/FCM 7 7 ^/vendors/IOIPSL@HEAD ext/IOIPSL 8 9 # SETTE 10 ^/utils/CI/sette@HEAD sette
-
- Property svn:externals
-
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/ASM/asminc.F90
r12680 r12724 489 489 ENDIF 490 490 ! 491 IF(lwp) WRITE(numout,*) ' ==>>> Euler time step switch is ', neuler491 IF(lwp) WRITE(numout,*) ' ==>>> Euler time step switch is ', l_1st_euler 492 492 ! 493 493 IF( lk_asminc ) THEN !== data assimilation ==! … … 536 536 ! 537 537 it = kt - nit000 + 1 538 zincwgt = wgtiau(it) / r dt ! IAU weight for the current time step538 zincwgt = wgtiau(it) / rn_Dt ! IAU weight for the current time step 539 539 ! 540 540 IF(lwp) THEN … … 579 579 IF ( kt == nitdin_r ) THEN 580 580 ! 581 neuler = 0! Force Euler forward step581 l_1st_euler = .TRUE. ! Force Euler forward step 582 582 ! 583 583 ! Initialize the now fields with the background + increment … … 653 653 ! 654 654 it = kt - nit000 + 1 655 zincwgt = wgtiau(it) / r dt ! IAU weight for the current time step655 zincwgt = wgtiau(it) / rn_Dt ! IAU weight for the current time step 656 656 ! 657 657 IF(lwp) THEN … … 679 679 IF ( kt == nitdin_r ) THEN 680 680 ! 681 neuler = 0! Force Euler forward step681 l_1st_euler = .TRUE. ! Force Euler forward step 682 682 ! 683 683 ! Initialize the now fields with the background + increment … … 724 724 ! 725 725 it = kt - nit000 + 1 726 zincwgt = wgtiau(it) / r dt ! IAU weight for the current time step726 zincwgt = wgtiau(it) / rn_Dt ! IAU weight for the current time step 727 727 ! 728 728 IF(lwp) THEN … … 755 755 IF ( kt == nitdin_r ) THEN 756 756 ! 757 neuler = 0! Force Euler forward step757 l_1st_euler = .TRUE. ! Force Euler forward step 758 758 ! 759 759 ssh(:,:,Kmm) = ssh_bkg(:,:) + ssh_bkginc(:,:) ! Initialize the now fields the background + increment … … 845 845 it = kt - nit000 + 1 846 846 zincwgt = wgtiau(it) ! IAU weight for the current time step 847 ! note this is not a tendency so should not be divided by r dt (as with the tracer and other increments)847 ! note this is not a tendency so should not be divided by rn_Dt (as with the tracer and other increments) 848 848 ! 849 849 IF(lwp) THEN … … 880 880 #if defined key_cice && defined key_asminc 881 881 ! Sea-ice : CICE case. Pass ice increment tendency into CICE 882 ndaice_da(:,:) = seaice_bkginc(:,:) * zincwgt / r dt882 ndaice_da(:,:) = seaice_bkginc(:,:) * zincwgt / rn_Dt 883 883 #endif 884 884 ! … … 900 900 IF ( kt == nitdin_r ) THEN 901 901 ! 902 neuler = 0! Force Euler forward step902 l_1st_euler = 0 ! Force Euler forward step 903 903 ! 904 904 ! Sea-ice : SI3 case … … 930 930 #if defined key_cice && defined key_asminc 931 931 ! Sea-ice : CICE case. Pass ice increment tendency into CICE 932 ndaice_da(:,:) = seaice_bkginc(:,:) / r dt932 ndaice_da(:,:) = seaice_bkginc(:,:) / rn_Dt 933 933 #endif 934 934 IF ( .NOT. PRESENT(kindic) ) THEN … … 963 963 ! ! fwf : ice formation and melting 964 964 ! 965 ! zfons = ( -nfresh_da(ji,jj)*soce + nfsalt_da(ji,jj) )*r dt965 ! zfons = ( -nfresh_da(ji,jj)*soce + nfsalt_da(ji,jj) )*rn_Dt 966 966 ! 967 967 ! ! change salinity down to mixed layer depth … … 1004 1004 ! 1005 1005 ! ! ! salt exchanges at the ice/ocean interface 1006 ! ! zpmess = zfons / r dt_ice ! rdt_ice is ice timestep1006 ! ! zpmess = zfons / rDt_ice ! rDt_ice is ice timestep 1007 1007 ! ! 1008 1008 ! !! Adjust fsalt. A +ve fsalt means adding salt to ocean -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/BDY/bdydta.F90
r12680 r12724 93 93 INTEGER :: ii, ij, ik, igrd, ipl ! local integers 94 94 INTEGER, DIMENSION(jpbgrd) :: ilen1 95 INTEGER, DIMENSION(:), POINTER :: nblen, nblenrim ! short cuts96 95 TYPE(OBC_DATA) , POINTER :: dta_alias ! short cut 97 96 TYPE(FLD), DIMENSION(:), POINTER :: bf_alias … … 109 108 DO jbdy = 1, nb_bdy 110 109 ! 111 nblen => idx_bdy(jbdy)%nblen112 nblenrim => idx_bdy(jbdy)%nblenrim113 !114 110 IF( nn_dyn2d_dta(jbdy) == 0 ) THEN 115 ilen1(:) = nblen(:)116 111 IF( dta_bdy(jbdy)%lneed_ssh ) THEN 117 112 igrd = 1 118 DO ib = 1, i len1(igrd)113 DO ib = 1, idx_bdy(jbdy)%nblenrim(igrd) ! ssh is allocated and used only on the rim 119 114 ii = idx_bdy(jbdy)%nbi(ib,igrd) 120 115 ij = idx_bdy(jbdy)%nbj(ib,igrd) … … 122 117 END DO 123 118 ENDIF 124 IF( dta_bdy(jbdy)%lneed_dyn2d ) THEN119 IF( dta_bdy(jbdy)%lneed_dyn2d .AND. ASSOCIATED(dta_bdy(jbdy)%u2d) ) THEN ! no SIZE with a unassociated pointer 125 120 igrd = 2 126 DO ib = 1, ilen1(igrd)121 DO ib = 1, SIZE(dta_bdy(jbdy)%u2d) ! u2d is used only on the rim except if ln_full_vel = T, see bdy_dta_init 127 122 ii = idx_bdy(jbdy)%nbi(ib,igrd) 128 123 ij = idx_bdy(jbdy)%nbj(ib,igrd) … … 130 125 END DO 131 126 igrd = 3 132 DO ib = 1, ilen1(igrd)127 DO ib = 1, SIZE(dta_bdy(jbdy)%v2d) ! v2d is used only on the rim except if ln_full_vel = T, see bdy_dta_init 133 128 ii = idx_bdy(jbdy)%nbi(ib,igrd) 134 129 ij = idx_bdy(jbdy)%nbj(ib,igrd) … … 139 134 ! 140 135 IF( nn_dyn3d_dta(jbdy) == 0 ) THEN 141 ilen1(:) = nblen(:)142 136 IF( dta_bdy(jbdy)%lneed_dyn3d ) THEN 143 137 igrd = 2 144 DO ib = 1, i len1(igrd)138 DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 145 139 DO ik = 1, jpkm1 146 140 ii = idx_bdy(jbdy)%nbi(ib,igrd) … … 150 144 END DO 151 145 igrd = 3 152 DO ib = 1, i len1(igrd)146 DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 153 147 DO ik = 1, jpkm1 154 148 ii = idx_bdy(jbdy)%nbi(ib,igrd) … … 161 155 162 156 IF( nn_tra_dta(jbdy) == 0 ) THEN 163 ilen1(:) = nblen(:)164 157 IF( dta_bdy(jbdy)%lneed_tra ) THEN 165 158 igrd = 1 166 DO ib = 1, i len1(igrd)159 DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 167 160 DO ik = 1, jpkm1 168 161 ii = idx_bdy(jbdy)%nbi(ib,igrd) … … 177 170 #if defined key_si3 178 171 IF( nn_ice_dta(jbdy) == 0 ) THEN ! set ice to initial values 179 ilen1(:) = nblen(:)180 172 IF( dta_bdy(jbdy)%lneed_ice ) THEN 181 173 igrd = 1 182 174 DO jl = 1, jpl 183 DO ib = 1, i len1(igrd)175 DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 184 176 ii = idx_bdy(jbdy)%nbi(ib,igrd) 185 177 ij = idx_bdy(jbdy)%nbj(ib,igrd) … … 237 229 ! tidal harmonic forcing ONLY: initialise arrays 238 230 IF( nn_dyn2d_dta(jbdy) == 2 ) THEN ! we did not read ssh, u/v2d 239 IF( dta_alias%lneed_ssh ) dta_alias%ssh(:) = 0._wp240 IF( dta_alias%lneed_dyn2d ) dta_alias%u2d(:) = 0._wp241 IF( dta_alias%lneed_dyn2d ) dta_alias%v2d(:) = 0._wp231 IF( dta_alias%lneed_ssh .AND. ASSOCIATED(dta_alias%ssh) ) dta_alias%ssh(:) = 0._wp 232 IF( dta_alias%lneed_dyn2d .AND. ASSOCIATED(dta_alias%u2d) ) dta_alias%u2d(:) = 0._wp 233 IF( dta_alias%lneed_dyn2d .AND. ASSOCIATED(dta_alias%v2d) ) dta_alias%v2d(:) = 0._wp 242 234 ENDIF 243 235 … … 246 238 ! 247 239 igrd = 2 ! zonal velocity 248 dta_alias%u2d(:) = 0._wp ! compute barotrope zonal velocity and put it in u2d249 240 DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 250 241 ii = idx_bdy(jbdy)%nbi(ib,igrd) 251 242 ij = idx_bdy(jbdy)%nbj(ib,igrd) 243 dta_alias%u2d(ib) = 0._wp ! compute barotrope zonal velocity and put it in u2d 252 244 DO ik = 1, jpkm1 253 245 dta_alias%u2d(ib) = dta_alias%u2d(ib) & … … 260 252 END DO 261 253 igrd = 3 ! meridional velocity 262 dta_alias%v2d(:) = 0._wp ! compute barotrope meridional velocity and put it in v2d263 254 DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 264 255 ii = idx_bdy(jbdy)%nbi(ib,igrd) 265 256 ij = idx_bdy(jbdy)%nbj(ib,igrd) 257 dta_alias%v2d(ib) = 0._wp ! compute barotrope meridional velocity and put it in v2d 266 258 DO ik = 1, jpkm1 267 259 dta_alias%v2d(ib) = dta_alias%v2d(ib) & … … 286 278 287 279 #if defined key_si3 288 IF( dta_alias%lneed_ice ) THEN280 IF( dta_alias%lneed_ice .AND. idx_bdy(jbdy)%nblen(1) > 0 ) THEN 289 281 ! fill temperature and salinity arrays 290 282 IF( TRIM(bf_alias(jp_bdyt_i)%clrootname) == 'NOT USED' ) bf_alias(jp_bdyt_i)%fnow(:,1,:) = rice_tem (jbdy) … … 295 287 & bf_alias(jp_bdya_i)%fnow(:,1,:) ! ( a_ip = rice_apnd * a_i ) 296 288 IF( TRIM(bf_alias(jp_bdyhip)%clrootname) == 'NOT USED' ) bf_alias(jp_bdyhip)%fnow(:,1,:) = rice_hpnd(jbdy) 289 290 ! if T_i is read and not T_su, set T_su = T_i 291 IF( TRIM(bf_alias(jp_bdyt_i)%clrootname) /= 'NOT USED' .AND. TRIM(bf_alias(jp_bdytsu)%clrootname) == 'NOT USED' ) & 292 & bf_alias(jp_bdytsu)%fnow(:,1,:) = bf_alias(jp_bdyt_i)%fnow(:,1,:) 293 ! if T_s is read and not T_su, set T_su = T_s 294 IF( TRIM(bf_alias(jp_bdyt_s)%clrootname) /= 'NOT USED' .AND. TRIM(bf_alias(jp_bdytsu)%clrootname) == 'NOT USED' ) & 295 & bf_alias(jp_bdytsu)%fnow(:,1,:) = bf_alias(jp_bdyt_s)%fnow(:,1,:) 296 ! if T_i is read and not T_s, set T_s = T_i 297 IF( TRIM(bf_alias(jp_bdyt_i)%clrootname) /= 'NOT USED' .AND. TRIM(bf_alias(jp_bdyt_s)%clrootname) == 'NOT USED' ) & 298 & bf_alias(jp_bdyt_s)%fnow(:,1,:) = bf_alias(jp_bdyt_i)%fnow(:,1,:) 299 ! if T_su is read and not T_s, set T_s = T_su 300 IF( TRIM(bf_alias(jp_bdytsu)%clrootname) /= 'NOT USED' .AND. TRIM(bf_alias(jp_bdyt_s)%clrootname) == 'NOT USED' ) & 301 & bf_alias(jp_bdyt_s)%fnow(:,1,:) = bf_alias(jp_bdytsu)%fnow(:,1,:) 297 302 ! if T_su is read and not T_i, set T_i = (T_su + T_freeze)/2 298 303 IF( TRIM(bf_alias(jp_bdytsu)%clrootname) /= 'NOT USED' .AND. TRIM(bf_alias(jp_bdyt_i)%clrootname) == 'NOT USED' ) & 299 304 & bf_alias(jp_bdyt_i)%fnow(:,1,:) = 0.5_wp * ( bf_alias(jp_bdytsu)%fnow(:,1,:) + 271.15 ) 300 ! if T_su is read and not T_s, set T_s = T_su301 IF( TRIM(bf_alias(jp_bdytsu)%clrootname) /= 'NOT USED' .AND. TRIM(bf_alias(jp_bdyt_s)%clrootname) == 'NOT USED' ) &302 & bf_alias(jp_bdyt_s)%fnow(:,1,:) = bf_alias(jp_bdytsu)%fnow(:,1,:)303 ! if T_s is read and not T_su, set T_su = T_s304 IF( TRIM(bf_alias(jp_bdyt_s)%clrootname) /= 'NOT USED' .AND. TRIM(bf_alias(jp_bdytsu)%clrootname) == 'NOT USED' ) &305 & bf_alias(jp_bdytsu)%fnow(:,1,:) = bf_alias(jp_bdyt_s)%fnow(:,1,:)306 305 ! if T_s is read and not T_i, set T_i = (T_s + T_freeze)/2 307 306 IF( TRIM(bf_alias(jp_bdyt_s)%clrootname) /= 'NOT USED' .AND. TRIM(bf_alias(jp_bdyt_i)%clrootname) == 'NOT USED' ) & … … 334 333 DO jbdy = 1, nb_bdy ! Tidal component added in ts loop 335 334 IF ( nn_dyn2d_dta(jbdy) .GE. 2 ) THEN 336 nblen => idx_bdy(jbdy)%nblen 337 nblenrim => idx_bdy(jbdy)%nblenrim 338 IF( cn_dyn2d(jbdy) == 'frs' ) THEN ; ilen1(:)=nblen(:) 339 ELSE ; ilen1(:)=nblenrim(:) 335 IF( cn_dyn2d(jbdy) == 'frs' ) THEN ; ilen1(:)=idx_bdy(jbdy)%nblen(:) 336 ELSE ; ilen1(:)=idx_bdy(jbdy)%nblenrim(:) 340 337 ENDIF 341 338 IF ( dta_bdy(jbdy)%lneed_ssh ) dta_bdy_s(jbdy)%ssh(1:ilen1(1)) = dta_bdy(jbdy)%ssh(1:ilen1(1)) -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/BDY/bdyice.F90
r11536 r12724 179 179 180 180 ! Then, a) transfer the snow excess into the ice (different from icethd_dh) 181 zdh = MAX( 0._wp, ( rhos * h_s(ji,jj,jl) + ( rhoi - r au0 ) * h_i(ji,jj,jl) ) * r1_rau0 )181 zdh = MAX( 0._wp, ( rhos * h_s(ji,jj,jl) + ( rhoi - rho0 ) * h_i(ji,jj,jl) ) * r1_rho0 ) 182 182 ! Or, b) transfer all the snow into ice (if incoming ice is likely to melt as it comes into a warmer environment) 183 183 !zdh = MAX( 0._wp, h_s(ji,jj,jl) * rhos / rhoi ) -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/BDY/bdylib.F90
r12377 r12724 240 240 ! Centred derivative is calculated as average of "left" and "right" derivatives for 241 241 ! this reason. 242 ! Note no r dt factor in expression for zdt because it cancels in the expressions for242 ! Note no rn_Dt factor in expression for zdt because it cancels in the expressions for 243 243 ! zrx and zry. 244 244 zdt = phia(iibm1 ,ijbm1 ) - phib(iibm1 ,ijbm1 ) … … 259 259 zout = sign( 1., zrx ) 260 260 zout = 0.5*( zout + abs(zout) ) 261 zwgt = 2.*r dt*( (1.-zout) * idx%nbd(jb,igrd) + zout * idx%nbdout(jb,igrd) )261 zwgt = 2.*rn_Dt*( (1.-zout) * idx%nbd(jb,igrd) + zout * idx%nbdout(jb,igrd) ) 262 262 ! only apply radiation on outflow points 263 263 if( ll_npo ) then !! NPO version !! … … 425 425 zout = sign( 1., zrx ) 426 426 zout = 0.5*( zout + abs(zout) ) 427 zwgt = 2.*r dt*( (1.-zout) * idx%nbd(jb,igrd) + zout * idx%nbdout(jb,igrd) )427 zwgt = 2.*rn_Dt*( (1.-zout) * idx%nbd(jb,igrd) + zout * idx%nbdout(jb,igrd) ) 428 428 ! only apply radiation on outflow points 429 429 if( ll_npo ) then !! NPO version !! -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/BDY/bdytides.F90
r12377 r12724 297 297 ! Absolute time from model initialization: 298 298 IF( PRESENT(kit) ) THEN 299 z_arg = ( REAL(kt, wp) + ( REAL(kit, wp) + zt_offset - 1. ) / REAL(nn_ baro, wp) ) * rdt299 z_arg = ( REAL(kt, wp) + ( REAL(kit, wp) + zt_offset - 1. ) / REAL(nn_e, wp) ) * rn_Dt 300 300 ELSE 301 z_arg = ( REAL(kt, wp) + zt_offset ) * r dt301 z_arg = ( REAL(kt, wp) + zt_offset ) * rn_Dt 302 302 ENDIF 303 303 304 304 ! Linear ramp on tidal component at open boundaries 305 305 zramp = 1. 306 IF (ln_tide_ramp) zramp = MIN(MAX( (z_arg - REAL(nit000,wp)*r dt)/(rn_tide_ramp_dt*rday),0.),1.)306 IF (ln_tide_ramp) zramp = MIN(MAX( (z_arg - REAL(nit000,wp)*rn_Dt)/(rn_tide_ramp_dt*rday),0.),1.) 307 307 308 308 DO ib_bdy = 1,nb_bdy … … 319 319 ! We refresh nodal factors every day below 320 320 ! This should be done somewhere else 321 IF ( ( nsec_day == NINT(0.5_wp * r dt) .OR. kt==nit000 ) .AND. lk_first_btstp ) THEN322 ! 323 kt_tide = kt - NINT((REAL(nsec_day,wp) - 0.5_wp * r dt)/rdt)321 IF ( ( nsec_day == NINT(0.5_wp * rn_Dt) .OR. kt==nit000 ) .AND. lk_first_btstp ) THEN 322 ! 323 kt_tide = kt - NINT((REAL(nsec_day,wp) - 0.5_wp * rn_Dt)/rn_Dt) 324 324 ! 325 325 IF(lwp) THEN … … 333 333 ! 334 334 ENDIF 335 zoff = REAL(-kt_tide,wp) * r dt ! time offset relative to nodal factor computation time335 zoff = REAL(-kt_tide,wp) * rn_Dt ! time offset relative to nodal factor computation time 336 336 ! 337 337 ! If time splitting, initialize arrays from slow varying open boundary data: -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/BDY/bdyvol.F90
r12377 r12724 77 77 ! Calculate the cumulate surface Flux z_cflxemp (m3/s) over all the domain 78 78 ! ----------------------------------------------------------------------- 79 IF ( kc == 1 ) z_cflxemp = glob_sum( 'bdyvol', ( emp(:,:) - rnf(:,:) + fwfisf_cav(:,:) + fwfisf_par(:,:) ) * bdytmask(:,:) * e1e2t(:,:) ) / r au079 IF ( kc == 1 ) z_cflxemp = glob_sum( 'bdyvol', ( emp(:,:) - rnf(:,:) + fwfisf_cav(:,:) + fwfisf_par(:,:) ) * bdytmask(:,:) * e1e2t(:,:) ) / rho0 80 80 81 81 ! Compute bdy surface each cycle if non linear free surface -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DIA/dia25h.F90
r12377 r12724 140 140 ! ----------------- 141 141 ! Define frequency of summing to create 25 h mean 142 IF( MOD( 3600,NINT(r dt) ) == 0 ) THEN143 i_steps = 3600/NINT(r dt)142 IF( MOD( 3600,NINT(rn_Dt) ) == 0 ) THEN 143 i_steps = 3600/NINT(rn_Dt) 144 144 ELSE 145 CALL ctl_stop('STOP', 'dia_wri_tide: timestep must give MOD(3600,r dt) = 0 otherwise no hourly values are possible')145 CALL ctl_stop('STOP', 'dia_wri_tide: timestep must give MOD(3600,rn_Dt) = 0 otherwise no hourly values are possible') 146 146 ENDIF 147 147 -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DIA/diaar5.F90
r12680 r12724 32 32 REAL(wp) :: vol0 ! ocean volume (interior domain) 33 33 REAL(wp) :: area_tot ! total ocean surface (interior domain) 34 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,: ) :: area ! cell surface (interior domain)35 34 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,: ) :: thick0 ! ocean thickness (interior domain) 36 35 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sn0 ! initial salinity … … 55 54 !!---------------------------------------------------------------------- 56 55 ! 57 ALLOCATE( area(jpi,jpj),thick0(jpi,jpj) , sn0(jpi,jpj,jpk) , STAT=dia_ar5_alloc )56 ALLOCATE( thick0(jpi,jpj) , sn0(jpi,jpj,jpk) , STAT=dia_ar5_alloc ) 58 57 ! 59 58 CALL mpp_sum ( 'diaar5', dia_ar5_alloc ) … … 91 90 ALLOCATE( zrhd(jpi,jpj,jpk) , zrhop(jpi,jpj,jpk) ) 92 91 ALLOCATE( ztsn(jpi,jpj,jpk,jpts) ) 93 zarea_ssh(:,:) = area(:,:) * ssh(:,:,Kmm)94 ENDIF 95 ! 96 CALL iom_put( 'e2u' , e2u (:,:) )97 CALL iom_put( 'e1v' , e1v (:,:) )98 CALL iom_put( 'areacello', area(:,:) )92 zarea_ssh(:,:) = e1e2t(:,:) * ssh(:,:,Kmm) 93 ENDIF 94 ! 95 CALL iom_put( 'e2u' , e2u (:,:) ) 96 CALL iom_put( 'e1v' , e1v (:,:) ) 97 CALL iom_put( 'areacello', e1e2t(:,:) ) 99 98 ! 100 99 IF( iom_use( 'volcello' ) .OR. iom_use( 'masscello' ) ) THEN 101 100 zrhd(:,:,jpk) = 0._wp ! ocean volume ; rhd is used as workspace 102 101 DO jk = 1, jpkm1 103 zrhd(:,:,jk) = area(:,:) * e3t(:,:,jk,Kmm) * tmask(:,:,jk)102 zrhd(:,:,jk) = e1e2t(:,:) * e3t(:,:,jk,Kmm) * tmask(:,:,jk) 104 103 END DO 105 104 DO jk = 1, jpk 106 z3d(:,:,jk) = r au0 * e3t(:,:,jk,Kmm) * tmask(:,:,jk)105 z3d(:,:,jk) = rho0 * e3t(:,:,jk,Kmm) * tmask(:,:,jk) 107 106 END DO 108 107 CALL iom_put( 'volcello' , zrhd(:,:,:) ) ! WARNING not consistent with CMIP DR where volcello is at ca. 2000 … … 155 154 END IF 156 155 ! 157 zarho = glob_sum( 'diaar5', area(:,:) * zbotpres(:,:) )156 zarho = glob_sum( 'diaar5', e1e2t(:,:) * zbotpres(:,:) ) 158 157 zssh_steric = - zarho / area_tot 159 158 CALL iom_put( 'sshthster', zssh_steric ) … … 181 180 END IF 182 181 ! 183 zarho = glob_sum( 'diaar5', area(:,:) * zbotpres(:,:) )182 zarho = glob_sum( 'diaar5', e1e2t(:,:) * zbotpres(:,:) ) 184 183 zssh_steric = - zarho / area_tot 185 184 CALL iom_put( 'sshsteric', zssh_steric ) 186 185 ! ! ocean bottom pressure 187 zztmp = r au0 * grav * 1.e-4_wp ! recover pressure from pressure anomaly and cover to dbar = 1.e4 Pa186 zztmp = rho0 * grav * 1.e-4_wp ! recover pressure from pressure anomaly and cover to dbar = 1.e4 Pa 188 187 zbotpres(:,:) = zztmp * ( zbotpres(:,:) + ssh(:,:,Kmm) + thick0(:,:) ) 189 188 CALL iom_put( 'botpres', zbotpres ) … … 195 194 ztsn(:,:,:,:) = 0._wp ! ztsn(:,:,1,jp_tem/sal) is used here as 2D Workspace for temperature & salinity 196 195 DO_3D_11_11( 1, jpkm1 ) 197 zztmp = area(ji,jj) * e3t(ji,jj,jk,Kmm)196 zztmp = e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm) 198 197 ztsn(ji,jj,1,jp_tem) = ztsn(ji,jj,1,jp_tem) + zztmp * ts(ji,jj,jk,jp_tem,Kmm) 199 198 ztsn(ji,jj,1,jp_sal) = ztsn(ji,jj,1,jp_sal) + zztmp * ts(ji,jj,jk,jp_sal,Kmm) … … 217 216 ztemp = glob_sum( 'diaar5', ztsn(:,:,1,jp_tem) ) 218 217 zsal = glob_sum( 'diaar5', ztsn(:,:,1,jp_sal) ) 219 zmass = r au0 * ( zarho + zvol )218 zmass = rho0 * ( zarho + zvol ) 220 219 ! 221 220 CALL iom_put( 'masstot', zmass ) … … 241 240 z2d(:,:) = 0._wp 242 241 DO jk = 1, jpkm1 243 z2d(:,:) = z2d(:,:) + area(:,:) * e3t(:,:,jk,Kmm) * ztpot(:,:,jk)242 z2d(:,:) = z2d(:,:) + e1e2t(:,:) * e3t(:,:,jk,Kmm) * ztpot(:,:,jk) 244 243 END DO 245 244 ztemp = glob_sum( 'diaar5', z2d(:,:) ) … … 248 247 ! 249 248 IF( iom_use( 'ssttot' ) ) THEN ! Output potential temperature in case we use TEOS-10 250 zsst = glob_sum( 'diaar5', area(:,:) * ztpot(:,:,1) )249 zsst = glob_sum( 'diaar5', e1e2t(:,:) * ztpot(:,:,1) ) 251 250 CALL iom_put( 'ssttot', zsst / area_tot ) 252 251 ENDIF … … 255 254 z2d(:,:) = 0._wp 256 255 DO_3D_11_11( 1, jpkm1 ) 257 z2d(ji,jj) = z2d(ji,jj) + r au0 * e3t(ji,jj,jk,Kmm) * ztpot(ji,jj,jk)256 z2d(ji,jj) = z2d(ji,jj) + rho0 * e3t(ji,jj,jk,Kmm) * ztpot(ji,jj,jk) 258 257 END_3D 259 258 CALL iom_put( 'tosmint_pot', z2d ) … … 263 262 ELSE 264 263 IF( iom_use('ssttot') ) THEN ! Output sst in case we use EOS-80 265 zsst = glob_sum( 'diaar5', area(:,:) * ts(:,:,1,jp_tem,Kmm) )264 zsst = glob_sum( 'diaar5', e1e2t(:,:) * ts(:,:,1,jp_tem,Kmm) ) 266 265 CALL iom_put('ssttot', zsst / area_tot ) 267 266 ENDIF … … 289 288 ELSE 290 289 DO_3D_11_11( 1, jpk ) 291 zpe(ji,jj) = zpe(ji,jj) + avt(ji,jj,jk) * MIN(0._wp,rn2(ji,jj,jk)) * r au0 * e3w(ji,jj,jk,Kmm)290 zpe(ji,jj) = zpe(ji,jj) + avt(ji,jj,jk) * MIN(0._wp,rn2(ji,jj,jk)) * rho0 * e3w(ji,jj,jk,Kmm) 292 291 END_3D 293 292 ENDIF … … 329 328 CALL lbc_lnk( 'diaar5', z2d, 'U', -1. ) 330 329 IF( cptr == 'adv' ) THEN 331 IF( ktra == jp_tem ) CALL iom_put( 'uadv_heattr' , r au0_rcp * z2d ) ! advective heat transport in i-direction332 IF( ktra == jp_sal ) CALL iom_put( 'uadv_salttr' , r au0 * z2d ) ! advective salt transport in i-direction330 IF( ktra == jp_tem ) CALL iom_put( 'uadv_heattr' , rho0_rcp * z2d ) ! advective heat transport in i-direction 331 IF( ktra == jp_sal ) CALL iom_put( 'uadv_salttr' , rho0 * z2d ) ! advective salt transport in i-direction 333 332 ENDIF 334 333 IF( cptr == 'ldf' ) THEN 335 IF( ktra == jp_tem ) CALL iom_put( 'udiff_heattr' , r au0_rcp * z2d ) ! diffusive heat transport in i-direction336 IF( ktra == jp_sal ) CALL iom_put( 'udiff_salttr' , r au0 * z2d ) ! diffusive salt transport in i-direction334 IF( ktra == jp_tem ) CALL iom_put( 'udiff_heattr' , rho0_rcp * z2d ) ! diffusive heat transport in i-direction 335 IF( ktra == jp_sal ) CALL iom_put( 'udiff_salttr' , rho0 * z2d ) ! diffusive salt transport in i-direction 337 336 ENDIF 338 337 ! … … 343 342 CALL lbc_lnk( 'diaar5', z2d, 'V', -1. ) 344 343 IF( cptr == 'adv' ) THEN 345 IF( ktra == jp_tem ) CALL iom_put( 'vadv_heattr' , r au0_rcp * z2d ) ! advective heat transport in j-direction346 IF( ktra == jp_sal ) CALL iom_put( 'vadv_salttr' , r au0 * z2d ) ! advective salt transport in j-direction344 IF( ktra == jp_tem ) CALL iom_put( 'vadv_heattr' , rho0_rcp * z2d ) ! advective heat transport in j-direction 345 IF( ktra == jp_sal ) CALL iom_put( 'vadv_salttr' , rho0 * z2d ) ! advective salt transport in j-direction 347 346 ENDIF 348 347 IF( cptr == 'ldf' ) THEN 349 IF( ktra == jp_tem ) CALL iom_put( 'vdiff_heattr' , r au0_rcp * z2d ) ! diffusive heat transport in j-direction350 IF( ktra == jp_sal ) CALL iom_put( 'vdiff_salttr' , r au0 * z2d ) ! diffusive salt transport in j-direction348 IF( ktra == jp_tem ) CALL iom_put( 'vdiff_heattr' , rho0_rcp * z2d ) ! diffusive heat transport in j-direction 349 IF( ktra == jp_sal ) CALL iom_put( 'vdiff_salttr' , rho0 * z2d ) ! diffusive salt transport in j-direction 351 350 ENDIF 352 351 … … 379 378 IF( dia_ar5_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'dia_ar5_init : unable to allocate arrays' ) 380 379 381 area(:,:) = e1e2t(:,:) 382 area_tot = glob_sum( 'diaar5', area(:,:) ) 380 area_tot = glob_sum( 'diaar5', e1e2t(:,:) ) 383 381 384 382 ALLOCATE( zvol0(jpi,jpj) ) … … 387 385 DO_3D_11_11( 1, jpkm1 ) 388 386 idep = tmask(ji,jj,jk) * e3t_0(ji,jj,jk) 389 zvol0 (ji,jj) = zvol0 (ji,jj) + idep * area(ji,jj)387 zvol0 (ji,jj) = zvol0 (ji,jj) + idep * e1e2t(ji,jj) 390 388 thick0(ji,jj) = thick0(ji,jj) + idep 391 389 END_3D -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DIA/diacfl.F90
r12622 r12724 53 53 ! 54 54 INTEGER :: ji, jj, jk ! dummy loop indices 55 REAL(wp) :: z 2dt, zCu_max, zCv_max, zCw_max! local scalars55 REAL(wp) :: zCu_max, zCv_max, zCw_max ! local scalars 56 56 INTEGER , DIMENSION(3) :: iloc_u , iloc_v , iloc_w , iloc ! workspace 57 57 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zCu_cfl, zCv_cfl, zCw_cfl ! workspace … … 60 60 IF( ln_timing ) CALL timing_start('dia_cfl') 61 61 ! 62 ! ! setup timestep multiplier to account for initial Eulerian timestep63 IF( neuler == 0 .AND. kt == nit000 ) THEN ; z2dt = rdt64 ELSE ; z2dt = rdt * 2._wp65 ENDIF66 !67 !68 62 DO_3D_11_11( 1, jpk ) 69 zCu_cfl(ji,jj,jk) = ABS( uu(ji,jj,jk,Kmm) ) * z2dt / e1u (ji,jj) ! for i-direction70 zCv_cfl(ji,jj,jk) = ABS( vv(ji,jj,jk,Kmm) ) * z2dt / e2v (ji,jj) ! for j-direction71 zCw_cfl(ji,jj,jk) = ABS( ww(ji,jj,jk) ) * z2dt / e3w(ji,jj,jk,Kmm) ! for k-direction63 zCu_cfl(ji,jj,jk) = ABS( uu(ji,jj,jk,Kmm) ) * rDt / e1u (ji,jj) ! for i-direction 64 zCv_cfl(ji,jj,jk) = ABS( vv(ji,jj,jk,Kmm) ) * rDt / e2v (ji,jj) ! for j-direction 65 zCw_cfl(ji,jj,jk) = ABS( ww(ji,jj,jk) ) * rDt / e3w(ji,jj,jk,Kmm) ! for k-direction 72 66 END_3D 73 67 ! … … 119 113 WRITE(numcfl,*) '******************************************' 120 114 WRITE(numcfl,FMT='(3x,a12,6x,f7.4,1x,i4,1x,i4,1x,i4)') 'Run Max Cu', rCu_max, nCu_loc(1), nCu_loc(2), nCu_loc(3) 121 WRITE(numcfl,FMT='(3x,a8,11x,f15.1)') ' => dt/C', z2dt/rCu_max115 WRITE(numcfl,FMT='(3x,a8,11x,f15.1)') ' => dt/C', rDt/rCu_max 122 116 WRITE(numcfl,*) '******************************************' 123 117 WRITE(numcfl,FMT='(3x,a12,6x,f7.4,1x,i4,1x,i4,1x,i4)') 'Run Max Cv', rCv_max, nCv_loc(1), nCv_loc(2), nCv_loc(3) 124 WRITE(numcfl,FMT='(3x,a8,11x,f15.1)') ' => dt/C', z2dt/rCv_max118 WRITE(numcfl,FMT='(3x,a8,11x,f15.1)') ' => dt/C', rDt/rCv_max 125 119 WRITE(numcfl,*) '******************************************' 126 120 WRITE(numcfl,FMT='(3x,a12,6x,f7.4,1x,i4,1x,i4,1x,i4)') 'Run Max Cw', rCw_max, nCw_loc(1), nCw_loc(2), nCw_loc(3) 127 WRITE(numcfl,FMT='(3x,a8,11x,f15.1)') ' => dt/C', z2dt/rCw_max121 WRITE(numcfl,FMT='(3x,a8,11x,f15.1)') ' => dt/C', rDt/rCw_max 128 122 CLOSE( numcfl ) 129 123 ! … … 132 126 WRITE(numout,*) 'dia_cfl : Maximum Courant number information for the run ' 133 127 WRITE(numout,*) '~~~~~~~' 134 WRITE(numout,*) ' Max Cu = ', rCu_max, ' at (i,j,k) = (',nCu_loc(1),nCu_loc(2),nCu_loc(3),') => dt/C = ', z2dt/rCu_max135 WRITE(numout,*) ' Max Cv = ', rCv_max, ' at (i,j,k) = (',nCv_loc(1),nCv_loc(2),nCv_loc(3),') => dt/C = ', z2dt/rCv_max136 WRITE(numout,*) ' Max Cw = ', rCw_max, ' at (i,j,k) = (',nCw_loc(1),nCw_loc(2),nCw_loc(3),') => dt/C = ', z2dt/rCw_max128 WRITE(numout,*) ' Max Cu = ', rCu_max, ' at (i,j,k) = (',nCu_loc(1),nCu_loc(2),nCu_loc(3),') => dt/C = ', rDt/rCu_max 129 WRITE(numout,*) ' Max Cv = ', rCv_max, ' at (i,j,k) = (',nCv_loc(1),nCv_loc(2),nCv_loc(3),') => dt/C = ', rDt/rCv_max 130 WRITE(numout,*) ' Max Cw = ', rCw_max, ' at (i,j,k) = (',nCw_loc(1),nCw_loc(2),nCw_loc(3),') => dt/C = ', rDt/rCw_max 137 131 ENDIF 138 132 ! -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DIA/diadct.F90
r12680 r12724 679 679 zsn = interp(Kmm,k%I,k%J,jk,'V',ts(:,:,:,jp_sal,Kmm) ) 680 680 zrhop = interp(Kmm,k%I,k%J,jk,'V',rhop) 681 zrhoi = interp(Kmm,k%I,k%J,jk,'V',rhd*r au0+rau0)681 zrhoi = interp(Kmm,k%I,k%J,jk,'V',rhd*rho0+rho0) 682 682 zsshn = 0.5*( ssh(k%I,k%J,Kmm) + ssh(k%I,k%J+1,Kmm) ) * vmask(k%I,k%J,1) 683 683 CASE(2,3) … … 685 685 zsn = interp(Kmm,k%I,k%J,jk,'U',ts(:,:,:,jp_sal,Kmm) ) 686 686 zrhop = interp(Kmm,k%I,k%J,jk,'U',rhop) 687 zrhoi = interp(Kmm,k%I,k%J,jk,'U',rhd*r au0+rau0)687 zrhoi = interp(Kmm,k%I,k%J,jk,'U',rhd*rho0+rho0) 688 688 zsshn = 0.5*( ssh(k%I,k%J,Kmm) + ssh(k%I+1,k%J,Kmm) ) * umask(k%I,k%J,1) 689 689 END SELECT … … 852 852 zsn = interp(Kmm,k%I,k%J,jk,'V',ts(:,:,:,jp_sal,Kmm) ) 853 853 zrhop = interp(Kmm,k%I,k%J,jk,'V',rhop) 854 zrhoi = interp(Kmm,k%I,k%J,jk,'V',rhd*r au0+rau0)854 zrhoi = interp(Kmm,k%I,k%J,jk,'V',rhd*rho0+rho0) 855 855 856 856 CASE(2,3) … … 858 858 zsn = interp(Kmm,k%I,k%J,jk,'U',ts(:,:,:,jp_sal,Kmm) ) 859 859 zrhop = interp(Kmm,k%I,k%J,jk,'U',rhop) 860 zrhoi = interp(Kmm,k%I,k%J,jk,'U',rhd*r au0+rau0)860 zrhoi = interp(Kmm,k%I,k%J,jk,'U',rhd*rho0+rho0) 861 861 zsshn = 0.5*( ssh(k%I,k%J,Kmm) + ssh(k%I+1,k%J,Kmm) ) * umask(k%I,k%J,1) 862 862 END SELECT -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DIA/diadetide.F90
r12377 r12724 9 9 USE in_out_manager , ONLY : lwp, numout 10 10 USE iom , ONLY : iom_put 11 USE dom_oce , ONLY : r dt, nsec_day11 USE dom_oce , ONLY : rn_Dt, nsec_day 12 12 USE phycst , ONLY : rpi 13 13 USE tide_mod … … 100 100 zwght = 0.0_wp 101 101 DO jn = 1, ndiadetide 102 ztmp = ( tdiadetide(jn) - REAL( nsec_day, KIND=wp ) ) / r dt102 ztmp = ( tdiadetide(jn) - REAL( nsec_day, KIND=wp ) ) / rn_Dt 103 103 IF ( ( ztmp < 0.5_wp ).AND.( ztmp >= -0.5_wp ) ) THEN 104 104 zwght = zwght + 1.0_wp / REAL( ndiadetide, KIND=wp ) -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DIA/diahsb.F90
r12680 r12724 93 93 ! 1 - Trends due to forcing ! 94 94 ! ------------------------- ! 95 z_frc_trd_v = r1_r au0 * glob_sum( 'diahsb', - ( emp(:,:) - rnf(:,:) + fwfisf_cav(:,:) + fwfisf_par(:,:) ) * surf(:,:) ) ! volume fluxes95 z_frc_trd_v = r1_rho0 * glob_sum( 'diahsb', - ( emp(:,:) - rnf(:,:) + fwfisf_cav(:,:) + fwfisf_par(:,:) ) * surf(:,:) ) ! volume fluxes 96 96 z_frc_trd_t = glob_sum( 'diahsb', sbc_tsc(:,:,jp_tem) * surf(:,:) ) ! heat fluxes 97 97 z_frc_trd_s = glob_sum( 'diahsb', sbc_tsc(:,:,jp_sal) * surf(:,:) ) ! salt fluxes … … 103 103 & + glob_sum( 'diahsb', ( risf_cav_tsc(:,:,jp_tem) + risf_par_tsc(:,:,jp_tem) ) * surf(:,:) ) 104 104 ! ! Add penetrative solar radiation 105 IF( ln_traqsr ) z_frc_trd_t = z_frc_trd_t + r1_r au0_rcp * glob_sum( 'diahsb', qsr (:,:) * surf(:,:) )105 IF( ln_traqsr ) z_frc_trd_t = z_frc_trd_t + r1_rho0_rcp * glob_sum( 'diahsb', qsr (:,:) * surf(:,:) ) 106 106 ! ! Add geothermal heat flux 107 107 IF( ln_trabbc ) z_frc_trd_t = z_frc_trd_t + glob_sum( 'diahsb', qgh_trd0(:,:) * surf(:,:) ) … … 123 123 ENDIF 124 124 125 frc_v = frc_v + z_frc_trd_v * r dt126 frc_t = frc_t + z_frc_trd_t * r dt127 frc_s = frc_s + z_frc_trd_s * r dt125 frc_v = frc_v + z_frc_trd_v * rn_Dt 126 frc_t = frc_t + z_frc_trd_t * rn_Dt 127 frc_s = frc_s + z_frc_trd_s * rn_Dt 128 128 ! ! Advection flux through fixed surface (z=0) 129 129 IF( ln_linssh ) THEN 130 frc_wn_t = frc_wn_t + z_wn_trd_t * r dt131 frc_wn_s = frc_wn_s + z_wn_trd_s * r dt130 frc_wn_t = frc_wn_t + z_wn_trd_t * rn_Dt 131 frc_wn_s = frc_wn_s + z_wn_trd_s * rn_Dt 132 132 ENDIF 133 133 … … 202 202 203 203 CALL iom_put( 'bgfrcvol' , frc_v * 1.e-9 ) ! vol - surface forcing (km3) 204 CALL iom_put( 'bgfrctem' , frc_t * r au0 * rcp * 1.e-20 ) ! hc - surface forcing (1.e20 J)205 CALL iom_put( 'bgfrchfx' , frc_t * r au0 * rcp / & ! hc - surface forcing (W/m2)206 & ( surf_tot * kt * r dt ) )204 CALL iom_put( 'bgfrctem' , frc_t * rho0 * rcp * 1.e-20 ) ! hc - surface forcing (1.e20 J) 205 CALL iom_put( 'bgfrchfx' , frc_t * rho0 * rcp / & ! hc - surface forcing (W/m2) 206 & ( surf_tot * kt * rn_Dt ) ) 207 207 CALL iom_put( 'bgfrcsal' , frc_s * 1.e-9 ) ! sc - surface forcing (psu*km3) 208 208 … … 210 210 CALL iom_put( 'bgtemper' , zdiff_hc / zvol_tot ) ! Temperature drift (C) 211 211 CALL iom_put( 'bgsaline' , zdiff_sc / zvol_tot ) ! Salinity drift (PSU) 212 CALL iom_put( 'bgheatco' , zdiff_hc * 1.e-20 * r au0 * rcp ) ! Heat content drift (1.e20 J)213 CALL iom_put( 'bgheatfx' , zdiff_hc * r au0 * rcp / & ! Heat flux drift (W/m2)214 & ( surf_tot * kt * r dt ) )212 CALL iom_put( 'bgheatco' , zdiff_hc * 1.e-20 * rho0 * rcp ) ! Heat content drift (1.e20 J) 213 CALL iom_put( 'bgheatfx' , zdiff_hc * rho0 * rcp / & ! Heat flux drift (W/m2) 214 & ( surf_tot * kt * rn_Dt ) ) 215 215 CALL iom_put( 'bgsaltco' , zdiff_sc * 1.e-9 ) ! Salt content drift (psu*km3) 216 216 CALL iom_put( 'bgvolssh' , zdiff_v1 * 1.e-9 ) ! volume ssh drift (km3) … … 230 230 CALL iom_put( 'bgtemper' , zdiff_hc1 / zvol_tot) ! Heat content drift (C) 231 231 CALL iom_put( 'bgsaline' , zdiff_sc1 / zvol_tot) ! Salt content drift (PSU) 232 CALL iom_put( 'bgheatco' , zdiff_hc1 * 1.e-20 * r au0 * rcp ) ! Heat content drift (1.e20 J)233 CALL iom_put( 'bgheatfx' , zdiff_hc1 * r au0 * rcp / & ! Heat flux drift (W/m2)234 & ( surf_tot * kt * r dt ) )232 CALL iom_put( 'bgheatco' , zdiff_hc1 * 1.e-20 * rho0 * rcp ) ! Heat content drift (1.e20 J) 233 CALL iom_put( 'bgheatfx' , zdiff_hc1 * rho0 * rcp / & ! Heat flux drift (W/m2) 234 & ( surf_tot * kt * rn_Dt ) ) 235 235 CALL iom_put( 'bgsaltco' , zdiff_sc1 * 1.e-9 ) ! Salt content drift (psu*km3) 236 236 CALL iom_put( 'bgvolssh' , zdiff_v1 * 1.e-9 ) ! volume ssh drift (km3) -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DIA/diahth.F90
r12622 r12724 262 262 zzdep = 300. 263 263 CALL dia_hth_htc( Kmm, zzdep, ts(:,:,:,jp_tem,Kmm), htc3 ) 264 CALL iom_put( 'hc300', r au0_rcp * htc3 ) ! vertically integrated heat content (J/m2)264 CALL iom_put( 'hc300', rho0_rcp * htc3 ) ! vertically integrated heat content (J/m2) 265 265 ENDIF 266 266 ! … … 271 271 zzdep = 700. 272 272 CALL dia_hth_htc( Kmm, zzdep, ts(:,:,:,jp_tem,Kmm), htc7 ) 273 CALL iom_put( 'hc700', r au0_rcp * htc7 ) ! vertically integrated heat content (J/m2)273 CALL iom_put( 'hc700', rho0_rcp * htc7 ) ! vertically integrated heat content (J/m2) 274 274 275 275 ENDIF … … 281 281 zzdep = 2000. 282 282 CALL dia_hth_htc( Kmm, zzdep, ts(:,:,:,jp_tem,Kmm), htc20 ) 283 CALL iom_put( 'hc2000', r au0_rcp * htc20 ) ! vertically integrated heat content (J/m2)283 CALL iom_put( 'hc2000', rho0_rcp * htc20 ) ! vertically integrated heat content (J/m2) 284 284 ENDIF 285 285 ! -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DIA/diamlr.F90
r12680 r12724 87 87 INTEGER :: itide ! Number of available tidal components 88 88 REAL(wp) :: ztide_phase ! Tidal-constituent phase at adatrj=0 89 CHARACTER (LEN=4), DIMENSION(jpmax_harmo) :: ctide_selected = ' 89 CHARACTER (LEN=4), DIMENSION(jpmax_harmo) :: ctide_selected = 'n/a ' 90 90 TYPE(tide_harmonic), DIMENSION(:), POINTER :: stideconst 91 91 … … 148 148 ! Retrieve information (frequency, phase, nodal correction) about all 149 149 ! available tidal constituents for placeholder substitution below 150 ctide_selected(1:34) = (/ 'Mf ', 'Mm ', 'Ssa ', 'Mtm ', 'Msf ', & 151 & 'Msqm', 'Sa ', 'K1 ', 'O1 ', 'P1 ', & 152 & 'Q1 ', 'J1 ', 'S1 ', 'M2 ', 'S2 ', 'N2 ', & 153 & 'K2 ', 'nu2 ', 'mu2 ', '2N2 ', 'L2 ', & 154 & 'T2 ', 'eps2', 'lam2', 'R2 ', 'M3 ', & 155 & 'MKS2', 'MN4 ', 'MS4 ', 'M4 ', 'N4 ', & 156 & 'S4 ', 'M6 ', 'M8 ' /) 150 ! Warning: we must use the same character length in an array constructor (at least for gcc compiler) 151 ctide_selected(1:34) = (/ 'Mf ', 'Mm ', 'Ssa ', 'Mtm ', 'Msf ', & 152 & 'Msqm', 'Sa ', 'K1 ', 'O1 ', 'P1 ', & 153 & 'Q1 ', 'J1 ', 'S1 ', 'M2 ', 'S2 ', 'N2 ', & 154 & 'K2 ', 'nu2 ', 'mu2 ', '2N2 ', 'L2 ', & 155 & 'T2 ', 'eps2', 'lam2', 'R2 ', 'M3 ', & 156 & 'MKS2', 'MN4 ', 'MS4 ', 'M4 ', 'N4 ', & 157 & 'S4 ', 'M6 ', 'M8 ' /) 157 158 CALL tide_init_harmonics(ctide_selected, stideconst) 158 159 itide = size(stideconst) -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DIA/dianam.F90
r10068 r12724 72 72 73 73 IF( llfsec .OR. kfreq < 0 ) THEN ; inbsec = kfreq ! output frequency already in seconds 74 ELSE ; inbsec = kfreq * NINT( r dt ) ! from time-step to seconds74 ELSE ; inbsec = kfreq * NINT( rn_Dt ) ! from time-step to seconds 75 75 ENDIF 76 76 iddss = NINT( rday ) ! number of seconds in 1 day … … 116 116 ! date of the beginning and the end of the run 117 117 118 zdrun = r dt / rday * REAL( nitend - nit000, wp ) ! length of the run in days119 zjul = fjulday - r dt / rday118 zdrun = rn_Dt / rday * REAL( nitend - nit000, wp ) ! length of the run in days 119 zjul = fjulday - rn_Dt / rday 120 120 CALL ju2ymds( zjul , iyear1, imonth1, iday1, zsec1 ) ! year/month/day of the beginning of run 121 121 CALL ju2ymds( zjul + zdrun, iyear2, imonth2, iday2, zsec2 ) ! year/month/day of the end of run -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DIA/diaptr.F90
r12680 r12724 50 50 51 51 REAL(wp) :: rc_sv = 1.e-6_wp ! conversion from m3/s to Sverdrup 52 REAL(wp) :: rc_pwatt = 1.e-15_wp ! conversion from W to PW (further x r au0 x Cp)53 REAL(wp) :: rc_ggram = 1.e-9_wp ! conversion from g to Gg (further x r au0)52 REAL(wp) :: rc_pwatt = 1.e-15_wp ! conversion from W to PW (further x rho0 x Cp) 53 REAL(wp) :: rc_ggram = 1.e-9_wp ! conversion from g to Gg (further x rho0) 54 54 55 55 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: btmsk ! T-point basin interior masks … … 348 348 IF( dia_ptr_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'dia_ptr_init : unable to allocate arrays' ) 349 349 350 rc_pwatt = rc_pwatt * r au0_rcp ! conversion from K.s-1 to PetaWatt351 rc_ggram = rc_ggram * r au0 ! conversion from m3/s to Gg/s350 rc_pwatt = rc_pwatt * rho0_rcp ! conversion from K.s-1 to PetaWatt 351 rc_ggram = rc_ggram * rho0 ! conversion from m3/s to Gg/s 352 352 353 353 IF( lk_mpp ) CALL mpp_ini_znl( numout ) ! Define MPI communicator for zonal sum -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DIA/diawri.F90
r12680 r12724 193 193 194 194 IF ( iom_use("taubot") ) THEN ! bottom stress 195 zztmp = r au0 * 0.25195 zztmp = rho0 * 0.25 196 196 z2d(:,:) = 0._wp 197 197 DO_2D_00_00 … … 232 232 IF( iom_use('w_masstr') .OR. iom_use('w_masstr2') ) THEN ! vertical mass transport & its square value 233 233 ! Caution: in the VVL case, it only correponds to the baroclinic mass transport. 234 z2d(:,:) = r au0 * e1e2t(:,:)234 z2d(:,:) = rho0 * e1e2t(:,:) 235 235 DO jk = 1, jpk 236 236 z3d(:,:,jk) = ww(:,:,jk) * z2d(:,:) … … 269 269 z2d(ji,jj) = z2d(ji,jj) + e3t(ji,jj,jk,Kmm) * ts(ji,jj,jk,jp_tem,Kmm) * tmask(ji,jj,jk) 270 270 END_3D 271 CALL iom_put( "heatc", r au0_rcp * z2d ) ! vertically integrated heat content (J/m2)271 CALL iom_put( "heatc", rho0_rcp * z2d ) ! vertically integrated heat content (J/m2) 272 272 ENDIF 273 273 … … 277 277 z2d(ji,jj) = z2d(ji,jj) + e3t(ji,jj,jk,Kmm) * ts(ji,jj,jk,jp_sal,Kmm) * tmask(ji,jj,jk) 278 278 END_3D 279 CALL iom_put( "saltc", r au0 * z2d ) ! vertically integrated salt content (PSU*kg/m2)279 CALL iom_put( "saltc", rho0 * z2d ) ! vertically integrated salt content (PSU*kg/m2) 280 280 ENDIF 281 281 ! … … 299 299 z2d(:,:) = 0.e0 300 300 DO jk = 1, jpkm1 301 z3d(:,:,jk) = r au0 * uu(:,:,jk,Kmm) * e2u(:,:) * e3u(:,:,jk,Kmm) * umask(:,:,jk)301 z3d(:,:,jk) = rho0 * uu(:,:,jk,Kmm) * e2u(:,:) * e3u(:,:,jk,Kmm) * umask(:,:,jk) 302 302 z2d(:,:) = z2d(:,:) + z3d(:,:,jk) 303 303 END DO … … 328 328 z3d(:,:,jpk) = 0.e0 329 329 DO jk = 1, jpkm1 330 z3d(:,:,jk) = r au0 * vv(:,:,jk,Kmm) * e1v(:,:) * e3v(:,:,jk,Kmm) * vmask(:,:,jk)330 z3d(:,:,jk) = rho0 * vv(:,:,jk,Kmm) * e1v(:,:) * e3v(:,:,jk,Kmm) * vmask(:,:,jk) 331 331 END DO 332 332 CALL iom_put( "v_masstr", z3d ) ! mass transport in j-direction … … 357 357 END_3D 358 358 CALL lbc_lnk( 'diawri', z2d, 'T', -1. ) 359 CALL iom_put( "tosmint", r au0 * z2d ) ! Vertical integral of temperature359 CALL iom_put( "tosmint", rho0 * z2d ) ! Vertical integral of temperature 360 360 ENDIF 361 361 IF( iom_use("somint") ) THEN … … 365 365 END_3D 366 366 CALL lbc_lnk( 'diawri', z2d, 'T', -1. ) 367 CALL iom_put( "somint", r au0 * z2d ) ! Vertical integral of salinity367 CALL iom_put( "somint", rho0 * z2d ) ! Vertical integral of salinity 368 368 ENDIF 369 369 … … 386 386 INTEGER, DIMENSION(2) :: ierr 387 387 !!---------------------------------------------------------------------- 388 ierr = 0 389 ALLOCATE( ndex_hT(jpi*jpj) , ndex_T(jpi*jpj*jpk) , & 390 & ndex_hU(jpi*jpj) , ndex_U(jpi*jpj*jpk) , & 391 & ndex_hV(jpi*jpj) , ndex_V(jpi*jpj*jpk) , STAT=ierr(1) ) 388 IF( nn_write == -1 ) THEN 389 dia_wri_alloc = 0 390 ELSE 391 ierr = 0 392 ALLOCATE( ndex_hT(jpi*jpj) , ndex_T(jpi*jpj*jpk) , & 393 & ndex_hU(jpi*jpj) , ndex_U(jpi*jpj*jpk) , & 394 & ndex_hV(jpi*jpj) , ndex_V(jpi*jpj*jpk) , STAT=ierr(1) ) 392 395 ! 393 dia_wri_alloc = MAXVAL(ierr) 394 CALL mpp_sum( 'diawri', dia_wri_alloc ) 396 dia_wri_alloc = MAXVAL(ierr) 397 CALL mpp_sum( 'diawri', dia_wri_alloc ) 398 ! 399 ENDIF 395 400 ! 396 401 END FUNCTION dia_wri_alloc … … 452 457 clop = "x" ! no use of the mask value (require less cpu time and otherwise the model crashes) 453 458 #if defined key_diainstant 454 zsto = nn_write * r dt459 zsto = nn_write * rn_Dt 455 460 clop = "inst("//TRIM(clop)//")" 456 461 #else 457 zsto=r dt462 zsto=rn_Dt 458 463 clop = "ave("//TRIM(clop)//")" 459 464 #endif 460 zout = nn_write * r dt461 zmax = ( nitend - nit000 + 1 ) * r dt465 zout = nn_write * rn_Dt 466 zmax = ( nitend - nit000 + 1 ) * rn_Dt 462 467 463 468 ! Define indices of the horizontal output zoom and vertical limit storage … … 485 490 486 491 ! Compute julian date from starting date of the run 487 CALL ymds2ju( nyear, nmonth, nday, r dt, zjulian )492 CALL ymds2ju( nyear, nmonth, nday, rn_Dt, zjulian ) 488 493 zjulian = zjulian - adatrj ! set calendar origin to the beginning of the experiment 489 494 IF(lwp)WRITE(numout,*) … … 507 512 CALL histbeg( clhstnam, jpi, glamt, jpj, gphit, & ! Horizontal grid: glamt and gphit 508 513 & iimi, iima-iimi+1, ijmi, ijma-ijmi+1, & 509 & nit000-1, zjulian, r dt, nh_T, nid_T, domain_id=nidom, snc4chunks=snc4set )514 & nit000-1, zjulian, rn_Dt, nh_T, nid_T, domain_id=nidom, snc4chunks=snc4set ) 510 515 CALL histvert( nid_T, "deptht", "Vertical T levels", & ! Vertical grid: gdept 511 516 & "m", ipk, gdept_1d, nz_T, "down" ) … … 543 548 CALL histbeg( clhstnam, jpi, glamu, jpj, gphiu, & ! Horizontal grid: glamu and gphiu 544 549 & iimi, iima-iimi+1, ijmi, ijma-ijmi+1, & 545 & nit000-1, zjulian, r dt, nh_U, nid_U, domain_id=nidom, snc4chunks=snc4set )550 & nit000-1, zjulian, rn_Dt, nh_U, nid_U, domain_id=nidom, snc4chunks=snc4set ) 546 551 CALL histvert( nid_U, "depthu", "Vertical U levels", & ! Vertical grid: gdept 547 552 & "m", ipk, gdept_1d, nz_U, "down" ) … … 556 561 CALL histbeg( clhstnam, jpi, glamv, jpj, gphiv, & ! Horizontal grid: glamv and gphiv 557 562 & iimi, iima-iimi+1, ijmi, ijma-ijmi+1, & 558 & nit000-1, zjulian, r dt, nh_V, nid_V, domain_id=nidom, snc4chunks=snc4set )563 & nit000-1, zjulian, rn_Dt, nh_V, nid_V, domain_id=nidom, snc4chunks=snc4set ) 559 564 CALL histvert( nid_V, "depthv", "Vertical V levels", & ! Vertical grid : gdept 560 565 & "m", ipk, gdept_1d, nz_V, "down" ) … … 569 574 CALL histbeg( clhstnam, jpi, glamt, jpj, gphit, & ! Horizontal grid: glamt and gphit 570 575 & iimi, iima-iimi+1, ijmi, ijma-ijmi+1, & 571 & nit000-1, zjulian, r dt, nh_W, nid_W, domain_id=nidom, snc4chunks=snc4set )576 & nit000-1, zjulian, rn_Dt, nh_W, nid_W, domain_id=nidom, snc4chunks=snc4set ) 572 577 CALL histvert( nid_W, "depthw", "Vertical W levels", & ! Vertical grid: gdepw 573 578 & "m", ipk, gdepw_1d, nz_W, "down" ) … … 579 584 CALL histbeg( clhstnam, jpi, glamt, jpj, gphit, & ! Horizontal grid: glamt and gphit 580 585 & iimi, iima-iimi+1, ijmi, ijma-ijmi+1, & 581 & nit000-1, zjulian, r dt, nh_A, nid_A, domain_id=nidom, snc4chunks=snc4set )586 & nit000-1, zjulian, rn_Dt, nh_A, nid_A, domain_id=nidom, snc4chunks=snc4set ) 582 587 CALL histvert( nid_A, "ght_abl", "Vertical T levels", & ! Vertical grid: gdept 583 588 & "m", ipka, ght_abl(2:jpka), nz_A, "up" ) … … 953 958 END DO 954 959 ! 955 #if defined key_si3 956 CALL iom_open( TRIM(cdfile_name), inum, ldwrt = .TRUE., kdlev = jpl ) 957 #else 958 CALL iom_open( TRIM(cdfile_name), inum, ldwrt = .TRUE. ) 959 #endif 960 960 CALL iom_open( TRIM(cdfile_name), inum, ldwrt = .TRUE. ) 961 ! 961 962 CALL iom_rstput( 0, 0, inum, 'votemper', ts(:,:,:,jp_tem,Kmm) ) ! now temperature 962 963 CALL iom_rstput( 0, 0, inum, 'vosaline', ts(:,:,:,jp_sal,Kmm) ) ! now salinity … … 971 972 CALL iom_rstput( 0, 0, inum, 'risfdep', risfdep ) ! now k-velocity 972 973 CALL iom_rstput( 0, 0, inum, 'ht' , ht ) ! now water column height 973 974 ! 974 975 IF ( ln_isf ) THEN 975 976 IF (ln_isfcav_mlt) THEN … … 977 978 CALL iom_rstput( 0, 0, inum, 'rhisf_cav_tbl', rhisf_tbl_cav ) ! now k-velocity 978 979 CALL iom_rstput( 0, 0, inum, 'rfrac_cav_tbl', rfrac_tbl_cav ) ! now k-velocity 979 CALL iom_rstput( 0, 0, inum, 'misfkb_cav', REAL(misfkb_cav, 8)) ! now k-velocity980 CALL iom_rstput( 0, 0, inum, 'misfkt_cav', REAL(misfkt_cav, 8)) ! now k-velocity981 CALL iom_rstput( 0, 0, inum, 'mskisf_cav', REAL(mskisf_cav, 8), ktype = jp_i1 )980 CALL iom_rstput( 0, 0, inum, 'misfkb_cav', REAL(misfkb_cav,wp) ) ! now k-velocity 981 CALL iom_rstput( 0, 0, inum, 'misfkt_cav', REAL(misfkt_cav,wp) ) ! now k-velocity 982 CALL iom_rstput( 0, 0, inum, 'mskisf_cav', REAL(mskisf_cav,wp), ktype = jp_i1 ) 982 983 END IF 983 984 IF (ln_isfpar_mlt) THEN 984 CALL iom_rstput( 0, 0, inum, 'isfmsk_par', REAL(mskisf_par, 8)) ! now k-velocity985 CALL iom_rstput( 0, 0, inum, 'isfmsk_par', REAL(mskisf_par,wp) ) ! now k-velocity 985 986 CALL iom_rstput( 0, 0, inum, 'fwfisf_par', fwfisf_par ) ! now k-velocity 986 987 CALL iom_rstput( 0, 0, inum, 'rhisf_par_tbl', rhisf_tbl_par ) ! now k-velocity 987 988 CALL iom_rstput( 0, 0, inum, 'rfrac_par_tbl', rfrac_tbl_par ) ! now k-velocity 988 CALL iom_rstput( 0, 0, inum, 'misfkb_par', REAL(misfkb_par, 8)) ! now k-velocity989 CALL iom_rstput( 0, 0, inum, 'misfkt_par', REAL(misfkt_par, 8)) ! now k-velocity990 CALL iom_rstput( 0, 0, inum, 'mskisf_par', REAL(mskisf_par, 8), ktype = jp_i1 )989 CALL iom_rstput( 0, 0, inum, 'misfkb_par', REAL(misfkb_par,wp) ) ! now k-velocity 990 CALL iom_rstput( 0, 0, inum, 'misfkt_par', REAL(misfkt_par,wp) ) ! now k-velocity 991 CALL iom_rstput( 0, 0, inum, 'mskisf_par', REAL(mskisf_par,wp), ktype = jp_i1 ) 991 992 END IF 992 993 END IF 993 994 ! 994 995 IF( ALLOCATED(ahtu) ) THEN 995 996 CALL iom_rstput( 0, 0, inum, 'ahtu', ahtu ) ! aht at u-point … … 1021 1022 CALL iom_rstput ( 0, 0, inum, "qz1_abl", tq_abl(:,:,2,nt_a,2) ) ! now first level humidity 1022 1023 ENDIF 1023 1024 ! 1025 CALL iom_close( inum ) 1026 ! 1024 1027 #if defined key_si3 1025 1028 IF( nn_ice == 2 ) THEN ! condition needed in case agrif + ice-model but no-ice in child grid 1029 CALL iom_open( TRIM(cdfile_name)//'_ice', inum, ldwrt = .TRUE., kdlev = jpl, cdcomp = 'ICE' ) 1026 1030 CALL ice_wri_state( inum ) 1031 CALL iom_close( inum ) 1027 1032 ENDIF 1028 1033 #endif 1029 ! 1030 CALL iom_close( inum ) 1031 ! 1034 1032 1035 END SUBROUTINE dia_wri_state 1033 1036 -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DIU/diu_coolskin.F90
r12377 r12724 67 67 68 68 69 SUBROUTINE diurnal_sst_coolskin_step(psqflux, pstauflux, psrho, rdt)69 SUBROUTINE diurnal_sst_coolskin_step(psqflux, pstauflux, psrho, pDt) 70 70 !!---------------------------------------------------------------------- 71 71 !! *** ROUTINE diurnal_sst_takaya_step *** … … 81 81 REAL(wp), INTENT(IN), DIMENSION(jpi,jpj) :: pstauflux ! Wind stress (kg/ m s^2) 82 82 REAL(wp), INTENT(IN), DIMENSION(jpi,jpj) :: psrho ! Water density (kg/m^3) 83 REAL(wp), INTENT(IN) :: rdt ! Time-step83 REAL(wp), INTENT(IN) :: pDt ! Time-step 84 84 85 85 ! Local variables -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DIU/diu_layers.F90
r12377 r12724 39 39 ! Cool skin 40 40 41 CALL diurnal_sst_coolskin_step( qns, taum, rhop(:,:,1), r dt)41 CALL diurnal_sst_coolskin_step( qns, taum, rhop(:,:,1), rn_Dt) 42 42 43 43 CALL iom_put( "sst_wl" , x_dsst ) ! warm layer (write out before update below). … … 45 45 46 46 ! Diurnal warm layer model 47 CALL diurnal_sst_takaya_step( kstp, qsr, qns, taum, rhop(:,:,1), r dt)47 CALL diurnal_sst_takaya_step( kstp, qsr, qns, taum, rhop(:,:,1), rn_Dt) 48 48 49 49 END SUBROUTINE diurnal_layers -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DOM/daymod.F90
r12377 r12724 20 20 !! ------------------------------- 21 21 !! sbcmod assume that the time step is dividing the number of second of 22 !! in a day, i.e. ===> MOD( rday, r dt ) == 022 !! in a day, i.e. ===> MOD( rday, rn_Dt ) == 0 23 23 !! except when user defined forcing is used (see sbcmod.F90) 24 24 !!---------------------------------------------------------------------- … … 73 73 ! 74 74 ! max number of seconds between each restart 75 IF( REAL( nitend - nit000 + 1 ) * r dt > REAL( HUGE( nsec1jan000 ) ) ) THEN75 IF( REAL( nitend - nit000 + 1 ) * rn_Dt > REAL( HUGE( nsec1jan000 ) ) ) THEN 76 76 CALL ctl_stop( 'The number of seconds between each restart exceeds the integer 4 max value: 2^31-1. ', & 77 77 & 'You must do a restart at higher frequency (or remove this stop and recompile the code in I8)' ) … … 79 79 nsecd = NINT( rday ) 80 80 nsecd05 = NINT( 0.5 * rday ) 81 ndt = NINT( r dt )82 ndt05 = NINT( 0.5 * r dt )81 ndt = NINT( rn_Dt ) 82 ndt05 = NINT( 0.5 * rn_Dt ) 83 83 84 84 IF( .NOT. l_offline ) CALL day_rst( nit000, 'READ' ) … … 239 239 nsec_monday = nsec_monday + ndt 240 240 nsec_day = nsec_day + ndt 241 adatrj = adatrj + r dt / rday242 fjulday = fjulday + r dt / rday241 adatrj = adatrj + rn_Dt / rday 242 fjulday = fjulday + rn_Dt / rday 243 243 IF( ABS(fjulday - REAL(NINT(fjulday),wp)) < zprec ) fjulday = REAL(NINT(fjulday),wp) ! avoid truncation error 244 244 IF( ABS(adatrj - REAL(NINT(adatrj ),wp)) < zprec ) adatrj = REAL(NINT(adatrj ),wp) ! avoid truncation error … … 309 309 !! In both those options, the exact duration of the experiment 310 310 !! since the beginning (cumulated duration of all previous restart runs) 311 !! is not stored in the restart and is assumed to be (nit000-1)*r dt.311 !! is not stored in the restart and is assumed to be (nit000-1)*rn_Dt. 312 312 !! This is valid is the time step has remained constant. 313 313 !! … … 379 379 isecond = ( nhour * NINT(rhhmm) + nminute ) * NINT(rmmss) 380 380 IF( isecond - ndt05 .lt. 0 ) ndastp = ndastp - 1 ! Start hour is specified in the namelist (default 0) 381 adatrj = ( REAL( nit000-1, wp ) * r dt ) / rday381 adatrj = ( REAL( nit000-1, wp ) * rn_Dt ) / rday 382 382 ! note this is wrong if time step has changed during run 383 383 ENDIF … … 389 389 isecond = ( nhour * NINT(rhhmm) + nminute ) * NINT(rmmss) 390 390 IF( isecond - ndt05 .LT. 0 ) ndastp = ndastp - 1 ! Start hour is specified in the namelist (default 0) 391 adatrj = ( REAL( nit000-1, wp ) * r dt ) / rday391 adatrj = ( REAL( nit000-1, wp ) * rn_Dt ) / rday 392 392 ENDIF 393 393 IF( ABS(adatrj - REAL(NINT(adatrj),wp)) < 0.1 / rday ) adatrj = REAL(NINT(adatrj),wp) ! avoid truncation error -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DOM/dom_oce.F90
r12680 r12724 33 33 LOGICAL , PUBLIC :: ln_linssh !: =T linear free surface ==>> model level are fixed in time 34 34 LOGICAL , PUBLIC :: ln_meshmask !: =T create a mesh-mask file (mesh_mask.nc) 35 REAL(wp), PUBLIC :: rn_ rdt!: time step for the dynamics and tracer35 REAL(wp), PUBLIC :: rn_Dt !: time step for the dynamics and tracer 36 36 REAL(wp), PUBLIC :: rn_atfp !: asselin time filter parameter 37 INTEGER , PUBLIC :: nn_euler !: =0 start with forward time step or not (=1)37 LOGICAL , PUBLIC :: ln_1st_euler !: =T start with forward time step or not (=F) 38 38 LOGICAL , PUBLIC :: ln_crs !: Apply grid coarsening to dynamical model output or online passive tracers 39 39 … … 49 49 LOGICAL, PUBLIC :: ln_bt_auto !: Set number of barotropic iterations automatically 50 50 INTEGER, PUBLIC :: nn_bt_flt !: Filter choice 51 INTEGER, PUBLIC :: nn_ baro !: Number of barotropic iterations during one baroclinic step (rdt)51 INTEGER, PUBLIC :: nn_e !: Number of barotropic iterations during one baroclinic step (rn_Dt) 52 52 REAL(wp), PUBLIC :: rn_bt_cmax !: Maximum allowed courant number (used if ln_bt_auto=T) 53 53 REAL(wp), PUBLIC :: rn_bt_alpha !: Time stepping diffusion parameter 54 54 55 55 56 ! !! old non-DOCTOR names still used in the model57 REAL(wp), PUBLIC :: atfp !: asselin time filter parameter58 REAL(wp), PUBLIC :: rdt !: time step for the dynamics and tracer59 60 56 ! !!! associated variables 61 INTEGER , PUBLIC :: neuler !: restart euler forward option (0=Euler) 62 REAL(wp), PUBLIC :: r2dt !: = 2*rdt except at nit000 (=rdt) if neuler=0 57 LOGICAL , PUBLIC :: l_1st_euler !: Euler 1st time-step flag (=T if ln_restart=F or ln_1st_euler=T) 58 REAL(wp), PUBLIC :: rDt, r1_Dt !: Current model timestep and reciprocal 59 !: rDt = 2 * rn_Dt if leapfrog and l_1st_euler = F 60 !: = rn_Dt if leapfrog and l_1st_euler = T 61 !: = rn_Dt if RK3 63 62 64 63 !!---------------------------------------------------------------------- -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DOM/domain.F90
r12680 r12724 309 309 & nn_no , cn_exp , cn_ocerst_in, cn_ocerst_out, ln_rstart , nn_rstctl , & 310 310 & nn_it000, nn_itend , nn_date0 , nn_time0 , nn_leapy , nn_istate , & 311 & nn_stock, nn_write , ln_mskland , ln_clobber , nn_chunksz, nn_euler ,&311 & nn_stock, nn_write , ln_mskland , ln_clobber , nn_chunksz, ln_1st_euler , & 312 312 & ln_cfmeta, ln_xios_read, nn_wxios 313 NAMELIST/namdom/ ln_linssh, rn_ rdt, rn_atfp, ln_crs, ln_meshmask313 NAMELIST/namdom/ ln_linssh, rn_Dt, rn_atfp, ln_crs, ln_meshmask 314 314 #if defined key_netcdf4 315 315 NAMELIST/namnc4/ nn_nchunks_i, nn_nchunks_j, nn_nchunks_k, ln_nc4zip … … 339 339 WRITE(numout,*) ' restart output directory cn_ocerst_outdir= ', TRIM( cn_ocerst_outdir ) 340 340 WRITE(numout,*) ' restart logical ln_rstart = ', ln_rstart 341 WRITE(numout,*) ' start with forward time step nn_euler = ', nn_euler341 WRITE(numout,*) ' start with forward time step ln_1st_euler = ', ln_1st_euler 342 342 WRITE(numout,*) ' control of time step nn_rstctl = ', nn_rstctl 343 343 WRITE(numout,*) ' number of the first time step nn_it000 = ', nn_it000 … … 375 375 nleapy = nn_leapy 376 376 ninist = nn_istate 377 neuler = nn_euler378 IF( neuler == 1.AND. .NOT. ln_rstart ) THEN377 l_1st_euler = ln_1st_euler 378 IF( .NOT. l_1st_euler .AND. .NOT. ln_rstart ) THEN 379 379 IF(lwp) WRITE(numout,*) 380 380 IF(lwp) WRITE(numout,*)' ==>>> Start from rest (ln_rstart=F)' 381 IF(lwp) WRITE(numout,*)' an Euler initial time step is used : nn_euler is forced to 0 '382 neuler = 0381 IF(lwp) WRITE(numout,*)' an Euler initial time step is used : l_1st_euler is forced to .true. ' 382 l_1st_euler = .true. 383 383 ENDIF 384 384 ! ! control of output frequency … … 430 430 WRITE(numout,*) ' linear free surface (=T) ln_linssh = ', ln_linssh 431 431 WRITE(numout,*) ' create mesh/mask file ln_meshmask = ', ln_meshmask 432 WRITE(numout,*) ' ocean time step rn_ rdt = ', rn_rdt432 WRITE(numout,*) ' ocean time step rn_Dt = ', rn_Dt 433 433 WRITE(numout,*) ' asselin time filter parameter rn_atfp = ', rn_atfp 434 434 WRITE(numout,*) ' online coarsening of dynamical fields ln_crs = ', ln_crs 435 435 ENDIF 436 436 ! 437 ! ! conversion DOCTOR names into model names (this should disappear soon)438 atfp = rn_atfp439 r dt = rn_rdt437 !! Initialise current model timestep rDt = 2*rn_Dt if MLF or rDt = rn_Dt if RK3 438 rDt = 2._wp * rn_Dt 439 r1_Dt = 1._wp / rDt 440 440 441 441 IF( TRIM(Agrif_CFixed()) == '0' ) THEN -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DOM/domqe.F90
r12680 r12724 556 556 ! 557 557 IF( ln_dynadv_vec ) THEN !- Vector Form (thickness weighted averaging) 558 DO_2D_ 11_11558 DO_2D_00_00 559 559 pr3u(ji,jj) = 0.5_wp * ( e1e2t(ji ,jj) * pssh(ji ,jj) & 560 560 & + e1e2t(ji+1,jj) * pssh(ji+1,jj) ) * r1_hu_0(ji,jj) * r1_e1e2u(ji,jj) … … 563 563 END_2D 564 564 ELSE !- Flux Form (simple averaging) 565 DO_2D_ 11_11565 DO_2D_00_00 566 566 pr3u(ji,jj) = 0.5_wp * ( pssh(ji ,jj) + pssh(ji+1,jj) ) * r1_hu_0(ji,jj) 567 567 pr3v(ji,jj) = 0.5_wp * ( pssh(ji,jj ) + pssh(ji,jj+1) ) * r1_hv_0(ji,jj) … … 576 576 ! 577 577 IF( ln_dynadv_vec ) THEN !- Vector Form (thickness weighted averaging) 578 DO_2D_ 01_01! start from 1 since lbc_lnk('F') doesn't update the 1st row/line578 DO_2D_10_10 ! start from 1 since lbc_lnk('F') doesn't update the 1st row/line 579 579 pr3f(ji,jj) = 0.25_wp * ( e1e2t(ji ,jj ) * pssh(ji ,jj ) & 580 580 & + e1e2t(ji+1,jj ) * pssh(ji+1,jj ) & … … 583 583 END_2D 584 584 ELSE !- Flux Form (simple averaging) 585 DO_2D_ 01_01! start from 1 since lbc_lnk('F') doesn't update the 1st row/line585 DO_2D_10_10 ! start from 1 since lbc_lnk('F') doesn't update the 1st row/line 586 586 pr3f(ji,jj) = 0.25_wp * ( pssh(ji ,jj ) + pssh(ji+1,jj ) & 587 587 & + pssh(ji ,jj+1) + pssh(ji+1,jj+1) ) * r1_hf_0(ji,jj) … … 632 632 ssh(:,:,Kbb) = 0._wp 633 633 END WHERE 634 IF( neuler == 0) THEN634 IF( l_1st_euler ) THEN 635 635 ssh(:,:,Kbb) = ssh(:,:,Kmm) 636 636 ENDIF … … 641 641 CALL iom_get( numror, jpdom_autoglo, 'sshb', ssh(:,:,Kbb), ldxios = lrxios ) 642 642 ssh(:,:,Kmm) = ssh(:,:,Kbb) 643 neuler = 0643 l_1st_euler = .TRUE. 644 644 ELSE IF( id2 > 0 ) THEN 645 645 IF(lwp) write(numout,*) 'qe_rst_read WARNING : ssh(:,:,Kbb) not found in restart files' … … 648 648 CALL iom_get( numror, jpdom_autoglo, 'sshn', ssh(:,:,Kmm), ldxios = lrxios ) 649 649 ssh(:,:,Kbb) = ssh(:,:,Kmm) 650 neuler = 0650 l_1st_euler = .TRUE. 651 651 ELSE 652 652 IF(lwp) write(numout,*) 'qe_rst_read WARNING : ssh(:,:,Kmm) not found in restart file' … … 654 654 IF(lwp) write(numout,*) 'neuler is forced to 0' 655 655 ssh(:,:,:) = 0._wp 656 neuler = 0656 l_1st_euler = .TRUE. 657 657 ENDIF 658 658 ! … … 741 741 WRITE(numout,*) ' rn_rst_e3t = 0.e0' 742 742 WRITE(numout,*) ' hard-wired : z-tilde cutoff frequency of low-pass filter (days)' 743 WRITE(numout,*) ' rn_lf_cutoff = 1.0/r dt'743 WRITE(numout,*) ' rn_lf_cutoff = 1.0/rn_Dt' 744 744 ELSE 745 745 WRITE(numout,*) ' z-tilde to zstar restoration timescale (days) rn_rst_e3t = ', rn_rst_e3t -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DOM/domvvl.F90
r12680 r12724 247 247 IF( ln_vvl_ztilde_as_zstar ) THEN ! z-star emulation using z-tile 248 248 frq_rst_e3t(:,:) = 0._wp !Ignore namelist settings 249 frq_rst_hdv(:,:) = 1._wp / r dt249 frq_rst_hdv(:,:) = 1._wp / rn_Dt 250 250 ENDIF 251 251 IF ( ln_vvl_zstar_at_eqtor ) THEN ! use z-star in vicinity of the Equator … … 259 259 ! values inside the equatorial band (ztilde as zstar) 260 260 frq_rst_e3t(ji,jj) = 0.0_wp 261 frq_rst_hdv(ji,jj) = 1.0_wp / r dt261 frq_rst_hdv(ji,jj) = 1.0_wp / rn_Dt 262 262 ELSE ! transition band (2.5 to 6 degrees N/S) 263 263 ! ! (linearly transition from z-tilde to z-star) … … 265 265 & * ( 1.0_wp - COS( rad*(ABS(gphit(ji,jj))-2.5_wp) & 266 266 & * 180._wp / 3.5_wp ) ) 267 frq_rst_hdv(ji,jj) = (1.0_wp / r dt) &268 & + ( frq_rst_hdv(ji,jj)-(1.e0_wp / r dt) )*0.5_wp &267 frq_rst_hdv(ji,jj) = (1.0_wp / rn_Dt) & 268 & + ( frq_rst_hdv(ji,jj)-(1.e0_wp / rn_Dt) )*0.5_wp & 269 269 & * ( 1._wp - COS( rad*(ABS(gphit(ji,jj))-2.5_wp) & 270 270 & * 180._wp / 3.5_wp ) ) … … 276 276 ij0 = 128 ; ij1 = 135 ; 277 277 frq_rst_e3t( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 0.0_wp 278 frq_rst_hdv( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 1.e0_wp / r dt278 frq_rst_hdv( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 1.e0_wp / rn_Dt 279 279 ENDIF 280 280 ENDIF … … 331 331 INTEGER :: ji, jj, jk ! dummy loop indices 332 332 INTEGER , DIMENSION(3) :: ijk_max, ijk_min ! temporary integers 333 REAL(wp) :: z 2dt, z_tmin, z_tmax! local scalars333 REAL(wp) :: z_tmin, z_tmax ! local scalars 334 334 LOGICAL :: ll_do_bclinic ! local logical 335 335 REAL(wp), DIMENSION(jpi,jpj) :: zht, z_scale, zwu, zwv, zhdiv … … 385 385 IF( kt > nit000 ) THEN 386 386 DO jk = 1, jpkm1 387 hdiv_lf(:,:,jk) = hdiv_lf(:,:,jk) - r dt * frq_rst_hdv(:,:) &387 hdiv_lf(:,:,jk) = hdiv_lf(:,:,jk) - rn_Dt * frq_rst_hdv(:,:) & 388 388 & * ( hdiv_lf(:,:,jk) - e3t(:,:,jk,Kmm) * ( hdiv(:,:,jk) - zhdiv(:,:) ) ) 389 389 END DO … … 442 442 ! 4 - Time stepping of baroclinic scale factors 443 443 ! --------------------------------------------- 444 ! Leapfrog time stepping445 ! ~~~~~~~~~~~~~~~~~~~~~~446 IF( neuler == 0 .AND. kt == nit000 ) THEN447 z2dt = rdt448 ELSE449 z2dt = 2.0_wp * rdt450 ENDIF451 444 CALL lbc_lnk( 'domvvl', tilde_e3t_a(:,:,:), 'T', 1._wp ) 452 tilde_e3t_a(:,:,:) = tilde_e3t_b(:,:,:) + z2dt * tmask(:,:,:) * tilde_e3t_a(:,:,:)445 tilde_e3t_a(:,:,:) = tilde_e3t_b(:,:,:) + rDt * tmask(:,:,:) * tilde_e3t_a(:,:,:) 453 446 454 447 ! Maximum deformation control … … 636 629 ! - ML - e3(t/u/v)_b are allready computed in dynnxt. 637 630 IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN 638 IF( neuler == 0 .AND. kt == nit000) THEN631 IF( l_1st_euler ) THEN 639 632 tilde_e3t_b(:,:,:) = tilde_e3t_n(:,:,:) 640 633 ELSE 641 634 tilde_e3t_b(:,:,:) = tilde_e3t_n(:,:,:) & 642 & + atfp * ( tilde_e3t_b(:,:,:) - 2.0_wp * tilde_e3t_n(:,:,:) + tilde_e3t_a(:,:,:) )635 & + rn_atfp * ( tilde_e3t_b(:,:,:) - 2.0_wp * tilde_e3t_n(:,:,:) + tilde_e3t_a(:,:,:) ) 643 636 ENDIF 644 637 tilde_e3t_n(:,:,:) = tilde_e3t_a(:,:,:) … … 833 826 e3t(:,:,:,Kbb) = e3t_0(:,:,:) 834 827 END WHERE 835 IF( neuler == 0) THEN828 IF( l_1st_euler ) THEN 836 829 e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm) 837 830 ENDIF … … 839 832 IF(lwp) write(numout,*) 'dom_vvl_rst WARNING : e3t(:,:,:,Kmm) not found in restart files' 840 833 IF(lwp) write(numout,*) 'e3t_n set equal to e3t_b.' 841 IF(lwp) write(numout,*) ' neuler is forced to 0'834 IF(lwp) write(numout,*) 'l_1st_euler is forced to true' 842 835 CALL iom_get( numror, jpdom_autoglo, 'e3t_b', e3t(:,:,:,Kbb), ldxios = lrxios ) 843 836 e3t(:,:,:,Kmm) = e3t(:,:,:,Kbb) 844 neuler = 0837 l_1st_euler = .true. 845 838 ELSE IF( id2 > 0 ) THEN 846 839 IF(lwp) write(numout,*) 'dom_vvl_rst WARNING : e3t(:,:,:,Kbb) not found in restart files' 847 840 IF(lwp) write(numout,*) 'e3t_b set equal to e3t_n.' 848 IF(lwp) write(numout,*) ' neuler is forced to 0'841 IF(lwp) write(numout,*) 'l_1st_euler is forced to true' 849 842 CALL iom_get( numror, jpdom_autoglo, 'e3t_n', e3t(:,:,:,Kmm), ldxios = lrxios ) 850 843 e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm) 851 neuler = 0844 l_1st_euler = .true. 852 845 ELSE 853 846 IF(lwp) write(numout,*) 'dom_vvl_rst WARNING : e3t(:,:,:,Kmm) not found in restart file' 854 847 IF(lwp) write(numout,*) 'Compute scale factor from sshn' 855 IF(lwp) write(numout,*) ' neuler is forced to 0'848 IF(lwp) write(numout,*) 'l_1st_euler is forced to true' 856 849 DO jk = 1, jpk 857 850 e3t(:,:,jk,Kmm) = e3t_0(:,:,jk) * ( ht_0(:,:) + ssh(:,:,Kmm) ) & … … 860 853 END DO 861 854 e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm) 862 neuler = 0855 l_1st_euler = .true. 863 856 ENDIF 864 857 ! ! ----------- ! … … 1020 1013 WRITE(numout,*) ' rn_rst_e3t = 0.e0' 1021 1014 WRITE(numout,*) ' hard-wired : z-tilde cutoff frequency of low-pass filter (days)' 1022 WRITE(numout,*) ' rn_lf_cutoff = 1.0/r dt'1015 WRITE(numout,*) ' rn_lf_cutoff = 1.0/rn_Dt' 1023 1016 ELSE 1024 1017 WRITE(numout,*) ' z-tilde to zstar restoration timescale (days) rn_rst_e3t = ', rn_rst_e3t -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DOM/istate.F90
r12680 r12724 93 93 ! ! --------------- 94 94 numror = 0 ! define numror = 0 -> no restart file to read 95 neuler = 0! Set time-step indicator at nit000 (euler forward)95 l_1st_euler = .true. ! Set time-step indicator at nit000 (euler forward) 96 96 CALL day_init ! model calendar (using both namelist and restart infos) 97 97 ! ! Initialization of ocean to zero -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DOM/phycst.F90
r10068 r12724 39 39 REAL(wp), PUBLIC :: rt0 = 273.15_wp !: freezing point of fresh water [Kelvin] 40 40 41 REAL(wp), PUBLIC :: r au0 !: volumic mass of reference [kg/m3]42 REAL(wp), PUBLIC :: r1_r au0 !: = 1. / rau0 [m3/kg]41 REAL(wp), PUBLIC :: rho0 !: volumic mass of reference [kg/m3] 42 REAL(wp), PUBLIC :: r1_rho0 !: = 1. / rho0 [m3/kg] 43 43 REAL(wp), PUBLIC :: rcp !: ocean specific heat [J/Kelvin] 44 44 REAL(wp), PUBLIC :: r1_rcp !: = 1. / rcp [Kelvin/J] 45 REAL(wp), PUBLIC :: r au0_rcp !: = rau0 * rcp46 REAL(wp), PUBLIC :: r1_r au0_rcp !: = 1. / ( rau0 * rcp )45 REAL(wp), PUBLIC :: rho0_rcp !: = rho0 * rcp 46 REAL(wp), PUBLIC :: r1_rho0_rcp !: = 1. / ( rho0 * rcp ) 47 47 48 48 REAL(wp), PUBLIC :: emic = 0.97_wp !: emissivity of snow or ice (not used?) -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DYN/dynatf.F90
r12680 r12724 104 104 !! arrays to start the next time step: 105 105 !! (puu(Kmm),pvv(Kmm)) = (puu(Kmm),pvv(Kmm)) 106 !! + atfp [ (puu(Kbb),pvv(Kbb)) + (puu(Kaa),pvv(Kaa)) - 2 (puu(Kmm),pvv(Kmm)) ]106 !! + rn_atfp [ (puu(Kbb),pvv(Kbb)) + (puu(Kaa),pvv(Kaa)) - 2 (puu(Kmm),pvv(Kmm)) ] 107 107 !! Note that with flux form advection and non linear free surface, 108 108 !! the time filter is applied on thickness weighted velocity. … … 174 174 ! 175 175 IF( l_trddyn ) THEN ! prepare the atf trend computation + some diagnostics 176 z1_2dt = 1._wp / (2. * rdt) ! Euler or leap-frog time step177 IF( neuler == 0 .AND. kt == nit000 ) z1_2dt = 1._wp / rdt178 176 ! 179 177 ! ! Kinetic energy and Conversion … … 181 179 ! 182 180 IF( ln_dyn_trd ) THEN ! 3D output: total momentum trends 183 zua(:,:,:) = ( puu(:,:,:,Kaa) - puu(:,:,:,Kbb) ) * z1_2dt184 zva(:,:,:) = ( pvv(:,:,:,Kaa) - pvv(:,:,:,Kbb) ) * z1_2dt181 zua(:,:,:) = ( puu(:,:,:,Kaa) - puu(:,:,:,Kbb) ) * r1_Dt 182 zva(:,:,:) = ( pvv(:,:,:,Kaa) - pvv(:,:,:,Kbb) ) * r1_Dt 185 183 CALL iom_put( "utrd_tot", zua ) ! total momentum trends, except the asselin time filter 186 184 CALL iom_put( "vtrd_tot", zva ) … … 194 192 ! Time filter and swap of dynamics arrays 195 193 ! ------------------------------------------ 196 197 IF( .NOT. ( neuler == 0 .AND. kt == nit000 ) ) THEN !* Leap-Frog : Asselin time filter194 195 IF( .NOT. l_1st_euler ) THEN !* Leap-Frog : Asselin time filter 198 196 ! ! =============! 199 197 IF( ln_linssh ) THEN ! Fixed volume ! 200 198 ! ! =============! 201 199 DO_3D_11_11( 1, jpkm1 ) 202 puu(ji,jj,jk,Kmm) = puu(ji,jj,jk,Kmm) + atfp * ( puu(ji,jj,jk,Kbb) - 2._wp * puu(ji,jj,jk,Kmm) + puu(ji,jj,jk,Kaa) )203 pvv(ji,jj,jk,Kmm) = pvv(ji,jj,jk,Kmm) + atfp * ( pvv(ji,jj,jk,Kbb) - 2._wp * pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk,Kaa) )200 puu(ji,jj,jk,Kmm) = puu(ji,jj,jk,Kmm) + rn_atfp * ( puu(ji,jj,jk,Kbb) - 2._wp * puu(ji,jj,jk,Kmm) + puu(ji,jj,jk,Kaa) ) 201 pvv(ji,jj,jk,Kmm) = pvv(ji,jj,jk,Kmm) + rn_atfp * ( pvv(ji,jj,jk,Kbb) - 2._wp * pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk,Kaa) ) 204 202 END_3D 205 203 ! ! ================! … … 210 208 ALLOCATE( ze3t_f(jpi,jpj,jpk), zwfld(jpi,jpj) ) 211 209 DO jk = 1, jpkm1 212 ze3t_f(:,:,jk) = pe3t(:,:,jk,Kmm) + atfp * ( pe3t(:,:,jk,Kbb) - 2._wp * pe3t(:,:,jk,Kmm) + pe3t(:,:,jk,Kaa) )210 ze3t_f(:,:,jk) = pe3t(:,:,jk,Kmm) + rn_atfp * ( pe3t(:,:,jk,Kbb) - 2._wp * pe3t(:,:,jk,Kmm) + pe3t(:,:,jk,Kaa) ) 213 211 END DO 214 212 ! Add volume filter correction: compatibility with tracer advection scheme 215 213 ! => time filter + conservation correction 216 zcoef = atfp * rdt * r1_rau0214 zcoef = rn_atfp * rn_Dt * r1_rho0 217 215 zwfld(:,:) = emp_b(:,:) - emp(:,:) 218 216 IF ( ln_rnf ) zwfld(:,:) = zwfld(:,:) - ( rnf_b(:,:) - rnf(:,:) ) … … 226 224 ! to manage rnf, isf and possibly in the futur icb, tide water glacier (...) 227 225 ! ...(kt, coef, ktop, kbot, hz, fwf_b, fwf) 228 IF ( ln_isf ) CALL isf_dynatf( kt, Kmm, ze3t_f, atfp * rdt )226 IF ( ln_isf ) CALL isf_dynatf( kt, Kmm, ze3t_f, rn_atfp * rn_Dt ) 229 227 ! 230 228 pe3t(:,:,1:jpkm1,Kmm) = ze3t_f(:,:,1:jpkm1) ! filtered scale factor at T-points … … 235 233 CALL dom_vvl_interpol( pe3t(:,:,:,Kmm), pe3v(:,:,:,Kmm), 'V' ) 236 234 DO_3D_11_11( 1, jpkm1 ) 237 puu(ji,jj,jk,Kmm) = puu(ji,jj,jk,Kmm) + atfp * ( puu(ji,jj,jk,Kbb) - 2._wp * puu(ji,jj,jk,Kmm) + puu(ji,jj,jk,Kaa) )238 pvv(ji,jj,jk,Kmm) = pvv(ji,jj,jk,Kmm) + atfp * ( pvv(ji,jj,jk,Kbb) - 2._wp * pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk,Kaa) )235 puu(ji,jj,jk,Kmm) = puu(ji,jj,jk,Kmm) + rn_atfp * ( puu(ji,jj,jk,Kbb) - 2._wp * puu(ji,jj,jk,Kmm) + puu(ji,jj,jk,Kaa) ) 236 pvv(ji,jj,jk,Kmm) = pvv(ji,jj,jk,Kmm) + rn_atfp * ( pvv(ji,jj,jk,Kbb) - 2._wp * pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk,Kaa) ) 239 237 END_3D 240 238 ! … … 253 251 zve3b = pe3v(ji,jj,jk,Kbb) * pvv(ji,jj,jk,Kbb) 254 252 ! 255 puu(ji,jj,jk,Kmm) = ( zue3n + atfp * ( zue3b - 2._wp * zue3n + zue3a ) ) / ze3u_f(ji,jj,jk)256 pvv(ji,jj,jk,Kmm) = ( zve3n + atfp * ( zve3b - 2._wp * zve3n + zve3a ) ) / ze3v_f(ji,jj,jk)253 puu(ji,jj,jk,Kmm) = ( zue3n + rn_atfp * ( zue3b - 2._wp * zue3n + zue3a ) ) / ze3u_f(ji,jj,jk) 254 pvv(ji,jj,jk,Kmm) = ( zve3n + rn_atfp * ( zve3b - 2._wp * zve3n + zve3a ) ) / ze3v_f(ji,jj,jk) 257 255 END_3D 258 256 pe3u(:,:,1:jpkm1,Kmm) = ze3u_f(:,:,1:jpkm1) … … 280 278 ENDIF 281 279 ! 282 ENDIF ! neuler /= 0280 ENDIF ! .NOT. l_1st_euler 283 281 ! 284 282 ! Set "now" and "before" barotropic velocities for next time step: -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DYN/dynatfQCO.F90
r12656 r12724 15 15 !! 2.3 ! 2007-07 (D. Storkey) Calls to BDY routines. 16 16 !! 3.2 ! 2009-06 (G. Madec, R.Benshila) re-introduce the vvl option 17 !! 3.3 ! 2010-09 (D. Storkey, E.O'Dea) Bug fix for BDY module17 !! 3.3 ! 2010-09 D. Storkey, E.O'Dea) Bug fix for BDY module 18 18 !! 3.3 ! 2011-03 (P. Oddo) Bug fix for time-splitting+(BDY-OBC) and not VVL 19 19 !! 3.5 ! 2013-07 (J. Chanut) Compliant with time splitting changes … … 117 117 ! 118 118 IF( l_trddyn ) THEN ! prepare the atf trend computation + some diagnostics 119 z1_2dt = 1._wp / (2. * rdt) ! Euler or leap-frog time step120 IF( neuler == 0 .AND. kt == nit000 ) z1_2dt = 1._wp / rdt121 119 ! 122 120 ! ! Kinetic energy and Conversion … … 124 122 ! 125 123 IF( ln_dyn_trd ) THEN ! 3D output: total momentum trends 126 zua(:,:,:) = ( puu(:,:,:,Kaa) - puu(:,:,:,Kbb) ) * z1_2dt127 zva(:,:,:) = ( pvv(:,:,:,Kaa) - pvv(:,:,:,Kbb) ) * z1_2dt124 zua(:,:,:) = ( puu(:,:,:,Kaa) - puu(:,:,:,Kbb) ) * r1_Dt 125 zva(:,:,:) = ( pvv(:,:,:,Kaa) - pvv(:,:,:,Kbb) ) * r1_Dt 128 126 CALL iom_put( "utrd_tot", zua ) ! total momentum trends, except the asselin time filter 129 127 CALL iom_put( "vtrd_tot", zva ) … … 138 136 ! ------------------------------------------ 139 137 140 IF( .NOT. ( neuler == 0 .AND. kt == nit000 )) THEN !* Leap-Frog : Asselin time filter138 IF( .NOT. l_1st_euler ) THEN !* Leap-Frog : Asselin time filter 141 139 ! ! =============! 142 140 IF( ln_linssh ) THEN ! Fixed volume ! 143 141 ! ! =============! 144 142 DO_3D_11_11( 1, jpkm1 ) 145 puu(ji,jj,jk,Kmm) = puu(ji,jj,jk,Kmm) + atfp * ( puu(ji,jj,jk,Kbb) - 2._wp * puu(ji,jj,jk,Kmm) + puu(ji,jj,jk,Kaa) )146 pvv(ji,jj,jk,Kmm) = pvv(ji,jj,jk,Kmm) + atfp * ( pvv(ji,jj,jk,Kbb) - 2._wp * pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk,Kaa) )143 puu(ji,jj,jk,Kmm) = puu(ji,jj,jk,Kmm) + rn_atfp * ( puu(ji,jj,jk,Kbb) - 2._wp * puu(ji,jj,jk,Kmm) + puu(ji,jj,jk,Kaa) ) 144 pvv(ji,jj,jk,Kmm) = pvv(ji,jj,jk,Kmm) + rn_atfp * ( pvv(ji,jj,jk,Kbb) - 2._wp * pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk,Kaa) ) 147 145 END_3D 148 146 ! ! ================! … … 164 162 ! 165 163 DO_3D_11_11( 1, jpkm1 ) 166 puu(ji,jj,jk,Kmm) = puu(ji,jj,jk,Kmm) + atfp * ( puu(ji,jj,jk,Kbb) - 2._wp * puu(ji,jj,jk,Kmm) + puu(ji,jj,jk,Kaa) )167 pvv(ji,jj,jk,Kmm) = pvv(ji,jj,jk,Kmm) + atfp * ( pvv(ji,jj,jk,Kbb) - 2._wp * pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk,Kaa) )164 puu(ji,jj,jk,Kmm) = puu(ji,jj,jk,Kmm) + rn_atfp * ( puu(ji,jj,jk,Kbb) - 2._wp * puu(ji,jj,jk,Kmm) + puu(ji,jj,jk,Kaa) ) 165 pvv(ji,jj,jk,Kmm) = pvv(ji,jj,jk,Kmm) + rn_atfp * ( pvv(ji,jj,jk,Kbb) - 2._wp * pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk,Kaa) ) 168 166 END_3D 169 167 ! … … 188 186 ! pe3v(ji,jj,jk,Kmm) = e3v_0(ji,jj,jk) * ( 1._wp + r3v_f(ji,jj) * vmask(ji,jj,jk) ) 189 187 ! 190 puu(ji,jj,jk,Kmm) = ( zue3n + atfp * ( zue3b - 2._wp * zue3n + zue3a ) ) / ( 1._wp + r3u_f(ji,jj)*umask(ji,jj,jk) ) !!st ze3u_f(ji,jj,jk)191 pvv(ji,jj,jk,Kmm) = ( zve3n + atfp * ( zve3b - 2._wp * zve3n + zve3a ) ) / ( 1._wp + r3v_f(ji,jj)*vmask(ji,jj,jk) ) !!st ze3v_f(ji,jj,jk)188 puu(ji,jj,jk,Kmm) = ( zue3n + rn_atfp * ( zue3b - 2._wp * zue3n + zue3a ) ) / ( 1._wp + r3u_f(ji,jj)*umask(ji,jj,jk) ) !!st ze3u_f(ji,jj,jk) 189 pvv(ji,jj,jk,Kmm) = ( zve3n + rn_atfp * ( zve3b - 2._wp * zve3n + zve3a ) ) / ( 1._wp + r3v_f(ji,jj)*vmask(ji,jj,jk) ) !!st ze3v_f(ji,jj,jk) 192 190 END_3D 193 191 ! … … 217 215 ENDIF 218 216 ! 219 ENDIF ! neuler /= 0217 ENDIF ! .NOT. l_1st_euler 220 218 ! 221 219 ! Set "now" and "before" barotropic velocities for next time step: -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DYN/dynspg.F90
r12377 r12724 67 67 !! ln_apr_dyn=T : the atmospheric pressure forcing is applied 68 68 !! as the gradient of the inverse barometer ssh: 69 !! apgu = - 1/r au0 di[apr] = 0.5*grav di[ssh_ib+ssh_ibb]70 !! apgv = - 1/r au0 dj[apr] = 0.5*grav dj[ssh_ib+ssh_ibb]71 !! Note that as all external forcing a time averaging over a two r dt69 !! apgu = - 1/rho0 di[apr] = 0.5*grav di[ssh_ib+ssh_ibb] 70 !! apgv = - 1/rho0 dj[apr] = 0.5*grav dj[ssh_ib+ssh_ibb] 71 !! Note that as all external forcing a time averaging over a two rn_Dt 72 72 !! period is used to prevent the divergence of odd and even time step. 73 73 !!---------------------------------------------------------------------- … … 78 78 ! 79 79 INTEGER :: ji, jj, jk ! dummy loop indices 80 REAL(wp) :: z2dt, zg_2, zintp, zgr au0r, zld ! local scalars80 REAL(wp) :: z2dt, zg_2, zintp, zgrho0r, zld ! local scalars 81 81 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zpice 82 82 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdu, ztrdv … … 114 114 ! 115 115 ! Update tide potential at the beginning of current time step 116 zt0step = REAL(nsec_day, wp)-0.5_wp*r dt116 zt0step = REAL(nsec_day, wp)-0.5_wp*rn_Dt 117 117 CALL upd_tide(zt0step, Kmm) 118 118 ! … … 134 134 ALLOCATE( zpice(jpi,jpj) ) 135 135 zintp = REAL( MOD( kt-1, nn_fsbc ) ) / REAL( nn_fsbc ) 136 zgr au0r = - grav * r1_rau0137 zpice(:,:) = ( zintp * snwice_mass(:,:) + ( 1.- zintp ) * snwice_mass_b(:,:) ) * zgr au0r136 zgrho0r = - grav * r1_rho0 137 zpice(:,:) = ( zintp * snwice_mass(:,:) + ( 1.- zintp ) * snwice_mass_b(:,:) ) * zgrho0r 138 138 DO_2D_00_00 139 139 spgu(ji,jj) = spgu(ji,jj) + ( zpice(ji+1,jj) - zpice(ji,jj) ) * r1_e1u(ji,jj) … … 183 183 NAMELIST/namdyn_spg/ ln_dynspg_exp , ln_dynspg_ts, & 184 184 & ln_bt_fw, ln_bt_av , ln_bt_auto , & 185 & nn_ baro, rn_bt_cmax, nn_bt_flt, rn_bt_alpha185 & nn_e , rn_bt_cmax, nn_bt_flt, rn_bt_alpha 186 186 !!---------------------------------------------------------------------- 187 187 ! … … 222 222 ! 223 223 IF( nspg == np_TS ) THEN ! split-explicit scheme initialisation 224 CALL dyn_spg_ts_init ! do it first: set nn_ baroused to allocate some arrays later on224 CALL dyn_spg_ts_init ! do it first: set nn_e used to allocate some arrays later on 225 225 ENDIF 226 226 ! -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DYN/dynspg_exp.F90
r12377 r12724 49 49 !! momentum trend the surface pressure gradient : 50 50 !! (uu(rhs),vv(rhs)) = (uu(rhs),vv(rhs)) + (spgu,spgv) 51 !! where spgu = -1/r au0 d/dx(ps) = -g/e1u di( ssh(now) )52 !! spgv = -1/r au0 d/dy(ps) = -g/e2v dj( ssh(now) )51 !! where spgu = -1/rho0 d/dx(ps) = -g/e1u di( ssh(now) ) 52 !! spgv = -1/rho0 d/dy(ps) = -g/e2v dj( ssh(now) ) 53 53 !! 54 54 !! ** Action : (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) trend of horizontal velocity increased by -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DYN/dynspg_ts.F90
r12616 r12724 72 72 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: un_adv , vn_adv !: Advection vel. at "now" barocl. step 73 73 ! 74 INTEGER, SAVE :: icycle ! Number of barotropic sub-steps for each internal step nn_ baro <= 2.5 nn_baro75 REAL(wp),SAVE :: r dtbt! Barotropic time step74 INTEGER, SAVE :: icycle ! Number of barotropic sub-steps for each internal step nn_e <= 2.5 nn_e 75 REAL(wp),SAVE :: rDt_e ! Barotropic time step 76 76 ! 77 77 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) :: wgtbtp1, wgtbtp2 ! 1st & 2nd weights used in time filtering of barotropic fields … … 103 103 ierr(:) = 0 104 104 ! 105 ALLOCATE( wgtbtp1(3*nn_ baro), wgtbtp2(3*nn_baro), zwz(jpi,jpj), STAT=ierr(1) )105 ALLOCATE( wgtbtp1(3*nn_e), wgtbtp2(3*nn_e), zwz(jpi,jpj), STAT=ierr(1) ) 106 106 IF( ln_dynvor_een .OR. ln_dynvor_eeT ) & 107 107 & ALLOCATE( ftnw(jpi,jpj) , ftne(jpi,jpj) , ftsw(jpi,jpj) , ftse(jpi,jpj), STAT=ierr(2) ) … … 151 151 LOGICAL :: ll_init ! =T : special startup of 2d equations 152 152 INTEGER :: noffset ! local integers : time offset for bdy update 153 REAL(wp) :: r1_ 2dt_b, z1_hu, z1_hv ! local scalars153 REAL(wp) :: r1_Dt_b, z1_hu, z1_hv ! local scalars 154 154 REAL(wp) :: za0, za1, za2, za3 ! - - 155 155 REAL(wp) :: zztmp, zldg ! - - … … 182 182 ! zwdramp = 1._wp / (rn_wdmin2 - rn_wdmin1) ! more general ramp 183 183 ! ! inverse of baroclinic time step 184 IF( kt == nit000 .AND. neuler == 0 ) THEN ; r1_2dt_b = 1._wp / ( rdt ) 185 ELSE ; r1_2dt_b = 1._wp / ( 2._wp * rdt ) 186 ENDIF 184 r1_Dt_b = 1._wp / rDt 187 185 ! 188 186 ll_init = ln_bt_av ! if no time averaging, then no specific restart 189 187 ll_fw_start = .FALSE. 190 188 ! ! time offset in steps for bdy data update 191 IF( .NOT.ln_bt_fw ) THEN ; noffset = - nn_ baro189 IF( .NOT.ln_bt_fw ) THEN ; noffset = - nn_e 192 190 ELSE ; noffset = 0 193 191 ENDIF … … 200 198 IF(lwp) WRITE(numout,*) 201 199 ! 202 IF( neuler == 0) ll_init=.TRUE.203 ! 204 IF( ln_bt_fw .OR. neuler == 0) THEN200 IF( l_1st_euler ) ll_init=.TRUE. 201 ! 202 IF( ln_bt_fw .OR. l_1st_euler ) THEN 205 203 ll_fw_start =.TRUE. 206 204 noffset = 0 … … 211 209 CALL ts_wgt( ln_bt_av, ll_fw_start, icycle, wgtbtp1, wgtbtp2 ) 212 210 ! 213 ENDIF 214 ! 215 ! If forward start at previous time step, and centered integration, 216 ! then update averaging weights: 217 IF (.NOT.ln_bt_fw .AND.( neuler==0 .AND. kt==nit000+1 ) ) THEN 218 ll_fw_start=.FALSE. 219 CALL ts_wgt( ln_bt_av, ll_fw_start, icycle, wgtbtp1, wgtbtp2 ) 220 ENDIF 221 ! 222 211 ELSEIF( kt == nit000 + 1 ) THEN !* initialisation 2nd time-step 212 ! 213 IF( .NOT.ln_bt_fw ) THEN 214 ! If we did an Euler timestep on the first timestep we need to reset ll_fw_start 215 ! and the averaging weights. We don't have an easy way of telling whether we did 216 ! an Euler timestep on the first timestep (because l_1st_euler is reset to .false. 217 ! at the end of the first timestep) so just do this in all cases. 218 ll_fw_start = .FALSE. 219 CALL ts_wgt( ln_bt_av, ll_fw_start, icycle, wgtbtp1, wgtbtp2 ) 220 ENDIF 221 ! 222 ENDIF 223 ! 223 224 ! ----------------------------------------------------------------------------- 224 225 ! Phase 1 : Coupling between general trend and barotropic estimates (1st step) … … 309 310 IF( ln_bt_fw ) THEN ! Add wind forcing 310 311 DO_2D_00_00 311 zu_frc(ji,jj) = zu_frc(ji,jj) + r1_r au0 * utau(ji,jj) * r1_hu(ji,jj,Kmm)312 zv_frc(ji,jj) = zv_frc(ji,jj) + r1_r au0 * vtau(ji,jj) * r1_hv(ji,jj,Kmm)312 zu_frc(ji,jj) = zu_frc(ji,jj) + r1_rho0 * utau(ji,jj) * r1_hu(ji,jj,Kmm) 313 zv_frc(ji,jj) = zv_frc(ji,jj) + r1_rho0 * vtau(ji,jj) * r1_hv(ji,jj,Kmm) 313 314 END_2D 314 315 ELSE 315 zztmp = r1_r au0 * r1_2316 zztmp = r1_rho0 * r1_2 316 317 DO_2D_00_00 317 318 zu_frc(ji,jj) = zu_frc(ji,jj) + zztmp * ( utau_b(ji,jj) + utau(ji,jj) ) * r1_hu(ji,jj,Kmm) … … 326 327 ! ! --------------------------------------------------- ! 327 328 IF (ln_bt_fw) THEN ! FORWARD integration: use kt+1/2 fluxes (NOW+1/2) 328 zssh_frc(:,:) = r1_r au0 * ( emp(:,:) - rnf(:,:) + fwfisf_cav(:,:) + fwfisf_par(:,:) )329 zssh_frc(:,:) = r1_rho0 * ( emp(:,:) - rnf(:,:) + fwfisf_cav(:,:) + fwfisf_par(:,:) ) 329 330 ELSE ! CENTRED integration: use kt-1/2 + kt+1/2 fluxes (NOW) 330 zztmp = r1_r au0 * r1_2331 zztmp = r1_rho0 * r1_2 331 332 zssh_frc(:,:) = zztmp * ( emp(:,:) + emp_b(:,:) & 332 333 & - rnf(:,:) - rnf_b(:,:) & … … 435 436 ! Update tide potential at the beginning of current time substep 436 437 IF( ln_tide_pot .AND. ln_tide ) THEN 437 zt0substep = REAL(nsec_day, wp) - 0.5_wp*r dt + (jn + noffset - 1) * rdt / REAL(nn_baro, wp)438 zt0substep = REAL(nsec_day, wp) - 0.5_wp*rn_Dt + (jn + noffset - 1) * rn_Dt / REAL(nn_e, wp) 438 439 CALL upd_tide(zt0substep, Kmm) 439 440 END IF … … 501 502 IF( .NOT.Agrif_Root() .AND. ln_bt_fw ) CALL agrif_dyn_ts_flux( jn, zhU, zhV ) 502 503 #endif 503 IF( ln_wd_il ) CALL wad_lmt_bt(zhU, zhV, sshn_e, zssh_frc, r dtbt) !!gm wad_lmt_bt use of lbc_lnk on zhU, zhV504 IF( ln_wd_il ) CALL wad_lmt_bt(zhU, zhV, sshn_e, zssh_frc, rDt_e) !!gm wad_lmt_bt use of lbc_lnk on zhU, zhV 504 505 505 506 IF( ln_wd_dl ) THEN ! un_e and vn_e are set to zero at faces where … … 516 517 DO_2D_00_00 517 518 zhdiv = ( zhU(ji,jj) - zhU(ji-1,jj) + zhV(ji,jj) - zhV(ji,jj-1) ) * r1_e1e2t(ji,jj) 518 ssha_e(ji,jj) = ( sshn_e(ji,jj) - r dtbt* ( zssh_frc(ji,jj) + zhdiv ) ) * ssmask(ji,jj)519 ssha_e(ji,jj) = ( sshn_e(ji,jj) - rDt_e * ( zssh_frc(ji,jj) + zhdiv ) ) * ssmask(ji,jj) 519 520 END_2D 520 521 ! … … 606 607 DO_2D_00_00 607 608 ua_e(ji,jj) = ( un_e(ji,jj) & 608 & + r dtbt* ( zu_spg(ji,jj) &609 & + rDt_e * ( zu_spg(ji,jj) & 609 610 & + zu_trd(ji,jj) & 610 611 & + zu_frc(ji,jj) ) & … … 612 613 613 614 va_e(ji,jj) = ( vn_e(ji,jj) & 614 & + r dtbt* ( zv_spg(ji,jj) &615 & + rDt_e * ( zv_spg(ji,jj) & 615 616 & + zv_trd(ji,jj) & 616 617 & + zv_frc(ji,jj) ) & … … 631 632 ! 632 633 ua_e(ji,jj) = ( hu_e (ji,jj) * un_e (ji,jj) & 633 & + r dtbt* ( zhu_bck * zu_spg (ji,jj) & !634 & + rDt_e * ( zhu_bck * zu_spg (ji,jj) & ! 634 635 & + zhup2_e(ji,jj) * zu_trd (ji,jj) & ! 635 636 & + hu(ji,jj,Kmm) * zu_frc (ji,jj) ) ) * z1_hu 636 637 ! 637 638 va_e(ji,jj) = ( hv_e (ji,jj) * vn_e (ji,jj) & 638 & + r dtbt* ( zhv_bck * zv_spg (ji,jj) & !639 & + rDt_e * ( zhv_bck * zv_spg (ji,jj) & ! 639 640 & + zhvp2_e(ji,jj) * zv_trd (ji,jj) & ! 640 641 & + hv(ji,jj,Kmm) * zv_frc (ji,jj) ) ) * z1_hv … … 644 645 IF ( ll_wd ) THEN ! revert to explicit for bit comparison tests in non wad runs 645 646 DO_2D_00_00 646 ua_e(ji,jj) = ua_e(ji,jj) /(1.0 - r dtbt* zCdU_u(ji,jj) * hur_e(ji,jj))647 va_e(ji,jj) = va_e(ji,jj) /(1.0 - r dtbt* zCdU_v(ji,jj) * hvr_e(ji,jj))647 ua_e(ji,jj) = ua_e(ji,jj) /(1.0 - rDt_e * zCdU_u(ji,jj) * hur_e(ji,jj)) 648 va_e(ji,jj) = va_e(ji,jj) /(1.0 - rDt_e * zCdU_v(ji,jj) * hvr_e(ji,jj)) 648 649 END_2D 649 650 ENDIF … … 708 709 ! Set advection velocity correction: 709 710 IF (ln_bt_fw) THEN 710 IF( .NOT.( kt == nit000 .AND. neuler==0) ) THEN711 IF( .NOT.( kt == nit000 .AND. l_1st_euler ) ) THEN 711 712 DO_2D_11_11 712 713 zun_save = un_adv(ji,jj) 713 714 zvn_save = vn_adv(ji,jj) 714 715 ! ! apply the previously computed correction 715 un_adv(ji,jj) = r1_2 * ( ub2_b(ji,jj) + zun_save - atfp * un_bf(ji,jj) )716 vn_adv(ji,jj) = r1_2 * ( vb2_b(ji,jj) + zvn_save - atfp * vn_bf(ji,jj) )716 un_adv(ji,jj) = r1_2 * ( ub2_b(ji,jj) + zun_save - rn_atfp * un_bf(ji,jj) ) 717 vn_adv(ji,jj) = r1_2 * ( vb2_b(ji,jj) + zvn_save - rn_atfp * vn_bf(ji,jj) ) 717 718 ! ! Update corrective fluxes for next time step 718 un_bf(ji,jj) = atfp * un_bf(ji,jj) + ( zun_save - ub2_b(ji,jj) )719 vn_bf(ji,jj) = atfp * vn_bf(ji,jj) + ( zvn_save - vb2_b(ji,jj) )719 un_bf(ji,jj) = rn_atfp * un_bf(ji,jj) + ( zun_save - ub2_b(ji,jj) ) 720 vn_bf(ji,jj) = rn_atfp * vn_bf(ji,jj) + ( zvn_save - vb2_b(ji,jj) ) 720 721 ! ! Save integrated transport for next computation 721 722 ub2_b(ji,jj) = zun_save … … 735 736 IF( ln_dynadv_vec .OR. ln_linssh ) THEN 736 737 DO jk=1,jpkm1 737 puu(:,:,jk,Krhs) = puu(:,:,jk,Krhs) + ( puu_b(:,:,Kaa) - puu_b(:,:,Kbb) ) * r1_ 2dt_b738 pvv(:,:,jk,Krhs) = pvv(:,:,jk,Krhs) + ( pvv_b(:,:,Kaa) - pvv_b(:,:,Kbb) ) * r1_ 2dt_b738 puu(:,:,jk,Krhs) = puu(:,:,jk,Krhs) + ( puu_b(:,:,Kaa) - puu_b(:,:,Kbb) ) * r1_Dt_b 739 pvv(:,:,jk,Krhs) = pvv(:,:,jk,Krhs) + ( pvv_b(:,:,Kaa) - pvv_b(:,:,Kbb) ) * r1_Dt_b 739 740 END DO 740 741 ELSE … … 751 752 ! 752 753 DO jk=1,jpkm1 753 puu(:,:,jk,Krhs) = puu(:,:,jk,Krhs) + r1_hu(:,:,Kmm) * ( puu_b(:,:,Kaa) - puu_b(:,:,Kbb) * hu(:,:,Kbb) ) * r1_ 2dt_b754 pvv(:,:,jk,Krhs) = pvv(:,:,jk,Krhs) + r1_hv(:,:,Kmm) * ( pvv_b(:,:,Kaa) - pvv_b(:,:,Kbb) * hv(:,:,Kbb) ) * r1_ 2dt_b754 puu(:,:,jk,Krhs) = puu(:,:,jk,Krhs) + r1_hu(:,:,Kmm) * ( puu_b(:,:,Kaa) - puu_b(:,:,Kbb) * hu(:,:,Kbb) ) * r1_Dt_b 755 pvv(:,:,jk,Krhs) = pvv(:,:,jk,Krhs) + r1_hv(:,:,Kmm) * ( pvv_b(:,:,Kaa) - pvv_b(:,:,Kbb) * hv(:,:,Kbb) ) * r1_Dt_b 755 756 END DO 756 757 ! Save barotropic velocities not transport: … … 815 816 LOGICAL, INTENT(in) :: ll_fw ! forward time splitting =.true. 816 817 INTEGER, INTENT(inout) :: jpit ! cycle length 817 REAL(wp), DIMENSION(3*nn_ baro), INTENT(inout) :: zwgt1, & ! Primary weights818 REAL(wp), DIMENSION(3*nn_e), INTENT(inout) :: zwgt1, & ! Primary weights 818 819 zwgt2 ! Secondary weights 819 820 … … 827 828 ! Set time index when averaged value is requested 828 829 IF (ll_fw) THEN 829 jic = nn_ baro830 jic = nn_e 830 831 ELSE 831 jic = 2 * nn_ baro832 jic = 2 * nn_e 832 833 ENDIF 833 834 … … 835 836 IF (ll_av) THEN 836 837 ! Define simple boxcar window for primary weights 837 ! (width = nn_ baro, centered around jic)838 ! (width = nn_e, centered around jic) 838 839 SELECT CASE ( nn_bt_flt ) 839 840 CASE( 0 ) ! No averaging … … 841 842 jpit = jic 842 843 843 CASE( 1 ) ! Boxcar, width = nn_ baro844 DO jn = 1, 3*nn_ baro845 za1 = ABS(float(jn-jic))/float(nn_ baro)844 CASE( 1 ) ! Boxcar, width = nn_e 845 DO jn = 1, 3*nn_e 846 za1 = ABS(float(jn-jic))/float(nn_e) 846 847 IF (za1 < 0.5_wp) THEN 847 848 zwgt1(jn) = 1._wp … … 850 851 ENDDO 851 852 852 CASE( 2 ) ! Boxcar, width = 2 * nn_ baro853 DO jn = 1, 3*nn_ baro854 za1 = ABS(float(jn-jic))/float(nn_ baro)853 CASE( 2 ) ! Boxcar, width = 2 * nn_e 854 DO jn = 1, 3*nn_e 855 za1 = ABS(float(jn-jic))/float(nn_e) 855 856 IF (za1 < 1._wp) THEN 856 857 zwgt1(jn) = 1._wp … … 896 897 IF( TRIM(cdrw) == 'READ' ) THEN ! Read/initialise 897 898 ! ! --------------- 898 IF( ln_rstart .AND. ln_bt_fw .AND. ( neuler/=0) ) THEN !* Read the restart file899 IF( ln_rstart .AND. ln_bt_fw .AND. (.NOT.l_1st_euler) ) THEN !* Read the restart file 899 900 CALL iom_get( numror, jpdom_autoglo, 'ub2_b' , ub2_b (:,:), ldxios = lrxios ) 900 901 CALL iom_get( numror, jpdom_autoglo, 'vb2_b' , vb2_b (:,:), ldxios = lrxios ) … … 982 983 983 984 ! Estimate number of iterations to satisfy a max courant number= rn_bt_cmax 984 IF( ln_bt_auto ) nn_ baro = CEILING( rdt / rn_bt_cmax * zcmax)985 IF( ln_bt_auto ) nn_e = CEILING( rn_Dt / rn_bt_cmax * zcmax) 985 986 986 r dtbt = rdt / REAL( nn_baro, wp )987 zcmax = zcmax * r dtbt987 rDt_e = rn_Dt / REAL( nn_e , wp ) 988 zcmax = zcmax * rDt_e 988 989 ! Print results 989 990 IF(lwp) WRITE(numout,*) … … 991 992 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~' 992 993 IF( ln_bt_auto ) THEN 993 IF(lwp) WRITE(numout,*) ' ln_ts_auto =.true. Automatically set nn_ baro'994 IF(lwp) WRITE(numout,*) ' ln_ts_auto =.true. Automatically set nn_e ' 994 995 IF(lwp) WRITE(numout,*) ' Max. courant number allowed: ', rn_bt_cmax 995 996 ELSE 996 IF(lwp) WRITE(numout,*) ' ln_ts_auto=.false.: Use nn_ baro in namelist nn_baro = ', nn_baro997 IF(lwp) WRITE(numout,*) ' ln_ts_auto=.false.: Use nn_e in namelist nn_e = ', nn_e 997 998 ENDIF 998 999 999 1000 IF(ln_bt_av) THEN 1000 IF(lwp) WRITE(numout,*) ' ln_bt_av =.true. ==> Time averaging over nn_ barotime steps is on '1001 IF(lwp) WRITE(numout,*) ' ln_bt_av =.true. ==> Time averaging over nn_e time steps is on ' 1001 1002 ELSE 1002 1003 IF(lwp) WRITE(numout,*) ' ln_bt_av =.false. => No time averaging of barotropic variables ' … … 1018 1019 SELECT CASE ( nn_bt_flt ) 1019 1020 CASE( 0 ) ; IF(lwp) WRITE(numout,*) ' Dirac' 1020 CASE( 1 ) ; IF(lwp) WRITE(numout,*) ' Boxcar: width = nn_ baro'1021 CASE( 2 ) ; IF(lwp) WRITE(numout,*) ' Boxcar: width = 2*nn_ baro'1021 CASE( 1 ) ; IF(lwp) WRITE(numout,*) ' Boxcar: width = nn_e' 1022 CASE( 2 ) ; IF(lwp) WRITE(numout,*) ' Boxcar: width = 2*nn_e' 1022 1023 CASE DEFAULT ; CALL ctl_stop( 'unrecognised value for nn_bt_flt: should 0,1, or 2' ) 1023 1024 END SELECT 1024 1025 ! 1025 1026 IF(lwp) WRITE(numout,*) ' ' 1026 IF(lwp) WRITE(numout,*) ' nn_ baro = ', nn_baro1027 IF(lwp) WRITE(numout,*) ' Barotropic time step [s] is :', r dtbt1027 IF(lwp) WRITE(numout,*) ' nn_e = ', nn_e 1028 IF(lwp) WRITE(numout,*) ' Barotropic time step [s] is :', rDt_e 1028 1029 IF(lwp) WRITE(numout,*) ' Maximum Courant number is :', zcmax 1029 1030 ! … … 1037 1038 ENDIF 1038 1039 IF( zcmax>0.9_wp ) THEN 1039 CALL ctl_stop( 'dynspg_ts ERROR: Maximum Courant number is greater than 0.9: Inc. nn_ baro!' )1040 CALL ctl_stop( 'dynspg_ts ERROR: Maximum Courant number is greater than 0.9: Inc. nn_e !' ) 1040 1041 ENDIF 1041 1042 ! … … 1436 1437 ! 1437 1438 IF( ln_wd_il ) THEN ! W/D : use the "clipped" bottom friction !!gm explain WHY, please ! 1438 zztmp = -1._wp / r dtbt1439 zztmp = -1._wp / rDt_e 1439 1440 DO_2D_00_00 1440 1441 pu_RHSi(ji,jj) = pu_RHSi(ji,jj) + zu_i(ji,jj) * wdrampu(ji,jj) * MAX( & -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DYN/dynzdf.F90
r12616 r12724 93 93 ENDIF 94 94 ENDIF 95 ! !* set time step96 IF( neuler == 0 .AND. kt == nit000 ) THEN ; r2dt = rdt ! = rdt (restart with Euler time stepping)97 ELSEIF( kt <= nit000 + 1 ) THEN ; r2dt = 2. * rdt ! = 2 rdt (leapfrog)98 ENDIF99 !100 95 ! !* explicit top/bottom drag case 101 96 IF( .NOT.ln_drgimp ) CALL zdf_drg_exp( kt, Kmm, puu(:,:,:,Kbb), pvv(:,:,:,Kbb), puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add top/bottom friction trend to (puu(Kaa),pvv(Kaa)) … … 113 108 IF( ln_dynadv_vec .OR. ln_linssh ) THEN ! applied on velocity 114 109 DO jk = 1, jpkm1 115 puu(:,:,jk,Kaa) = ( puu(:,:,jk,Kbb) + r 2dt * puu(:,:,jk,Krhs) ) * umask(:,:,jk)116 pvv(:,:,jk,Kaa) = ( pvv(:,:,jk,Kbb) + r 2dt * pvv(:,:,jk,Krhs) ) * vmask(:,:,jk)110 puu(:,:,jk,Kaa) = ( puu(:,:,jk,Kbb) + rDt * puu(:,:,jk,Krhs) ) * umask(:,:,jk) 111 pvv(:,:,jk,Kaa) = ( pvv(:,:,jk,Kbb) + rDt * pvv(:,:,jk,Krhs) ) * vmask(:,:,jk) 117 112 END DO 118 113 ELSE ! applied on thickness weighted velocity 119 114 DO jk = 1, jpkm1 120 puu(:,:,jk,Kaa) = ( e3u(:,:,jk,Kbb) * puu(:,:,jk,Kbb) &121 & + r2dt * e3u(:,:,jk,Kmm) * puu(:,:,jk,Krhs) ) &122 & / e3u(:,:,jk,Kaa) * umask(:,:,jk)123 pvv(:,:,jk,Kaa) = ( e3v(:,:,jk,Kbb) * pvv(:,:,jk,Kbb) &124 & + r2dt * e3v(:,:,jk,Kmm) * pvv(:,:,jk,Krhs) ) &125 & / e3v(:,:,jk,Kaa) * vmask(:,:,jk)115 puu(:,:,jk,Kaa) = ( e3u(:,:,jk,Kbb) * puu(:,:,jk,Kbb) & 116 & + rDt * e3u(:,:,jk,Kmm) * puu(:,:,jk,Krhs) ) & 117 & / e3u(:,:,jk,Kaa) * umask(:,:,jk) 118 pvv(:,:,jk,Kaa) = ( e3v(:,:,jk,Kbb) * pvv(:,:,jk,Kbb) & 119 & + rDt * e3v(:,:,jk,Kmm) * pvv(:,:,jk,Krhs) ) & 120 & / e3v(:,:,jk,Kaa) * vmask(:,:,jk) 126 121 END DO 127 122 ENDIF … … 143 138 ze3va = ( 1._wp - r_vvl ) * e3v(ji,jj,ikv,Kmm) & 144 139 & + r_vvl * e3v(ji,jj,ikv,Kaa) 145 puu(ji,jj,iku,Kaa) = puu(ji,jj,iku,Kaa) + r 2dt * 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) * uu_b(ji,jj,Kaa) / ze3ua146 pvv(ji,jj,ikv,Kaa) = pvv(ji,jj,ikv,Kaa) + r 2dt * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) * vv_b(ji,jj,Kaa) / ze3va140 puu(ji,jj,iku,Kaa) = puu(ji,jj,iku,Kaa) + rDt * 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) * uu_b(ji,jj,Kaa) / ze3ua 141 pvv(ji,jj,ikv,Kaa) = pvv(ji,jj,ikv,Kaa) + rDt * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) * vv_b(ji,jj,Kaa) / ze3va 147 142 END_2D 148 143 IF( ln_isfcav ) THEN ! Ocean cavities (ISF) … … 154 149 ze3va = ( 1._wp - r_vvl ) * e3v(ji,jj,ikv,Kmm) & 155 150 & + r_vvl * e3v(ji,jj,ikv,Kaa) 156 puu(ji,jj,iku,Kaa) = puu(ji,jj,iku,Kaa) + r 2dt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * uu_b(ji,jj,Kaa) / ze3ua157 pvv(ji,jj,ikv,Kaa) = pvv(ji,jj,ikv,Kaa) + r 2dt * 0.5*( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) * vv_b(ji,jj,Kaa) / ze3va151 puu(ji,jj,iku,Kaa) = puu(ji,jj,iku,Kaa) + rDt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * uu_b(ji,jj,Kaa) / ze3ua 152 pvv(ji,jj,ikv,Kaa) = pvv(ji,jj,ikv,Kaa) + rDt * 0.5*( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) * vv_b(ji,jj,Kaa) / ze3va 158 153 END_2D 159 154 END IF … … 163 158 ! 164 159 ! !* Matrix construction 165 zdt = r 2dt * 0.5160 zdt = rDt * 0.5 166 161 IF( ln_zad_Aimp ) THEN !! 167 162 SELECT CASE( nldf_dyn ) … … 250 245 ze3ua = ( 1._wp - r_vvl ) * e3u(ji,jj,iku,Kmm) & 251 246 & + r_vvl * e3u(ji,jj,iku,Kaa) ! after scale factor at T-point 252 zwd(ji,jj,iku) = zwd(ji,jj,iku) - r 2dt * 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) / ze3ua247 zwd(ji,jj,iku) = zwd(ji,jj,iku) - rDt * 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) / ze3ua 253 248 END_2D 254 249 IF ( ln_isfcav ) THEN ! top friction (always implicit) … … 258 253 ze3ua = ( 1._wp - r_vvl ) * e3u(ji,jj,iku,Kmm) & 259 254 & + r_vvl * e3u(ji,jj,iku,Kaa) ! after scale factor at T-point 260 zwd(ji,jj,iku) = zwd(ji,jj,iku) - r 2dt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) / ze3ua255 zwd(ji,jj,iku) = zwd(ji,jj,iku) - rDt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) / ze3ua 261 256 END_2D 262 257 END IF … … 285 280 ze3ua = ( 1._wp - r_vvl ) * e3u(ji,jj,1,Kmm) & 286 281 & + r_vvl * e3u(ji,jj,1,Kaa) 287 puu(ji,jj,1,Kaa) = puu(ji,jj,1,Kaa) + r 2dt * 0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) ) &288 & / ( ze3ua * r au0 ) * umask(ji,jj,1)282 puu(ji,jj,1,Kaa) = puu(ji,jj,1,Kaa) + rDt * 0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) ) & 283 & / ( ze3ua * rho0 ) * umask(ji,jj,1) 289 284 END_2D 290 285 DO_3D_00_00( 2, jpkm1 ) … … 302 297 ! 303 298 ! !* Matrix construction 304 zdt = r 2dt * 0.5299 zdt = rDt * 0.5 305 300 IF( ln_zad_Aimp ) THEN !! 306 301 SELECT CASE( nldf_dyn ) … … 388 383 ze3va = ( 1._wp - r_vvl ) * e3v(ji,jj,ikv,Kmm) & 389 384 & + r_vvl * e3v(ji,jj,ikv,Kaa) ! after scale factor at T-point 390 zwd(ji,jj,ikv) = zwd(ji,jj,ikv) - r 2dt * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) / ze3va385 zwd(ji,jj,ikv) = zwd(ji,jj,ikv) - rDt * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) / ze3va 391 386 END_2D 392 387 IF ( ln_isfcav ) THEN … … 395 390 ze3va = ( 1._wp - r_vvl ) * e3v(ji,jj,ikv,Kmm) & 396 391 & + r_vvl * e3v(ji,jj,ikv,Kaa) ! after scale factor at T-point 397 zwd(ji,jj,ikv) = zwd(ji,jj,ikv) - r 2dt * 0.5*( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) / ze3va392 zwd(ji,jj,ikv) = zwd(ji,jj,ikv) - rDt * 0.5*( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) / ze3va 398 393 END_2D 399 394 ENDIF … … 422 417 ze3va = ( 1._wp - r_vvl ) * e3v(ji,jj,1,Kmm) & 423 418 & + r_vvl * e3v(ji,jj,1,Kaa) 424 pvv(ji,jj,1,Kaa) = pvv(ji,jj,1,Kaa) + r 2dt * 0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) ) &425 & / ( ze3va * r au0 ) * vmask(ji,jj,1)419 pvv(ji,jj,1,Kaa) = pvv(ji,jj,1,Kaa) + rDt * 0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) ) & 420 & / ( ze3va * rho0 ) * vmask(ji,jj,1) 426 421 END_2D 427 422 DO_3D_00_00( 2, jpkm1 ) … … 437 432 ! 438 433 IF( l_trddyn ) THEN ! save the vertical diffusive trends for further diagnostics 439 ztrdu(:,:,:) = ( puu(:,:,:,Kaa) - puu(:,:,:,Kbb) ) / r 2dt - ztrdu(:,:,:)440 ztrdv(:,:,:) = ( pvv(:,:,:,Kaa) - pvv(:,:,:,Kbb) ) / r 2dt - ztrdv(:,:,:)434 ztrdu(:,:,:) = ( puu(:,:,:,Kaa) - puu(:,:,:,Kbb) ) / rDt - ztrdu(:,:,:) 435 ztrdv(:,:,:) = ( pvv(:,:,:,Kaa) - pvv(:,:,:,Kbb) ) / rDt - ztrdv(:,:,:) 441 436 CALL trd_dyn( ztrdu, ztrdv, jpdyn_zdf, kt, Kmm ) 442 437 DEALLOCATE( ztrdu, ztrdv ) -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DYN/sshwzv.F90
r12680 r12724 77 77 REAL(wp), DIMENSION(jpi,jpj,jpt), INTENT(inout) :: pssh ! sea-surface height 78 78 ! 79 INTEGER :: jk ! dummy loop indice80 REAL(wp) :: z 2dt, zcoef ! local scalars79 INTEGER :: jk ! dummy loop index 80 REAL(wp) :: zcoef ! local scalar 81 81 REAL(wp), DIMENSION(jpi,jpj) :: zhdiv ! 2D workspace 82 82 !!---------------------------------------------------------------------- … … 90 90 ENDIF 91 91 ! 92 z2dt = 2._wp * rdt ! set time step size (Euler/Leapfrog) 93 IF( neuler == 0 .AND. kt == nit000 ) z2dt = rdt 94 zcoef = 0.5_wp * r1_rau0 92 zcoef = 0.5_wp * r1_rho0 95 93 96 94 ! !------------------------------! … … 98 96 ! !------------------------------! 99 97 IF(ln_wd_il) THEN 100 CALL wad_lmt(pssh(:,:,Kbb), zcoef * (emp_b(:,:) + emp(:,:)), z2dt, Kmm, uu, vv )98 CALL wad_lmt(pssh(:,:,Kbb), zcoef * (emp_b(:,:) + emp(:,:)), rDt, Kmm, uu, vv ) 101 99 ENDIF 102 100 … … 111 109 ! compute the vertical velocity which can be used to compute the non-linear terms of the momentum equations. 112 110 ! 113 pssh(:,:,Kaa) = ( pssh(:,:,Kbb) - z2dt * ( zcoef * ( emp_b(:,:) + emp(:,:) ) + zhdiv(:,:) ) ) * ssmask(:,:)111 pssh(:,:,Kaa) = ( pssh(:,:,Kbb) - rDt * ( zcoef * ( emp_b(:,:) + emp(:,:) ) + zhdiv(:,:) ) ) * ssmask(:,:) 114 112 ! 115 113 #if defined key_agrif … … 155 153 ! 156 154 INTEGER :: ji, jj, jk ! dummy loop indices 157 REAL(wp) :: z1_2dt ! local scalars158 155 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zhdiv 159 156 !!---------------------------------------------------------------------- … … 168 165 pww(:,:,jpk) = 0._wp ! bottom boundary condition: w=0 (set once for all) 169 166 ENDIF 170 ! 171 z1_2dt = 1. / ( 2. * rdt ) ! set time step size (Euler/Leapfrog)172 IF( neuler == 0 .AND. kt == nit000 ) z1_2dt = 1. / rdt167 ! !------------------------------! 168 ! ! Now Vertical Velocity ! 169 ! !------------------------------! 173 170 ! 174 171 ! !===============================! … … 191 188 pww(:,:,jk) = pww(:,:,jk+1) - ( e3t(:,:,jk,Kmm) * hdiv(:,:,jk) & 192 189 & + zhdiv(:,:,jk) & 193 & + z1_2dt * (e3t(:,:,jk,Kaa) &190 & + r1_Dt * ( e3t(:,:,jk,Kaa) & 194 191 & - e3t(:,:,jk,Kbb) ) ) * tmask(:,:,jk) 195 192 END DO … … 206 203 ! !==========================================! 207 204 DO jk = jpkm1, 1, -1 ! integrate from the bottom the hor. divergence 208 pww(:,:,jk) = pww(:,:,jk+1) - ( e3t(:,:,jk,Kmm) * hdiv(:,:,jk) &209 & + z1_2dt * ( e3t(:,:,jk,Kaa)&210 & - e3t(:,:,jk,Kbb) )) * tmask(:,:,jk)205 pww(:,:,jk) = pww(:,:,jk+1) - ( e3t(:,:,jk,Kmm) * hdiv(:,:,jk) & 206 & + r1_Dt * ( e3t(:,:,jk,Kaa) & 207 & - e3t(:,:,jk,Kbb) ) ) * tmask(:,:,jk) 211 208 END DO 212 209 ENDIF … … 240 237 !! ** Method : - apply Asselin time fiter to now ssh (excluding the forcing 241 238 !! from the filter, see Leclair and Madec 2010) and swap : 242 !! pssh(:,:,Kmm) = pssh(:,:,Kaa) + atfp * ( pssh(:,:,Kbb) -2 pssh(:,:,Kmm) + pssh(:,:,Kaa) )243 !! - atfp * rdt * ( emp_b - emp ) / rau0239 !! pssh(:,:,Kmm) = pssh(:,:,Kaa) + rn_atfp * ( pssh(:,:,Kbb) -2 pssh(:,:,Kmm) + pssh(:,:,Kaa) ) 240 !! - rn_atfp * rn_Dt * ( emp_b - emp ) / rho0 244 241 !! 245 242 !! ** action : - pssh(:,:,Kmm) time filtered … … 262 259 ENDIF 263 260 ! !== Euler time-stepping: no filter, just swap ==! 264 IF ( .NOT.( neuler == 0 .AND. kt == nit000) ) THEN ! Only do time filtering for leapfrog timesteps261 IF ( .NOT.( l_1st_euler ) ) THEN ! Only do time filtering for leapfrog timesteps 265 262 ! ! filtered "now" field 266 pssh(:,:,Kmm) = pssh(:,:,Kmm) + atfp * ( pssh(:,:,Kbb) - 2 * pssh(:,:,Kmm) + pssh(:,:,Kaa) )263 pssh(:,:,Kmm) = pssh(:,:,Kmm) + rn_atfp * ( pssh(:,:,Kbb) - 2 * pssh(:,:,Kmm) + pssh(:,:,Kaa) ) 267 264 IF( .NOT.ln_linssh ) THEN ! "now" <-- with forcing removed 268 zcoef = atfp * rdt * r1_rau0265 zcoef = rn_atfp * rn_Dt * r1_rho0 269 266 pssh(:,:,Kmm) = pssh(:,:,Kmm) - zcoef * ( emp_b(:,:) - emp (:,:) & 270 267 & - rnf_b(:,:) + rnf (:,:) & … … 273 270 274 271 ! ice sheet coupling 275 IF ( ln_isf .AND. ln_isfcpl .AND. kt == nit000+1) pssh(:,:,Kbb) = pssh(:,:,Kbb) - atfp * rdt * ( risfcpl_ssh(:,:) - 0.0 ) * ssmask(:,:)272 IF ( ln_isf .AND. ln_isfcpl .AND. kt == nit000+1) pssh(:,:,Kbb) = pssh(:,:,Kbb) - rn_atfp * rn_Dt * ( risfcpl_ssh(:,:) - 0.0 ) * ssmask(:,:) 276 273 277 274 ENDIF … … 325 322 z1_e3t = 1._wp / e3t(ji,jj,jk,Kmm) 326 323 ! 2*rdt and not r2dt (for restartability) 327 Cu_adv(ji,jj,jk) = 2._wp * r dt * &324 Cu_adv(ji,jj,jk) = 2._wp * rDt * & 328 325 & ( ( MAX( ww(ji,jj,jk) , 0._wp ) - MIN( ww(ji,jj,jk+1) , 0._wp ) ) & 329 326 & + ( MAX( e2u(ji ,jj) * e3u(ji ,jj,jk,Kmm) & … … 343 340 z1_e3t = 1._wp / e3t(ji,jj,jk,Kmm) 344 341 ! 2*rdt and not r2dt (for restartability) 345 Cu_adv(ji,jj,jk) = 2._wp * r dt * &342 Cu_adv(ji,jj,jk) = 2._wp * rDt * & 346 343 & ( ( MAX( ww(ji,jj,jk) , 0._wp ) - MIN( ww(ji,jj,jk+1) , 0._wp ) ) & 347 344 & + ( MAX( e2u(ji ,jj)*e3u(ji ,jj,jk,Kmm)*uu(ji ,jj,jk,Kmm), 0._wp ) - & -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DYN/wet_dry.F90
r12622 r12724 271 271 272 272 273 SUBROUTINE wad_lmt_bt( zflxu, zflxv, sshn_e, zssh_frc, r dtbt)273 SUBROUTINE wad_lmt_bt( zflxu, zflxv, sshn_e, zssh_frc, rDt_e ) 274 274 !!---------------------------------------------------------------------- 275 275 !! *** ROUTINE wad_lmt *** … … 281 281 !! ** Action : - calculate flux limiter and W/D flag 282 282 !!---------------------------------------------------------------------- 283 REAL(wp) , INTENT(in ) :: r dtbt! ocean time-step index283 REAL(wp) , INTENT(in ) :: rDt_e ! ocean time-step index 284 284 REAL(wp), DIMENSION(:,:), INTENT(inout) :: zflxu, zflxv, sshn_e, zssh_frc 285 285 ! … … 300 300 zdepwd = 50._wp ! maximum depth that ocean cells can have W/D processes 301 301 ! 302 z2dt = r dtbt302 z2dt = rDt_e 303 303 ! 304 304 zflxp(:,:) = 0._wp -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/FLO/flo4rk.F90
r12622 r12724 131 131 ! computation of Runge-Kutta factor 132 132 DO jfl = 1, jpnfl 133 zrkxfl(jfl,jind) = r dt*zufl(jfl)134 zrkyfl(jfl,jind) = r dt*zvfl(jfl)135 zrkzfl(jfl,jind) = r dt*zwfl(jfl)133 zrkxfl(jfl,jind) = rn_Dt*zufl(jfl) 134 zrkyfl(jfl,jind) = rn_Dt*zvfl(jfl) 135 zrkzfl(jfl,jind) = rn_Dt*zwfl(jfl) 136 136 END DO 137 137 IF( jind /= 4 ) THEN -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/FLO/floblk.F90
r12622 r12724 185 185 zgidfl(jfl) = float(iioutfl(jfl) - iiinfl(jfl)) 186 186 IF( zufl(jfl)*zuoutfl <= 0. ) THEN 187 ztxfl(jfl) = 1.E99187 ztxfl(jfl) = HUGE(1._wp) 188 188 ELSE 189 189 IF( ABS(zudfl(jfl)) >= 1.E-5 ) THEN … … 201 201 zgjdfl(jfl) = float(ijoutfl(jfl)-ijinfl(jfl)) 202 202 IF( zvfl(jfl)*zvoutfl <= 0. ) THEN 203 ztyfl(jfl) = 1.E99203 ztyfl(jfl) = HUGE(1._wp) 204 204 ELSE 205 205 IF( ABS(zvdfl(jfl)) >= 1.E-5 ) THEN … … 218 218 zgkdfl(jfl) = float(ikoutfl(jfl) - ikinfl(jfl)) 219 219 IF( zwfl(jfl)*zwoutfl <= 0. ) THEN 220 ztzfl(jfl) = 1.E99220 ztzfl(jfl) = HUGE(1._wp) 221 221 ELSE 222 222 IF( ABS(zwdfl(jfl)) >= 1.E-5 ) THEN … … 243 243 ! test to know if the "age" of the float is not bigger than the 244 244 ! time step 245 IF( zagenewfl(jfl) > r dt ) THEN246 zttfl(jfl) = (r dt-zagefl(jfl)) / zvol247 zagenewfl(jfl) = r dt245 IF( zagenewfl(jfl) > rn_Dt ) THEN 246 zttfl(jfl) = (rn_Dt-zagefl(jfl)) / zvol 247 zagenewfl(jfl) = rn_Dt 248 248 ENDIF 249 249 … … 350 350 ifin = 1 351 351 DO jfl = 1, jpnfl 352 IF( zagefl(jfl) < r dt ) ifin = 0352 IF( zagefl(jfl) < rn_Dt ) ifin = 0 353 353 tpifl(jfl) = zgifl(jfl) + 0.5 354 354 tpjfl(jfl) = zgjfl(jfl) + 0.5 … … 357 357 ifin = 1 358 358 DO jfl = 1, jpnfl 359 IF( zagefl(jfl) < r dt ) ifin = 0359 IF( zagefl(jfl) < rn_Dt ) ifin = 0 360 360 tpifl(jfl) = zgifl(jfl) + 0.5 361 361 tpjfl(jfl) = zgjfl(jfl) + 0.5 -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/FLO/flowri.F90
r12377 r12724 122 122 ztem(jfl) = ts(iafloc,ibfloc,icfl,jp_tem,Kmm) 123 123 zsal (jfl) = ts(iafloc,ibfloc,icfl,jp_sal,Kmm) 124 zrho (jfl) = (rhd(iafloc,ibfloc,icfl)+1)*r au0124 zrho (jfl) = (rhd(iafloc,ibfloc,icfl)+1)*rho0 125 125 126 126 ENDIF … … 142 142 ztem(jfl) = ts(iafloc,ibfloc,icfl,jp_tem,Kmm) 143 143 zsal(jfl) = ts(iafloc,ibfloc,icfl,jp_sal,Kmm) 144 zrho(jfl) = (rhd(iafloc,ibfloc,icfl)+1)*r au0144 zrho(jfl) = (rhd(iafloc,ibfloc,icfl)+1)*rho0 145 145 146 146 ENDIF … … 245 245 !------------------------------- 246 246 irec = INT( (kt-nn_it000+1)/nn_writefl ) +1 247 ztime = ( kt-nn_it000 + 1 ) * r dt247 ztime = ( kt-nn_it000 + 1 ) * rn_Dt 248 248 249 249 CALL flioputv( numflo , 'time_counter', ztime , start=(/irec/) ) -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/ICB/icb_oce.F90
r10702 r12724 124 124 LOGICAL , PUBLIC :: ln_time_average_weight !: Time average the weight on the ocean !!gm I don't understand that ! 125 125 REAL(wp), PUBLIC :: rn_speed_limit !: CFL speed limit for a berg 126 ! 127 ! restart 128 CHARACTER(len=256), PUBLIC :: cn_icbrst_indir , cn_icbrst_in !: in: restart directory, restart name 129 CHARACTER(len=256), PUBLIC :: cn_icbrst_outdir, cn_icbrst_out !: out: restart directory, restart name 126 130 ! 127 131 ! ! Mass thresholds between iceberg classes [kg] -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/ICB/icbini.F90
r12377 r12724 60 60 !! - setup either test icebergs or calving file 61 61 !!---------------------------------------------------------------------- 62 REAL(wp), INTENT(in) :: pdt ! iceberg time-step (r dt*nn_fsbc)62 REAL(wp), INTENT(in) :: pdt ! iceberg time-step (rn_Dt*nn_fsbc) 63 63 INTEGER , INTENT(in) :: kt ! time step number 64 64 ! … … 383 383 & rn_bits_erosion_fraction , rn_sicn_shift , ln_passive_mode , & 384 384 & ln_time_average_weight , nn_test_icebergs , rn_test_box , & 385 & ln_use_calving , rn_speed_limit , cn_dir, sn_icb 385 & ln_use_calving , rn_speed_limit , cn_dir, sn_icb , & 386 & cn_icbrst_indir, cn_icbrst_in , cn_icbrst_outdir , cn_icbrst_out 386 387 !!---------------------------------------------------------------------- 387 388 -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/ICB/icbrst.F90
r11536 r12724 69 69 TYPE(point) :: localpt ! NOT a pointer but an actual local variable 70 70 !!---------------------------------------------------------------------- 71 72 71 ! Find a restart file. Assume iceberg restarts in same directory as ocean restarts 73 72 ! and are called TRIM(cn_ocerst)//'_icebergs' 74 cl_path = TRIM(cn_ ocerst_indir)73 cl_path = TRIM(cn_icbrst_indir) 75 74 IF( cl_path(LEN_TRIM(cl_path):) /= '/' ) cl_path = TRIM(cl_path) // '/' 76 cl_filename = TRIM(cn_ ocerst_in)//'_icebergs'75 cl_filename = TRIM(cn_icbrst_in) 77 76 CALL iom_open( TRIM(cl_path)//cl_filename, ncid ) 78 77 … … 192 191 CHARACTER(len=256) :: cl_path 193 192 CHARACTER(len=256) :: cl_filename 193 CHARACTER(len=256) :: cl_kt 194 194 TYPE(iceberg), POINTER :: this 195 195 TYPE(point) , POINTER :: pt … … 204 204 ! Only operate on the restart timestep itself. 205 205 ! Assume we write iceberg restarts to same directory as ocean restarts. 206 cl_path = TRIM(cn_ocerst_outdir) 206 ! 207 ! directory name 208 cl_path = TRIM(cn_icbrst_outdir) 207 209 IF( cl_path(LEN_TRIM(cl_path):) /= '/' ) cl_path = TRIM(cl_path) // '/' 210 ! 211 ! file name 212 WRITE(cl_kt, '(i8.8)') kt 213 cl_filename = TRIM(cexper)//"_"//TRIM(ADJUSTL(cl_kt))//"_"//TRIM(cn_icbrst_out) 208 214 IF( lk_mpp ) THEN 209 WRITE(cl_filename,'(A,"_ icebergs_",I8.8,"_restart_",I4.4,".nc")') TRIM(cexper), kt, narea-1215 WRITE(cl_filename,'(A,"_",I4.4,".nc")') TRIM(cl_filename), narea-1 210 216 ELSE 211 WRITE(cl_filename,'(A," _icebergs_",I8.8,"_restart.nc")') TRIM(cexper), kt217 WRITE(cl_filename,'(A,".nc")') TRIM(cl_filename) 212 218 ENDIF 219 213 220 IF ( lwp .AND. nn_verbose_level >= 0) WRITE(numout,'(2a)') 'icebergs, write_restart: creating ', & 214 221 & TRIM(cl_path)//TRIM(cl_filename) -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/ICB/icbtrj.F90
r10068 r12724 74 74 75 75 ! compute end time step date 76 zfjulday = fjulday + r dt / rday * REAL( nitend - nit000 + 1 , wp)76 zfjulday = fjulday + rn_Dt / rday * REAL( nitend - nit000 + 1 , wp) 77 77 IF( ABS(zfjulday - REAL(NINT(zfjulday),wp)) < 0.1 / rday ) zfjulday = REAL(NINT(zfjulday),wp) ! avoid truncation error 78 78 CALL ju2ymds( zfjulday, iyear, imonth, iday, zsec ) -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/IOM/iom.F90
r12377 r12724 111 111 CHARACTER(len=lc) :: clname 112 112 INTEGER :: irefyear, irefmonth, irefday 113 INTEGER :: ji , jkmin113 INTEGER :: ji 114 114 LOGICAL :: llrst_context ! is context related to restart 115 115 ! … … 220 220 221 221 ! Add vertical grid bounds 222 jkmin = MIN(2,jpk) ! in case jpk=1 (i.e. sas2D) 223 zt_bnds(2,: ) = gdept_1d(:) 224 zt_bnds(1,jkmin:jpk) = gdept_1d(1:jpkm1) 225 zt_bnds(1,1 ) = gdept_1d(1) - e3w_1d(1) 226 zw_bnds(1,: ) = gdepw_1d(:) 227 zw_bnds(2,1:jpkm1 ) = gdepw_1d(jkmin:jpk) 228 zw_bnds(2,jpk: ) = gdepw_1d(jpk) + e3t_1d(jpk) 222 zt_bnds(2,: ) = gdept_1d(:) 223 zt_bnds(1,2:jpk ) = gdept_1d(1:jpkm1) 224 zt_bnds(1,1 ) = gdept_1d(1) - e3w_1d(1) 225 zw_bnds(1,: ) = gdepw_1d(:) 226 zw_bnds(2,1:jpkm1) = gdepw_1d(2:jpk) 227 zw_bnds(2,jpk: ) = gdepw_1d(jpk) + e3t_1d(jpk) 229 228 CALL iom_set_axis_attr( "deptht", bounds=zw_bnds ) 230 229 CALL iom_set_axis_attr( "depthu", bounds=zw_bnds ) … … 274 273 ! 275 274 ! set time step length 276 dtime%second = r dt275 dtime%second = rn_Dt 277 276 CALL xios_set_timestep( dtime ) 278 277 ! … … 410 409 IF(cdmdl == "OPA") THEN 411 410 !from restart.F90 412 CALL iom_set_rstw_var_active("r dt")411 CALL iom_set_rstw_var_active("rn_Dt") 413 412 IF ( .NOT. ln_diurnal_only ) THEN 414 413 CALL iom_set_rstw_var_active('ub' ) … … 448 447 449 448 i = 0 450 i = i + 1; fields(i)%vname="r dt"; fields(i)%grid="grid_scalar"449 i = i + 1; fields(i)%vname="rn_Dt"; fields(i)%grid="grid_scalar" 451 450 i = i + 1; fields(i)%vname="un"; fields(i)%grid="grid_N_3D" 452 451 i = i + 1; fields(i)%vname="ub"; fields(i)%grid="grid_N_3D" … … 665 664 666 665 667 SUBROUTINE iom_open( cdname, kiomid, ldwrt, kdom, ldstop, ldiof, kdlev )666 SUBROUTINE iom_open( cdname, kiomid, ldwrt, kdom, ldstop, ldiof, kdlev, cdcomp ) 668 667 !!--------------------------------------------------------------------- 669 668 !! *** SUBROUTINE iom_open *** … … 678 677 LOGICAL , INTENT(in ), OPTIONAL :: ldiof ! Interp On the Fly, needed for AGRIF (default = .FALSE.) 679 678 INTEGER , INTENT(in ), OPTIONAL :: kdlev ! number of vertical levels 679 CHARACTER(len=3), INTENT(in ), OPTIONAL :: cdcomp ! name of component calling iom_nf90_open 680 680 ! 681 681 CHARACTER(LEN=256) :: clname ! the name of the file based on cdname [[+clcpu]+clcpu] … … 823 823 ENDIF 824 824 IF( istop == nstop ) THEN ! no error within this routine 825 CALL iom_nf90_open( clname, kiomid, llwrt, llok, idompar, kdlev = kdlev )825 CALL iom_nf90_open( clname, kiomid, llwrt, llok, idompar, kdlev = kdlev, cdcomp = cdcomp ) 826 826 ENDIF 827 827 ! … … 2358 2358 idx = INDEX(clname,'@startdate@') + INDEX(clname,'@STARTDATE@') 2359 2359 DO WHILE ( idx /= 0 ) 2360 cldate = iom_sdate( fjulday - r dt / rday )2360 cldate = iom_sdate( fjulday - rn_Dt / rday ) 2361 2361 clname = clname(1:idx-1)//TRIM(cldate)//clname(idx+11:LEN_TRIM(clname)) 2362 2362 idx = INDEX(clname,'@startdate@') + INDEX(clname,'@STARTDATE@') … … 2365 2365 idx = INDEX(clname,'@startdatefull@') + INDEX(clname,'@STARTDATEFULL@') 2366 2366 DO WHILE ( idx /= 0 ) 2367 cldate = iom_sdate( fjulday - r dt / rday, ldfull = .TRUE. )2367 cldate = iom_sdate( fjulday - rn_Dt / rday, ldfull = .TRUE. ) 2368 2368 clname = clname(1:idx-1)//TRIM(cldate)//clname(idx+15:LEN_TRIM(clname)) 2369 2369 idx = INDEX(clname,'@startdatefull@') + INDEX(clname,'@STARTDATEFULL@') … … 2372 2372 idx = INDEX(clname,'@enddate@') + INDEX(clname,'@ENDDATE@') 2373 2373 DO WHILE ( idx /= 0 ) 2374 cldate = iom_sdate( fjulday + r dt / rday * REAL( nitend - nit000, wp ), ld24 = .TRUE. )2374 cldate = iom_sdate( fjulday + rn_Dt / rday * REAL( nitend - nit000, wp ), ld24 = .TRUE. ) 2375 2375 clname = clname(1:idx-1)//TRIM(cldate)//clname(idx+9:LEN_TRIM(clname)) 2376 2376 idx = INDEX(clname,'@enddate@') + INDEX(clname,'@ENDDATE@') … … 2379 2379 idx = INDEX(clname,'@enddatefull@') + INDEX(clname,'@ENDDATEFULL@') 2380 2380 DO WHILE ( idx /= 0 ) 2381 cldate = iom_sdate( fjulday + r dt / rday * REAL( nitend - nit000, wp ), ld24 = .TRUE., ldfull = .TRUE. )2381 cldate = iom_sdate( fjulday + rn_Dt / rday * REAL( nitend - nit000, wp ), ld24 = .TRUE., ldfull = .TRUE. ) 2382 2382 clname = clname(1:idx-1)//TRIM(cldate)//clname(idx+13:LEN_TRIM(clname)) 2383 2383 idx = INDEX(clname,'@enddatefull@') + INDEX(clname,'@ENDDATEFULL@') -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/IOM/iom_def.F90
r12377 r12724 50 50 TYPE, PUBLIC :: file_descriptor 51 51 CHARACTER(LEN=240) :: name !: name of the file 52 CHARACTER(LEN=3 ) :: comp !: name of component opening the file ('OCE', 'ICE'...) 52 53 INTEGER :: nfid !: identifier of the file (0 if closed) 53 54 !: jpioipsl option has been removed) … … 64 65 REAL(kind=wp), DIMENSION(jpmax_vars) :: scf !: scale_factor of the variables 65 66 REAL(kind=wp), DIMENSION(jpmax_vars) :: ofs !: add_offset of the variables 66 INTEGER :: nlev ! number of vertical levels67 67 END TYPE file_descriptor 68 68 TYPE(file_descriptor), DIMENSION(jpmax_files), PUBLIC :: iom_file !: array containing the info for all opened files -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/IOM/iom_nf90.F90
r12377 r12724 19 19 !!---------------------------------------------------------------------- 20 20 USE dom_oce ! ocean space and time domain 21 USE sbc_oce, ONLY: jpka,ght_abl ! abl vertical level number and height21 USE sbc_oce, ONLY: ght_abl ! abl vertical level number and height 22 22 USE lbclnk ! lateal boundary condition / mpp exchanges 23 23 USE iom_def ! iom variables definitions … … 46 46 CONTAINS 47 47 48 SUBROUTINE iom_nf90_open( cdname, kiomid, ldwrt, ldok, kdompar, kdlev )48 SUBROUTINE iom_nf90_open( cdname, kiomid, ldwrt, ldok, kdompar, kdlev, cdcomp ) 49 49 !!--------------------------------------------------------------------- 50 50 !! *** SUBROUTINE iom_open *** … … 58 58 INTEGER, DIMENSION(2,5), INTENT(in ), OPTIONAL :: kdompar ! domain parameters: 59 59 INTEGER , INTENT(in ), OPTIONAL :: kdlev ! size of the ice/abl third dimension 60 CHARACTER(len=3) , INTENT(in ), OPTIONAL :: cdcomp ! name of component calling iom_nf90_open 60 61 61 62 CHARACTER(LEN=256) :: clinfo ! info character 62 63 CHARACTER(LEN=256) :: cltmp ! temporary character 64 CHARACTER(LEN=3 ) :: clcomp ! name of component calling iom_nf90_open 63 65 INTEGER :: iln ! lengths of character 64 66 INTEGER :: istop ! temporary storage of nstop … … 70 72 INTEGER :: ihdf5 ! local variable for retrieval of value for NF90_HDF5 71 73 LOGICAL :: llclobber ! local definition of ln_clobber 72 INTEGER :: ilevels ! vertical levels73 74 !--------------------------------------------------------------------- 74 75 ! … … 77 78 ! 78 79 ! !number of vertical levels 79 IF( PRESENT(kdlev) ) THEN ; ilevels = kdlev ! use input value (useful for sea-ice and abl) 80 ELSE ; ilevels = jpk ! by default jpk 80 IF( PRESENT(cdcomp) ) THEN 81 IF( .NOT. PRESENT(kdlev) ) CALL ctl_stop( 'iom_nf90_open: cdcomp and kdlev must both be present' ) 82 clcomp = cdcomp ! use input value 83 ELSE 84 clcomp = 'OCE' ! by default 81 85 ENDIF 82 86 ! … … 125 129 CALL iom_nf90_check(NF90_SET_FILL( if90id, NF90_NOFILL, idmy ), clinfo) 126 130 ! define dimensions 127 CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'x', kdompar(1,1), idmy ), clinfo) 128 CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'y', kdompar(2,1), idmy ), clinfo) 129 IF( PRESENT(kdlev) ) THEN 130 IF( kdlev == jpka ) THEN 131 CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'nav_lev', kdlev, idmy ), clinfo) 132 CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'time_counter', NF90_UNLIMITED, idmy ), clinfo) 133 ELSE 134 CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'nav_lev', jpk, idmy ), clinfo) 135 CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'time_counter', NF90_UNLIMITED, idmy ), clinfo) 136 CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'numcat', kdlev, idmy ), clinfo) 137 ENDIF 138 ELSE 139 CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'nav_lev', jpk, idmy ), clinfo) 140 CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'time_counter', NF90_UNLIMITED, idmy ), clinfo) 141 ENDIF 131 CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'x', kdompar(1,1), idmy ), clinfo) 132 CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'y', kdompar(2,1), idmy ), clinfo) 133 SELECT CASE (clcomp) 134 CASE ('OCE') ; CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'nav_lev', jpk, idmy ), clinfo) 135 CASE ('ICE') ; CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'numcat', kdlev, idmy ), clinfo) 136 CASE ('ABL') ; CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'nav_lev', kdlev, idmy ), clinfo) 137 CASE ('SED') ; CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'numsed', kdlev, idmy ), clinfo) 138 CASE DEFAULT ; CALL ctl_stop( 'iom_nf90_open unknown component type' ) 139 END SELECT 140 CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'time_counter', NF90_UNLIMITED, idmy ), clinfo) 142 141 ! global attributes 143 142 CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_number_total' , jpnij ), clinfo) … … 165 164 ENDDO 166 165 iom_file(kiomid)%name = TRIM(cdname) 166 iom_file(kiomid)%comp = clcomp 167 167 iom_file(kiomid)%nfid = if90id 168 168 iom_file(kiomid)%nvars = 0 169 169 iom_file(kiomid)%irec = -1 ! useless for NetCDF files, used to know if the file is in define mode 170 iom_file(kiomid)%nlev = ilevels171 170 CALL iom_nf90_check(NF90_Inquire(if90id, unlimitedDimId = iom_file(kiomid)%iduld), clinfo) 172 171 IF( iom_file(kiomid)%iduld .GE. 0 ) THEN … … 529 528 INTEGER, DIMENSION(4) :: idimid ! dimensions id 530 529 CHARACTER(LEN=256) :: clinfo ! info character 531 CHARACTER(LEN= 12), DIMENSION(5) :: cltmp ! temporary character532 530 INTEGER :: if90id ! nf90 file identifier 533 INTEGER :: idmy ! dummy variable534 531 INTEGER :: itype ! variable type 535 532 INTEGER, DIMENSION(4) :: ichunksz ! NetCDF4 chunk sizes. Will be computed using … … 540 537 ! ! when appropriate (currently chunking is applied to 4d fields only) 541 538 INTEGER :: idlv ! local variable 542 INTEGER :: idim3 ! id of the third dimension543 539 !--------------------------------------------------------------------- 544 540 ! … … 554 550 ENDIF 555 551 ! define the dimension variables if it is not already done 556 ! Warning: we must use the same character length in an array constructor (at least for gcc compiler) 557 cltmp = (/ 'nav_lon ', 'nav_lat ', 'nav_lev ', 'time_counter', 'numcat ' /) 558 CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(1)), NF90_FLOAT , (/ 1, 2 /), iom_file(kiomid)%nvid(1) ), clinfo) 559 CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(2)), NF90_FLOAT , (/ 1, 2 /), iom_file(kiomid)%nvid(2) ), clinfo) 560 CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(3)), NF90_FLOAT , (/ 3 /), iom_file(kiomid)%nvid(3) ), clinfo) 561 CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(4)), NF90_DOUBLE, (/ 4 /), iom_file(kiomid)%nvid(4) ), clinfo) 552 DO jd = 1, 2 553 CALL iom_nf90_check(NF90_INQUIRE_DIMENSION(if90id,jd,iom_file(kiomid)%cn_var(jd),iom_file(kiomid)%dimsz(jd,jd)),clinfo) 554 CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(iom_file(kiomid)%cn_var(jd)), NF90_FLOAT , (/ 1, 2 /), & 555 & iom_file(kiomid)%nvid(jd) ), clinfo) 556 END DO 557 iom_file(kiomid)%dimsz(2,1) = iom_file(kiomid)%dimsz(2,2) ! second dim of first variable 558 iom_file(kiomid)%dimsz(1,2) = iom_file(kiomid)%dimsz(1,1) ! first dim of second variable 559 DO jd = 3, 4 560 CALL iom_nf90_check(NF90_INQUIRE_DIMENSION(if90id,jd,iom_file(kiomid)%cn_var(jd),iom_file(kiomid)%dimsz(1,jd)), clinfo) 561 CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(iom_file(kiomid)%cn_var(jd)), NF90_FLOAT , (/ jd /), & 562 & iom_file(kiomid)%nvid(jd) ), clinfo) 563 END DO 562 564 ! update informations structure related the dimension variable we just added... 563 565 iom_file(kiomid)%nvars = 4 564 566 iom_file(kiomid)%luld(1:4) = (/ .FALSE., .FALSE., .FALSE., .TRUE. /) 565 iom_file(kiomid)%cn_var(1:4) = cltmp(1:4)566 567 iom_file(kiomid)%ndims(1:4) = (/ 2, 2, 1, 1 /) 567 IF( NF90_INQ_DIMID( if90id, 'numcat', idmy ) == nf90_noerr ) THEN ! add a 5th variable corresponding to the 5th dimension568 CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(5)), NF90_FLOAT , (/ 5 /), iom_file(kiomid)%nvid(5) ), clinfo)569 iom_file(kiomid)%nvars = 5570 iom_file(kiomid)%luld(5) = .FALSE.571 iom_file(kiomid)%cn_var(5) = cltmp(5)572 iom_file(kiomid)%ndims(5) = 1573 ENDIF574 ! trick: defined to 0 to say that dimension variables are defined but not yet written575 iom_file(kiomid)%dimsz(1, 1) = 0576 568 IF(lwp) WRITE(numout,*) TRIM(clinfo)//' define dimension variables done' 577 569 ENDIF … … 594 586 IF( PRESENT(pv_r0d) ) THEN ; idims = 0 595 587 ELSEIF( PRESENT(pv_r1d) ) THEN 596 IF(( SIZE(pv_r1d,1) == jpk ).OR.( SIZE(pv_r1d,1) == jpka )) THEN ; idim3 = 3 597 ELSE ; idim3 = 5 598 ENDIF 599 idims = 2 ; idimid(1:idims) = (/idim3,4/) 600 ELSEIF( PRESENT(pv_r2d) ) THEN ; idims = 3 ; idimid(1:idims) = (/1,2 ,4/) 588 idims = 2 ; idimid(1:idims) = (/3,4/) 589 ELSEIF( PRESENT(pv_r2d) ) THEN ; idims = 3 ; idimid(1:idims) = (/1,2,4/) 601 590 ELSEIF( PRESENT(pv_r3d) ) THEN 602 IF(( SIZE(pv_r3d,3) == jpk ).OR.( SIZE(pv_r3d,3) == jpka )) THEN ; idim3 = 3 603 ELSE ; idim3 = 5 604 ENDIF 605 idims = 4 ; idimid(1:idims) = (/1,2,idim3,4/) 591 idims = 4 ; idimid(1:idims) = (/1,2,3,4/) 606 592 ENDIF 607 593 IF( PRESENT(ktype) ) THEN ! variable external type … … 678 664 ! ============= 679 665 ! trick: is defined to 0 => dimension variable are defined but not yet written 680 IF( iom_file(kiomid)%dimsz(1, 1) == 0 ) THEN 681 CALL iom_nf90_check( NF90_INQ_VARID( if90id, 'nav_lon' , idmy ) , clinfo ) 682 CALL iom_nf90_check( NF90_PUT_VAR ( if90id, idmy, glamt(ix1:ix2, iy1:iy2) ), clinfo ) 683 CALL iom_nf90_check( NF90_INQ_VARID( if90id, 'nav_lat' , idmy ) , clinfo ) 684 CALL iom_nf90_check( NF90_PUT_VAR ( if90id, idmy, gphit(ix1:ix2, iy1:iy2) ), clinfo ) 685 CALL iom_nf90_check( NF90_INQ_VARID( if90id, 'nav_lev' , idmy ), clinfo ) 686 IF (iom_file(kiomid)%nlev == jpka) THEN ; CALL iom_nf90_check( NF90_PUT_VAR ( if90id, idmy, ght_abl), clinfo ) 687 ELSE ; CALL iom_nf90_check( NF90_PUT_VAR ( if90id, idmy, gdept_1d), clinfo ) 688 ENDIF 689 IF( NF90_INQ_VARID( if90id, 'numcat', idmy ) == nf90_noerr ) THEN 690 CALL iom_nf90_check( NF90_PUT_VAR ( if90id, idmy, (/ (idlv, idlv = 1,iom_file(kiomid)%nlev) /)), clinfo ) 691 ENDIF 692 ! +++ WRONG VALUE: to be improved but not really useful... 693 CALL iom_nf90_check( NF90_INQ_VARID( if90id, 'time_counter', idmy ), clinfo ) 694 CALL iom_nf90_check( NF90_PUT_VAR( if90id, idmy, kt ), clinfo ) 695 ! update the values of the variables dimensions size 696 CALL iom_nf90_check( NF90_INQUIRE_DIMENSION( if90id, 1, len = iom_file(kiomid)%dimsz(1,1) ), clinfo ) 697 CALL iom_nf90_check( NF90_INQUIRE_DIMENSION( if90id, 2, len = iom_file(kiomid)%dimsz(2,1) ), clinfo ) 698 iom_file(kiomid)%dimsz(1:2, 2) = iom_file(kiomid)%dimsz(1:2, 1) 699 CALL iom_nf90_check( NF90_INQUIRE_DIMENSION( if90id, 3, len = iom_file(kiomid)%dimsz(1,3) ), clinfo ) 700 iom_file(kiomid)%dimsz(1 , 4) = 1 ! unlimited dimension 666 IF( iom_file(kiomid)%dimsz(1, 4) == 0 ) THEN ! time_counter = 0 667 CALL iom_nf90_check( NF90_PUT_VAR( if90id, 1, glamt(ix1:ix2, iy1:iy2) ), clinfo ) 668 CALL iom_nf90_check( NF90_PUT_VAR( if90id, 2, gphit(ix1:ix2, iy1:iy2) ), clinfo ) 669 SELECT CASE (iom_file(kiomid)%comp) 670 CASE ('OCE') 671 CALL iom_nf90_check( NF90_PUT_VAR( if90id, 3, gdept_1d ), clinfo ) 672 CASE ('ABL') 673 CALL iom_nf90_check( NF90_PUT_VAR( if90id, 3, ght_abl ), clinfo ) 674 CASE DEFAULT 675 CALL iom_nf90_check( NF90_PUT_VAR( if90id, 3, (/ (idlv, idlv = 1,iom_file(kiomid)%dimsz(1,3)) /) ), clinfo ) 676 END SELECT 677 ! "wrong" value: to be improved but not really useful... 678 CALL iom_nf90_check( NF90_PUT_VAR( if90id, 4, kt ), clinfo ) 679 ! update the size of the variable corresponding to the unlimited dimension 680 iom_file(kiomid)%dimsz(1, 4) = 1 ! so we don't enter this IF case any more... 701 681 IF(lwp) WRITE(numout,*) TRIM(clinfo)//' write dimension variables done' 702 682 ENDIF -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/IOM/restart.F90
r12680 r12724 144 144 !!---------------------------------------------------------------------- 145 145 IF(lwxios) CALL iom_swap( cwxios_context ) 146 CALL iom_rstput( kt, nitrst, numrow, 'rdt' , r dt , ldxios = lwxios) ! dynamics time step146 CALL iom_rstput( kt, nitrst, numrow, 'rdt' , rn_Dt , ldxios = lwxios) ! dynamics time step 147 147 CALL iom_delay_rst( 'WRITE', 'OCE', numrow ) ! save only ocean delayed global communication variables 148 148 … … 247 247 IF( iom_varid( numror, 'rdt', ldstop = .FALSE. ) > 0 ) THEN 248 248 CALL iom_get( numror, 'rdt', zrdt, ldxios = lrxios ) 249 IF( zrdt /= rdt ) neuler = 0 249 IF( zrdt /= rn_Dt ) THEN 250 IF(lwp) WRITE( numout,*) 251 IF(lwp) WRITE( numout,*) 'rst_read: rdt not equal to the read one' 252 IF(lwp) WRITE( numout,*) 253 IF(lwp) WRITE( numout,*) ' ==>>> forced euler first time-step' 254 l_1st_euler = .TRUE. 255 ENDIF 250 256 ENDIF 251 257 … … 256 262 IF ( ln_diurnal_only ) THEN 257 263 IF(lwp) WRITE( numout, * ) & 258 & "rst_read:- ln_diurnal_only set, setting rhop=r au0"259 rhop = r au0264 & "rst_read:- ln_diurnal_only set, setting rhop=rho0" 265 rhop = rho0 260 266 CALL iom_get( numror, jpdom_autoglo, 'tn' , w3d, ldxios = lrxios ) 261 267 ts(:,:,1,jp_tem,Kmm) = w3d(:,:,1) … … 270 276 CALL iom_get( numror, jpdom_autoglo, 'sshb' ,ssh(:,: ,Kbb), ldxios = lrxios ) 271 277 ELSE 272 neuler = 0278 l_1st_euler = .TRUE. ! before field not found, forced euler 1st time-step 273 279 ENDIF 274 280 ! … … 284 290 ENDIF 285 291 ! 286 IF( neuler == 0 ) THEN ! Euler restart (neuler=0)292 IF( l_1st_euler ) THEN ! Euler restart 287 293 ts (:,:,:,:,Kbb) = ts (:,:,:,:,Kmm) ! all before fields set to now values 288 294 uu (:,:,: ,Kbb) = uu (:,:,: ,Kmm) -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/ISF/isfcav.F90
r12343 r12724 24 24 USE oce , ONLY: ts ! ocean tracers 25 25 USE par_oce , ONLY: jpi,jpj ! ocean space and time domain 26 USE phycst , ONLY: grav,r au0,rau0_rcp,r1_rau0_rcp ! physical constants26 USE phycst , ONLY: grav,rho0,rho0_rcp,r1_rho0_rcp ! physical constants 27 27 USE eosbn2 , ONLY: ln_teos10 ! use ln_teos10 or not 28 28 ! … … 85 85 ! 86 86 ! initialisation 87 IF (TRIM(cn_gammablk) == 'vel_stab' ) zqoce_b (:,:) = ptsc(:,:,jp_tem) * r au0_rcp ! last time step total heat fluxes (to speed up convergence)87 IF (TRIM(cn_gammablk) == 'vel_stab' ) zqoce_b (:,:) = ptsc(:,:,jp_tem) * rho0_rcp ! last time step total heat fluxes (to speed up convergence) 88 88 ! 89 89 ! compute ice shelf melting … … 142 142 ! 143 143 ! set temperature content 144 ptsc(:,:,jp_tem) = - zqh(:,:) * r1_r au0_rcp144 ptsc(:,:,jp_tem) = - zqh(:,:) * r1_rho0_rcp 145 145 ! 146 146 ! write restart variables (qoceisf, qhcisf, fwfisf for now and before) … … 215 215 risf_lamb1 =-0.0564_wp 216 216 risf_lamb2 = 0.0773_wp 217 risf_lamb3 =-7.8633e-8 * grav * r au0217 risf_lamb3 =-7.8633e-8 * grav * rho0 218 218 ELSE ! linearisation from table 4 (Asay-Davis et al., 2015) 219 219 risf_lamb1 =-0.0573_wp 220 220 risf_lamb2 = 0.0832_wp 221 risf_lamb3 =-7.5300e-8 * grav * r au0221 risf_lamb3 =-7.5300e-8 * grav * rho0 222 222 ENDIF 223 223 -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/ISF/isfcavmlt.F90
r12340 r12724 17 17 18 18 USE dom_oce ! ocean space and time domain 19 USE phycst , ONLY: rcp, r au0, rau0_rcp ! physical constants19 USE phycst , ONLY: rcp, rho0, rho0_rcp ! physical constants 20 20 USE eosbn2 , ONLY: eos_fzp ! equation of state 21 21 … … 161 161 ! 162 162 ! compute ocean-ice heat flux and then derive fwf assuming that ocean heat flux equal latent heat 163 pqfwf(:,:) = - pgt(:,:) * r au0_rcp * zthd(:,:) / rLfusisf ! fresh water flux ( > 0 out )163 pqfwf(:,:) = - pgt(:,:) * rho0_rcp * zthd(:,:) / rLfusisf ! fresh water flux ( > 0 out ) 164 164 pqoce(:,:) = - pqfwf(:,:) * rLfusisf ! ocea-ice flux ( > 0 out ) 165 165 pqhc (:,:) = pqfwf(:,:) * ztfrz(:,:) * rcp ! heat content flux ( > 0 out ) … … 213 213 ! 214 214 ! compute coeficient to solve the 2nd order equation 215 zeps1 = r au0_rcp * pgt(ji,jj)216 zeps2 = rLfusisf * r au0 * pgs(ji,jj)215 zeps1 = rho0_rcp * pgt(ji,jj) 216 zeps2 = rLfusisf * rho0 * pgs(ji,jj) 217 217 zeps3 = rhoisf * rcpisf * rkappa / MAX(risfdep(ji,jj),zeps) 218 218 zeps4 = risf_lamb2 + risf_lamb3 * risfdep(ji,jj) … … 238 238 ! 239 239 ! compute the upward water and heat flux (eq. 24 and eq. 26) 240 pqfwf(ji,jj) = r au0 * pgs(ji,jj) * ( zsfrz - pstbl(ji,jj) ) / MAX(zsfrz,zeps) ! fresh water flux (> 0 out)241 pqoce(ji,jj) = r au0_rcp * pgt(ji,jj) * zthd (ji,jj) ! ocean-ice heat flux (> 0 out)240 pqfwf(ji,jj) = rho0 * pgs(ji,jj) * ( zsfrz - pstbl(ji,jj) ) / MAX(zsfrz,zeps) ! fresh water flux (> 0 out) 241 pqoce(ji,jj) = rho0_rcp * pgt(ji,jj) * zthd (ji,jj) ! ocean-ice heat flux (> 0 out) 242 242 pqhc (ji,jj) = rcp * pqfwf(ji,jj) * ztfrz(ji,jj) ! heat content flux (> 0 out) 243 243 ! -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/ISF/isfcpl.F90
r12680 r12724 73 73 ! 74 74 ! start on an euler time step 75 neuler = 075 l_1st_euler = .TRUE. 76 76 ! 77 77 ! allocation and initialisation to 0 … … 525 525 ! compute run length 526 526 nstp_iscpl = nitend - nit000 + 1 527 rdt_iscpl = nstp_iscpl * rn_ rdt527 rdt_iscpl = nstp_iscpl * rn_Dt 528 528 z1_rdtiscpl = 1._wp / rdt_iscpl 529 529 -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/ISF/isfdynatf.F90
r12616 r12724 13 13 USE isf_oce 14 14 15 USE phycst , ONLY: r1_r au0 ! physical constant15 USE phycst , ONLY: r1_rho0 ! physical constant 16 16 USE dom_oce ! time and space domain 17 17 … … 40 40 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pe3t_f ! time filtered scale factor to be corrected 41 41 ! 42 REAL(wp) , INTENT(in ) :: pcoef ! atfp * rdt * r1_rau042 REAL(wp) , INTENT(in ) :: pcoef ! rn_atfp * rn_Dt * r1_rho0 43 43 !!-------------------------------------------------------------------- 44 44 INTEGER :: jk ! loop index … … 71 71 REAL(wp), DIMENSION(jpi,jpj) , INTENT(in ) :: pfrac, phtbl ! fraction of bottom cell included in tbl, tbl thickness 72 72 REAL(wp), DIMENSION(jpi,jpj) , INTENT(in ) :: pfwf , pfwf_b ! now/before fwf 73 REAL(wp), INTENT(in ) :: pcoef ! atfp * rdt * r1_rau073 REAL(wp), INTENT(in ) :: pcoef ! rn_atfp * rn_Dt * r1_rho0 74 74 !!---------------------------------------------------------------------- 75 75 INTEGER :: ji,jj,jk … … 78 78 ! 79 79 ! compute fwf conservation correction 80 zfwfinc(:,:) = pcoef * ( pfwf_b(:,:) - pfwf(:,:) ) / ( ht(:,:) + 1._wp - ssmask(:,:) ) * r1_r au080 zfwfinc(:,:) = pcoef * ( pfwf_b(:,:) - pfwf(:,:) ) / ( ht(:,:) + 1._wp - ssmask(:,:) ) * r1_rho0 81 81 ! 82 82 ! add the increment -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/ISF/isfhdiv.F90
r12616 r12724 16 16 17 17 USE dom_oce ! time and space domain 18 USE phycst , ONLY: r1_r au0 ! physical constant18 USE phycst , ONLY: r1_rho0 ! physical constant 19 19 USE in_out_manager ! 20 20 … … 97 97 ! 98 98 ! compute integrated divergence correction 99 zhdiv(:,:) = 0.5_wp * ( pfwf(:,:) + pfwf_b(:,:) ) * r1_r au0 / phtbl(:,:)99 zhdiv(:,:) = 0.5_wp * ( pfwf(:,:) + pfwf_b(:,:) ) * r1_rho0 / phtbl(:,:) 100 100 ! 101 101 ! update divergence at each level affected by ice shelf top boundary layer -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/ISF/isfpar.F90
r12077 r12724 24 24 USE dom_oce , ONLY: bathy ! ocean space and time domain 25 25 USE par_oce , ONLY: jpi,jpj ! ocean space and time domain 26 USE phycst , ONLY: r1_r au0_rcp ! physical constants26 USE phycst , ONLY: r1_rho0_rcp ! physical constants 27 27 ! 28 28 USE in_out_manager ! I/O manager … … 88 88 ! 89 89 ! set temperature content 90 ptsc(:,:,jp_tem) = zqh(:,:) * r1_r au0_rcp90 ptsc(:,:,jp_tem) = zqh(:,:) * r1_rho0_rcp 91 91 ! 92 92 ! write restart variables (qoceisf, qhcisf, fwfisf for now and before) -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/ISF/isfparmlt.F90
r12077 r12724 13 13 USE dom_oce ! ocean space and time domain 14 14 USE oce , ONLY: ts ! ocean dynamics and tracers 15 USE phycst , ONLY: rcp, r au0 ! physical constants15 USE phycst , ONLY: rcp, rho0 ! physical constants 16 16 USE eosbn2 , ONLY: eos_fzp ! equation of state 17 17 … … 148 148 ! 149 149 ! 2. ------------Net heat flux and fresh water flux due to the ice shelf 150 pqoce(:,:) = r au0 * rcp * rn_gammat0 * risfLeff(:,:) * e1t(:,:) * ( ztavg(:,:) - ztfrz(:,:) ) * r1_e1e2t(:,:)150 pqoce(:,:) = rho0 * rcp * rn_gammat0 * risfLeff(:,:) * e1t(:,:) * ( ztavg(:,:) - ztfrz(:,:) ) * r1_e1e2t(:,:) 151 151 pqfwf(:,:) = - pqoce(:,:) / rLfusisf ! derived from the latent heat flux 152 152 pqhc (:,:) = pqfwf(:,:) * ztfrz(:,:) * rcp ! heat content flux -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/LBC/lib_mpp.F90
r12377 r12724 402 402 # if defined key_mpi2 403 403 IF( ln_timing ) CALL tic_tac( .TRUE., ld_global = .TRUE.) 404 CALL mpi_allreduce( y_in(:), todelay(idvar)%y1d(:), isz, MPI_DOUBLE_COMPLEX, mpi_sumdd, ilocalcomm, ndelayid(idvar), ierr ) 404 CALL mpi_allreduce( y_in(:), todelay(idvar)%y1d(:), isz, MPI_DOUBLE_COMPLEX, mpi_sumdd, ilocalcomm, ierr ) 405 ndelayid(idvar) = 1 405 406 IF( ln_timing ) CALL tic_tac(.FALSE., ld_global = .TRUE.) 406 407 # else … … 469 470 # if defined key_mpi2 470 471 IF( ln_timing ) CALL tic_tac( .TRUE., ld_global = .TRUE.) 471 CALL mpi_allreduce( p_in(:), todelay(idvar)%z1d(:), isz, MPI_DOUBLE_PRECISION, mpi_max, ilocalcomm, ndelayid(idvar), ierr ) 472 CALL mpi_allreduce( p_in(:), todelay(idvar)%z1d(:), isz, MPI_DOUBLE_PRECISION, mpi_max, ilocalcomm, ierr ) 473 ndelayid(idvar) = 1 472 474 IF( ln_timing ) CALL tic_tac(.FALSE., ld_global = .TRUE.) 473 475 # else -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/LDF/ldfdyn.F90
r12377 r12724 407 407 zcmsmag = (rn_csmc/rpi)**2 ! (C_smag/pi)^2 408 408 zstabf_lo = rn_minfac * rn_minfac / ( 2._wp * 12._wp * 12._wp * zcmsmag ) ! lower limit stability factor scaling 409 zstabf_up = rn_maxfac / ( 4._wp * zcmsmag * 2._wp * r dt ) ! upper limit stability factor scaling409 zstabf_up = rn_maxfac / ( 4._wp * zcmsmag * 2._wp * rn_Dt ) ! upper limit stability factor scaling 410 410 IF( ln_dynldf_blp ) zstabf_lo = ( 16._wp / 9._wp ) * zstabf_lo ! provide |U|L^3/12 lower limit instead 411 411 ! ! of |U|L^3/16 in blp case -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/LDF/ldftra.F90
r12622 r12724 821 821 ! 822 822 IF( iom_use('weiv_masstr') ) THEN ! vertical mass transport & its square value 823 zw2d(:,:) = r au0 * e1e2t(:,:)823 zw2d(:,:) = rho0 * e1e2t(:,:) 824 824 DO jk = 1, jpk 825 825 zw3d(:,:,jk) = zw3d(:,:,jk) * zw2d(:,:) … … 831 831 zw3d(:,:,:) = 0.e0 832 832 DO jk = 1, jpkm1 833 zw3d(:,:,jk) = r au0 * ( psi_uw(:,:,jk+1) - psi_uw(:,:,jk) )833 zw3d(:,:,jk) = rho0 * ( psi_uw(:,:,jk+1) - psi_uw(:,:,jk) ) 834 834 END DO 835 835 CALL iom_put( "ueiv_masstr", zw3d ) ! mass transport in i-direction 836 836 ENDIF 837 837 ! 838 zztmp = 0.5_wp * r au0 * rcp838 zztmp = 0.5_wp * rho0 * rcp 839 839 IF( iom_use('ueiv_heattr') .OR. iom_use('ueiv_heattr3d') ) THEN 840 840 zw2d(:,:) = 0._wp … … 854 854 zw3d(:,:,:) = 0.e0 855 855 DO jk = 1, jpkm1 856 zw3d(:,:,jk) = r au0 * ( psi_vw(:,:,jk+1) - psi_vw(:,:,jk) )856 zw3d(:,:,jk) = rho0 * ( psi_vw(:,:,jk+1) - psi_vw(:,:,jk) ) 857 857 END DO 858 858 CALL iom_put( "veiv_masstr", zw3d ) ! mass transport in i-direction -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/OBS/diaobs.F90
r12377 r12724 539 539 ENDIF 540 540 541 idaystp = NINT( rday / r dt )541 idaystp = NINT( rday / rn_Dt ) 542 542 543 543 !----------------------------------------------------------------------- … … 774 774 & rday 775 775 USE dom_oce, ONLY : & ! Ocean space and time domain variables 776 & r dt776 & rn_Dt 777 777 778 778 IMPLICIT NONE … … 805 805 !! Compute number of days + number of hours + min since initial time 806 806 !!---------------------------------------------------------------------- 807 zdayfrc = kstp * r dt / rday807 zdayfrc = kstp * rn_Dt / rday 808 808 zdayfrc = zdayfrc - aint(zdayfrc) 809 809 imin = imin + int( zdayfrc * 24 * 60 ) … … 816 816 iday=iday+1 817 817 END DO 818 iday = iday + kstp * r dt / rday818 iday = iday + kstp * rn_Dt / rday 819 819 820 820 !----------------------------------------------------------------------- -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/OBS/obs_prep.F90
r12377 r12724 613 613 !! * Modules used 614 614 USE dom_oce, ONLY : & ! Geographical information 615 & r dt615 & rn_Dt 616 616 USE phycst, ONLY : & ! Physical constants 617 617 & rday, & … … 662 662 663 663 ! Intialize the number of time steps per day 664 idaystp = NINT( rday / r dt )664 idaystp = NINT( rday / rn_Dt ) 665 665 666 666 !--------------------------------------------------------------------- … … 732 732 733 733 ! Add in the number of time steps to the observation minute 734 zminstp = rmmss / r dt734 zminstp = rmmss / rn_Dt 735 735 zhoustp = rhhmm * zminstp 736 736 -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/SBC/cpl_oasis3.F90
r12377 r12724 365 365 WRITE(numout,*) ' - Minimum value is ', MINVAL(pdata(nldi:nlei,nldj:nlej,jc)) 366 366 WRITE(numout,*) ' - Maximum value is ', MAXVAL(pdata(nldi:nlei,nldj:nlej,jc)) 367 WRITE(numout,*) ' - Sum value is ', SUM(pdata(nldi:nlei,nldj:nlej,jc))367 WRITE(numout,*) ' - Sum value is ', SUM(pdata(nldi:nlei,nldj:nlej,jc)) 368 368 WRITE(numout,*) '****************' 369 369 ENDIF … … 444 444 WRITE(numout,*) 'oasis_get: kstep', kstep 445 445 WRITE(numout,*) 'oasis_get: info ', kinfo 446 WRITE(numout,*) ' - Minimum value is ', MINVAL(pdata( :,:,jc))447 WRITE(numout,*) ' - Maximum value is ', MAXVAL(pdata( :,:,jc))448 WRITE(numout,*) ' - Sum value is ', SUM(pdata(:,:,jc))446 WRITE(numout,*) ' - Minimum value is ', MINVAL(pdata(nldi:nlei,nldj:nlej,jc)) 447 WRITE(numout,*) ' - Maximum value is ', MAXVAL(pdata(nldi:nlei,nldj:nlej,jc)) 448 WRITE(numout,*) ' - Sum value is ', SUM(pdata(nldi:nlei,nldj:nlej,jc)) 449 449 WRITE(numout,*) '****************' 450 450 ENDIF -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/SBC/fldread.F90
r12622 r12724 173 173 ! Note that all varibles starting by nsec_* are shifted time by +1/2 time step to be centrered 174 174 IF( PRESENT(kit) ) THEN ! ignore kn_fsbc in this case 175 isecsbc = nsec_year + nsec1jan000 + NINT( ( REAL( kit,wp) + zt_offset ) * r dt / REAL(nn_baro,wp) )175 isecsbc = nsec_year + nsec1jan000 + NINT( ( REAL( kit,wp) + zt_offset ) * rn_Dt / REAL(nn_e,wp) ) 176 176 ELSE ! middle of sbc time step 177 177 ! note: we use kn_fsbc-1 because nsec_year is defined at the middle of the current time step 178 isecsbc = nsec_year + nsec1jan000 + NINT( ( 0.5*REAL(kn_fsbc-1,wp) + zt_offset ) * r dt )178 isecsbc = nsec_year + nsec1jan000 + NINT( ( 0.5*REAL(kn_fsbc-1,wp) + zt_offset ) * rn_Dt ) 179 179 ENDIF 180 180 imf = SIZE( sd ) -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/SBC/sbc_ice.F90
r10425 r12724 70 70 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wndm_ice !: wind speed module at T-point [m/s] 71 71 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sstfrz !: wind speed module at T-point [m/s] 72 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: tsfc_ice !: sea ice surface skin temperature (on categories)73 72 #endif 74 73 … … 132 131 & qemp_ice(jpi,jpj) , qevap_ice(jpi,jpj,jpl) , qemp_oce (jpi,jpj) , & 133 132 & qns_oce (jpi,jpj) , qsr_oce (jpi,jpj) , emp_oce (jpi,jpj) , & 134 & emp_ice (jpi,jpj) , tsfc_ice (jpi,jpj,jpl) , sstfrz(jpi,jpj) , STAT= ierr(2) )133 & emp_ice (jpi,jpj) , sstfrz (jpi,jpj) , STAT= ierr(2) ) 135 134 #endif 136 135 -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/SBC/sbcapr.F90
r12377 r12724 36 36 37 37 REAL(wp) :: tarea ! whole domain mean masked ocean surface 38 REAL(wp) :: r1_grau ! = 1.e0 / (grav * r au0)38 REAL(wp) :: r1_grau ! = 1.e0 / (grav * rho0) 39 39 40 40 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_apr ! structure of input fields (file informations, fields read) … … 98 98 ENDIF 99 99 ! 100 r1_grau = 1.e0 / (grav * r au0) !* constant for optimization100 r1_grau = 1.e0 / (grav * rho0) !* constant for optimization 101 101 ! 102 102 ! !* control check -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/SBC/sbcblk.F90
r12377 r12724 259 259 IF( ierror > 0 ) CALL ctl_stop( 'STOP', 'sbc_blk_init: unable to allocate sf structure' ) 260 260 ! 261 ! !- fill the bulk structure with namelist informations 262 CALL fld_fill( sf, slf_i, cn_dir, 'sbc_blk_init', 'surface boundary condition -- bulk formulae', 'namsbc_blk' ) 263 ! 261 264 DO jfpr= 1, jpfld 262 265 ! … … 269 272 & jfpr == jp_hpgi .OR. jfpr == jp_hpgj .OR. jfpr == jp_tair ) ) THEN ! ABL: some fields are 3D input 270 273 ALLOCATE( sf(jfpr)%fnow(jpi,jpj,jpka) ) 271 IF( s lf_i(jfpr)%ln_tint ) ALLOCATE( sf(jfpr)%fdta(jpi,jpj,jpka,2) )274 IF( sf(jfpr)%ln_tint ) ALLOCATE( sf(jfpr)%fdta(jpi,jpj,jpka,2) ) 272 275 ELSE ! others or Bulk fields are 2D fiels 273 276 ALLOCATE( sf(jfpr)%fnow(jpi,jpj,1) ) 274 IF( s lf_i(jfpr)%ln_tint ) ALLOCATE( sf(jfpr)%fdta(jpi,jpj,1,2) )277 IF( sf(jfpr)%ln_tint ) ALLOCATE( sf(jfpr)%fdta(jpi,jpj,1,2) ) 275 278 ENDIF 276 279 ! 277 IF( s lf_i(jfpr)%freqh > 0. .AND. MOD( NINT(3600. * slf_i(jfpr)%freqh), nn_fsbc * NINT(rdt) ) /= 0 ) &278 & CALL ctl_warn( 'sbc_blk_init: sbcmod timestep r dt*nn_fsbc is NOT a submultiple of atmospheric forcing frequency.', &279 & ' This is not ideal. You should consider changing either r dt or nn_fsbc value...' )280 IF( sf(jfpr)%freqh > 0. .AND. MOD( NINT(3600. * sf(jfpr)%freqh), nn_fsbc * NINT(rn_Dt) ) /= 0 ) & 281 & CALL ctl_warn( 'sbc_blk_init: sbcmod timestep rn_Dt*nn_fsbc is NOT a submultiple of atmospheric forcing frequency.', & 282 & ' This is not ideal. You should consider changing either rn_Dt or nn_fsbc value...' ) 280 283 ENDIF 281 284 END DO 282 ! !- fill the bulk structure with namelist informations283 CALL fld_fill( sf, slf_i, cn_dir, 'sbc_blk_init', 'surface boundary condition -- bulk formulae', 'namsbc_blk' )284 285 ! 285 286 IF( ln_wave ) THEN … … 638 639 END IF 639 640 640 !! CALL iom_put( "Cd_oce", zcd_oce) ! output value of pure ocean-atm. transfer coef.641 !! CALL iom_put( "Ch_oce", zch_oce) ! output value of pure ocean-atm. transfer coef.642 643 IF( ABS(rn_zu - rn_zqt) < 0.1_wp ) THEN644 !! If zu == zt, then ensuring once for all that:645 t_zu(:,:) = ztpot(:,:)646 q_zu(:,:) = zqair(:,:)647 ENDIF648 649 650 641 ! Turbulent fluxes over ocean => BULK_FORMULA @ sbcblk_phy.F90 651 642 ! ------------------------------------------------------------- … … 662 653 ELSE !== BLK formulation ==! turbulent fluxes computation 663 654 CALL BULK_FORMULA( rn_zu, ptsk(:,:), pssq(:,:), t_zu(:,:), q_zu(:,:), & 664 & zcd_oce(:,:), zch_oce(:,:), zce_oce(:,:), &665 & wndm(:,:), zU_zu(:,:), pslp(:,:), &666 & taum(:,:), psen(:,:), zqla(:,:), &667 & pEvap=pevp(:,:), prhoa=rhoa(:,:) )655 & zcd_oce(:,:), zch_oce(:,:), zce_oce(:,:), & 656 & wndm(:,:), zU_zu(:,:), pslp(:,:), & 657 & taum(:,:), psen(:,:), zqla(:,:), & 658 & pEvap=pevp(:,:), prhoa=rhoa(:,:), pfact_evap=rn_efac ) 668 659 669 660 zqla(:,:) = zqla(:,:) * tmask(:,:,1) … … 1045 1036 evap_ice (:,:,:) = rn_efac * qla_ice (:,:,:) * z1_rLsub ! sublimation 1046 1037 devap_ice(:,:,:) = rn_efac * dqla_ice(:,:,:) * z1_rLsub ! d(sublimation)/dT 1047 zevap (:,:) = rn_efac * ( emp(:,:) + tprecip(:,:) ) ! evaporation over ocean1038 zevap (:,:) = emp(:,:) + tprecip(:,:) ! evaporation over ocean !LB: removed rn_efac here, correct??? 1048 1039 1049 1040 ! --- evaporation minus precipitation --- ! -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/SBC/sbcblk_algo_coare3p0.F90
r12377 r12724 194 194 IF( kt == nit000 ) CALL SBCBLK_ALGO_COARE3P0_INIT(l_use_cs, l_use_wl) 195 195 196 l_zt_equal_zu = .FALSE. 197 IF( ABS(zu - zt) < 0.01_wp ) l_zt_equal_zu = .TRUE. ! testing "zu == zt" is risky with double precision 196 l_zt_equal_zu = ( ABS(zu - zt) < 0.01_wp ) ! testing "zu == zt" is risky with double precision 198 197 IF( .NOT. l_zt_equal_zu ) ALLOCATE( zeta_t(jpi,jpj) ) 199 198 … … 396 395 ! 397 396 DO_2D_11_11 398 399 400 401 402 403 404 405 406 407 408 397 ! 398 zw = pwnd(ji,jj) ! wind speed 399 ! 400 ! Charnock's constant, increases with the wind : 401 zgt10 = 0.5 + SIGN(0.5_wp,(zw - 10)) ! If zw<10. --> 0, else --> 1 402 zgt18 = 0.5 + SIGN(0.5_wp,(zw - 18.)) ! If zw<18. --> 0, else --> 1 403 ! 404 alfa_charn_3p0(ji,jj) = (1. - zgt10)*0.011 & ! wind is lower than 10 m/s 405 & + zgt10*((1. - zgt18)*(0.011 + (0.018 - 0.011) & 406 & *(zw - 10.)/(18. - 10.)) + zgt18*( 0.018 ) ) ! Hare et al. (1999) 407 ! 409 408 END_2D 410 409 ! … … 432 431 ! 433 432 DO_2D_11_11 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 433 ! 434 zta = pzeta(ji,jj) 435 ! 436 zphi_m = ABS(1. - 15.*zta)**.25 !!Kansas unstable 437 ! 438 zpsi_k = 2.*LOG((1. + zphi_m)/2.) + LOG((1. + zphi_m*zphi_m)/2.) & 439 & - 2.*ATAN(zphi_m) + 0.5*rpi 440 ! 441 zphi_c = ABS(1. - 10.15*zta)**.3333 !!Convective 442 ! 443 zpsi_c = 1.5*LOG((1. + zphi_c + zphi_c*zphi_c)/3.) & 444 & - 1.7320508*ATAN((1. + 2.*zphi_c)/1.7320508) + 1.813799447 445 ! 446 zf = zta*zta 447 zf = zf/(1. + zf) 448 zc = MIN(50._wp, 0.35_wp*zta) 449 zstab = 0.5 + SIGN(0.5_wp, zta) 450 ! 451 psi_m_coare(ji,jj) = (1. - zstab) * ( (1. - zf)*zpsi_k + zf*zpsi_c ) & ! (zta < 0) 452 & - zstab * ( 1. + 1.*zta & ! (zta > 0) 453 & + 0.6667*(zta - 14.28)/EXP(zc) + 8.525 ) ! " 454 ! 456 455 END_2D 457 456 ! … … 483 482 ! 484 483 DO_2D_11_11 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 484 ! 485 zta = pzeta(ji,jj) 486 ! 487 zphi_h = (ABS(1. - 15.*zta))**.5 !! Kansas unstable (zphi_h = zphi_m**2 when unstable, zphi_m when stable) 488 ! 489 zpsi_k = 2.*LOG((1. + zphi_h)/2.) 490 ! 491 zphi_c = (ABS(1. - 34.15*zta))**.3333 !! Convective 492 ! 493 zpsi_c = 1.5*LOG((1. + zphi_c + zphi_c*zphi_c)/3.) & 494 & -1.7320508*ATAN((1. + 2.*zphi_c)/1.7320508) + 1.813799447 495 ! 496 zf = zta*zta 497 zf = zf/(1. + zf) 498 zc = MIN(50._wp,0.35_wp*zta) 499 zstab = 0.5 + SIGN(0.5_wp, zta) 500 ! 501 psi_h_coare(ji,jj) = (1. - zstab) * ( (1. - zf)*zpsi_k + zf*zpsi_c ) & 502 & - zstab * ( (ABS(1. + 2.*zta/3.))**1.5 & 503 & + .6667*(zta - 14.28)/EXP(zc) + 8.525 ) 504 ! 506 505 END_2D 507 506 ! -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/SBC/sbcblk_algo_coare3p6.F90
r12377 r12724 194 194 IF( kt == nit000 ) CALL SBCBLK_ALGO_COARE3P6_INIT(l_use_cs, l_use_wl) 195 195 196 l_zt_equal_zu = .FALSE. 197 IF( ABS(zu - zt) < 0.01_wp ) l_zt_equal_zu = .TRUE. ! testing "zu == zt" is risky with double precision 196 l_zt_equal_zu = ( ABS(zu - zt) < 0.01_wp ) ! testing "zu == zt" is risky with double precision 198 197 IF( .NOT. l_zt_equal_zu ) ALLOCATE( zeta_t(jpi,jpj) ) 199 198 … … 432 431 ! 433 432 DO_2D_11_11 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 433 ! 434 zta = pzeta(ji,jj) 435 ! 436 zphi_m = ABS(1. - 15.*zta)**.25 !!Kansas unstable 437 ! 438 zpsi_k = 2.*LOG((1. + zphi_m)/2.) + LOG((1. + zphi_m*zphi_m)/2.) & 439 & - 2.*ATAN(zphi_m) + 0.5*rpi 440 ! 441 zphi_c = ABS(1. - 10.15*zta)**.3333 !!Convective 442 ! 443 zpsi_c = 1.5*LOG((1. + zphi_c + zphi_c*zphi_c)/3.) & 444 & - 1.7320508*ATAN((1. + 2.*zphi_c)/1.7320508) + 1.813799447 445 ! 446 zf = zta*zta 447 zf = zf/(1. + zf) 448 zc = MIN(50._wp, 0.35_wp*zta) 449 zstab = 0.5 + SIGN(0.5_wp, zta) 450 ! 451 psi_m_coare(ji,jj) = (1. - zstab) * ( (1. - zf)*zpsi_k + zf*zpsi_c ) & ! (zta < 0) 452 & - zstab * ( 1. + 1.*zta & ! (zta > 0) 453 & + 0.6667*(zta - 14.28)/EXP(zc) + 8.525 ) ! " 454 ! 456 455 END_2D 457 456 ! … … 483 482 ! 484 483 DO_2D_11_11 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 484 ! 485 zta = pzeta(ji,jj) 486 ! 487 zphi_h = (ABS(1. - 15.*zta))**.5 !! Kansas unstable (zphi_h = zphi_m**2 when unstable, zphi_m when stable) 488 ! 489 zpsi_k = 2.*LOG((1. + zphi_h)/2.) 490 ! 491 zphi_c = (ABS(1. - 34.15*zta))**.3333 !! Convective 492 ! 493 zpsi_c = 1.5*LOG((1. + zphi_c + zphi_c*zphi_c)/3.) & 494 & -1.7320508*ATAN((1. + 2.*zphi_c)/1.7320508) + 1.813799447 495 ! 496 zf = zta*zta 497 zf = zf/(1. + zf) 498 zc = MIN(50._wp,0.35_wp*zta) 499 zstab = 0.5 + SIGN(0.5_wp, zta) 500 ! 501 psi_h_coare(ji,jj) = (1. - zstab) * ( (1. - zf)*zpsi_k + zf*zpsi_c ) & 502 & - zstab * ( (ABS(1. + 2.*zta/3.))**1.5 & 503 & + .6667*(zta - 14.28)/EXP(zc) + 8.525 ) 504 ! 506 505 END_2D 507 506 ! -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/SBC/sbcblk_algo_ecmwf.F90
r12377 r12724 98 98 & Qsw, rad_lw, slp, pdT_cs, & ! optionals for cool-skin (and warm-layer) 99 99 & pdT_wl, pHz_wl ) ! optionals for warm-layer only 100 !!---------------------------------------------------------------------- 100 !!---------------------------------------------------------------------------------- 101 101 !! *** ROUTINE turb_ecmwf *** 102 102 !! … … 184 184 LOGICAL :: l_zt_equal_zu = .FALSE. ! if q and t are given at same height as U 185 185 ! 186 REAL(wp), DIMENSION(jpi,jpj) :: 187 REAL(wp), DIMENSION(jpi,jpj) :: dt_zu, dq_zu 188 REAL(wp), DIMENSION(jpi,jpj) :: znu_a !: Nu_air, Viscosity of air186 REAL(wp), DIMENSION(jpi,jpj) :: u_star, t_star, q_star 187 REAL(wp), DIMENSION(jpi,jpj) :: dt_zu, dq_zu 188 REAL(wp), DIMENSION(jpi,jpj) :: znu_a !: Nu_air, Viscosity of air 189 189 REAL(wp), DIMENSION(jpi,jpj) :: Linv !: 1/L (inverse of Monin Obukhov length... 190 190 REAL(wp), DIMENSION(jpi,jpj) :: z0, z0t, z0q … … 196 196 CHARACTER(len=40), PARAMETER :: crtnm = 'turb_ecmwf@sbcblk_algo_ecmwf.F90' 197 197 !!---------------------------------------------------------------------------------- 198 199 198 IF( kt == nit000 ) CALL SBCBLK_ALGO_ECMWF_INIT(l_use_cs, l_use_wl) 200 199 201 l_zt_equal_zu = .FALSE. 202 IF( ABS(zu - zt) < 0.01_wp ) l_zt_equal_zu = .TRUE. ! testing "zu == zt" is risky with double precision 200 l_zt_equal_zu = ( ABS(zu - zt) < 0.01_wp ) ! testing "zu == zt" is risky with double precision 203 201 204 202 !! Initializations for cool skin and warm layer: … … 413 411 !!---------------------------------------------------------------------------------- 414 412 DO_2D_11_11 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 413 ! 414 zzeta = MIN( pzeta(ji,jj) , 5._wp ) !! Very stable conditions (L positif and big!): 415 ! 416 ! Unstable (Paulson 1970): 417 ! eq.3.20, Chap.3, p.33, IFS doc - Cy31r1 418 zx = SQRT(ABS(1._wp - 16._wp*zzeta)) 419 ztmp = 1._wp + SQRT(zx) 420 ztmp = ztmp*ztmp 421 psi_unst = LOG( 0.125_wp*ztmp*(1._wp + zx) ) & 422 & -2._wp*ATAN( SQRT(zx) ) + 0.5_wp*rpi 423 ! 424 ! Unstable: 425 ! eq.3.22, Chap.3, p.33, IFS doc - Cy31r1 426 psi_stab = -2._wp/3._wp*(zzeta - 5._wp/0.35_wp)*EXP(-0.35_wp*zzeta) & 427 & - zzeta - 2._wp/3._wp*5._wp/0.35_wp 428 ! 429 ! Combining: 430 stab = 0.5_wp + SIGN(0.5_wp, zzeta) ! zzeta > 0 => stab = 1 431 ! 432 psi_m_ecmwf(ji,jj) = (1._wp - stab) * psi_unst & ! (zzeta < 0) Unstable 433 & + stab * psi_stab ! (zzeta > 0) Stable 434 ! 437 435 END_2D 438 436 END FUNCTION psi_m_ecmwf … … 458 456 ! 459 457 DO_2D_11_11 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 458 ! 459 zzeta = MIN(pzeta(ji,jj) , 5._wp) ! Very stable conditions (L positif and big!): 460 ! 461 zx = ABS(1._wp - 16._wp*zzeta)**.25 ! this is actually (1/phi_m)**2 !!! 462 ! ! eq.3.19, Chap.3, p.33, IFS doc - Cy31r1 463 ! Unstable (Paulson 1970) : 464 psi_unst = 2._wp*LOG(0.5_wp*(1._wp + zx*zx)) ! eq.3.20, Chap.3, p.33, IFS doc - Cy31r1 465 ! 466 ! Stable: 467 psi_stab = -2._wp/3._wp*(zzeta - 5._wp/0.35_wp)*EXP(-0.35_wp*zzeta) & ! eq.3.22, Chap.3, p.33, IFS doc - Cy31r1 468 & - ABS(1._wp + 2._wp/3._wp*zzeta)**1.5_wp - 2._wp/3._wp*5._wp/0.35_wp + 1._wp 469 ! LB: added ABS() to avoid NaN values when unstable, which contaminates the unstable solution... 470 ! 471 stab = 0.5_wp + SIGN(0.5_wp, zzeta) ! zzeta > 0 => stab = 1 472 ! 473 ! 474 psi_h_ecmwf(ji,jj) = (1._wp - stab) * psi_unst & ! (zzeta < 0) Unstable 475 & + stab * psi_stab ! (zzeta > 0) Stable 476 ! 479 477 END_2D 480 478 END FUNCTION psi_h_ecmwf -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/SBC/sbcblk_algo_ncar.F90
r12377 r12724 112 112 REAL(wp), DIMENSION(jpi,jpj) :: stab ! stability test integer 113 113 !!---------------------------------------------------------------------------------- 114 ! 115 l_zt_equal_zu = .FALSE. 116 IF( ABS(zu - zt) < 0.01_wp ) l_zt_equal_zu = .TRUE. ! testing "zu == zt" is risky with double precision 114 l_zt_equal_zu = ( ABS(zu - zt) < 0.01_wp ) ! testing "zu == zt" is risky with double precision 117 115 118 116 U_blk = MAX( 0.5_wp , U_zu ) ! relative wind speed at zu (normally 10m), we don't want to fall under 0.5 m/s … … 143 141 ENDIF 144 142 145 !! Initializing values at z_u with z_t values: 146 t_zu = t_zt ; q_zu = q_zt 143 !! First guess of temperature and humidity at height zu: 144 t_zu = MAX( t_zt , 180._wp ) ! who knows what's given on masked-continental regions... 145 q_zu = MAX( q_zt , 1.e-6_wp ) ! " 147 146 148 147 !! ITERATION BLOCK -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/SBC/sbcblk_phy.F90
r12377 r12724 520 520 zCe = zz0*pqst(ji,jj)/zdq 521 521 522 CALL BULK_FORMULA ( pzu, pTs(ji,jj), pqs(ji,jj), pTa(ji,jj), pqa(ji,jj), &523 & zCd, zCh, zCe,&524 & pwnd(ji,jj), pUb(ji,jj), pslp(ji,jj),&525 & pTau(ji,jj), zQsen, zQlat )526 522 CALL BULK_FORMULA_SCLR( pzu, pTs(ji,jj), pqs(ji,jj), pTa(ji,jj), pqa(ji,jj), & 523 & zCd, zCh, zCe, & 524 & pwnd(ji,jj), pUb(ji,jj), pslp(ji,jj), & 525 & pTau(ji,jj), zQsen, zQlat ) 526 527 527 zTs2 = pTs(ji,jj)*pTs(ji,jj) 528 528 zQlw = emiss_w*(prlw(ji,jj) - stefan*zTs2*zTs2) ! Net longwave flux … … 535 535 536 536 537 SUBROUTINE BULK_FORMULA_VCTR( pzu, pTs, pqs, pTa, pqa, & 538 & pCd, pCh, pCe, & 539 & pwnd, pUb, pslp, & 540 & pTau, pQsen, pQlat, pEvap, prhoa ) 537 SUBROUTINE BULK_FORMULA_SCLR( pzu, pTs, pqs, pTa, pqa, & 538 & pCd, pCh, pCe, & 539 & pwnd, pUb, pslp, & 540 & pTau, pQsen, pQlat, & 541 & pEvap, prhoa, pfact_evap ) 542 !!---------------------------------------------------------------------------------- 543 REAL(wp), INTENT(in) :: pzu ! height above the sea-level where all this takes place (normally 10m) 544 REAL(wp), INTENT(in) :: pTs ! water temperature at the air-sea interface [K] 545 REAL(wp), INTENT(in) :: pqs ! satur. spec. hum. at T=pTs [kg/kg] 546 REAL(wp), INTENT(in) :: pTa ! potential air temperature at z=pzu [K] 547 REAL(wp), INTENT(in) :: pqa ! specific humidity at z=pzu [kg/kg] 548 REAL(wp), INTENT(in) :: pCd 549 REAL(wp), INTENT(in) :: pCh 550 REAL(wp), INTENT(in) :: pCe 551 REAL(wp), INTENT(in) :: pwnd ! wind speed module at z=pzu [m/s] 552 REAL(wp), INTENT(in) :: pUb ! bulk wind speed at z=pzu (inc. pot. effect of gustiness etc) [m/s] 553 REAL(wp), INTENT(in) :: pslp ! sea-level atmospheric pressure [Pa] 554 !! 555 REAL(wp), INTENT(out) :: pTau ! module of the wind stress [N/m^2] 556 REAL(wp), INTENT(out) :: pQsen ! [W/m^2] 557 REAL(wp), INTENT(out) :: pQlat ! [W/m^2] 558 !! 559 REAL(wp), INTENT(out), OPTIONAL :: pEvap ! Evaporation [kg/m^2/s] 560 REAL(wp), INTENT(out), OPTIONAL :: prhoa ! Air density at z=pzu [kg/m^3] 561 REAL(wp), INTENT(in) , OPTIONAL :: pfact_evap ! ABOMINATION: corrective factor for evaporation (doing this against my will! /laurent) 562 !! 563 REAL(wp) :: ztaa, zgamma, zrho, zUrho, zevap, zfact_evap 564 INTEGER :: jq 565 !!---------------------------------------------------------------------------------- 566 zfact_evap = 1._wp 567 IF( PRESENT(pfact_evap) ) zfact_evap = pfact_evap 568 569 !! Need ztaa, absolute temperature at pzu (formula to estimate rho_air needs absolute temperature, not the potential temperature "pTa") 570 ztaa = pTa ! first guess... 571 DO jq = 1, 4 572 zgamma = gamma_moist( 0.5*(ztaa+pTs) , pqa ) !LOLO: why not "0.5*(pqs+pqa)" rather then "pqa" ??? 573 ztaa = pTa - zgamma*pzu ! Absolute temp. is slightly colder... 574 END DO 575 zrho = rho_air(ztaa, pqa, pslp) 576 zrho = rho_air(ztaa, pqa, pslp-zrho*grav*pzu) ! taking into account that we are pzu m above the sea level where SLP is given! 577 578 zUrho = pUb*MAX(zrho, 1._wp) ! rho*U10 579 580 pTau = zUrho * pCd * pwnd ! Wind stress module 581 582 zevap = zUrho * pCe * (pqa - pqs) 583 pQsen = zUrho * pCh * (pTa - pTs) * cp_air(pqa) 584 pQlat = L_vap(pTs) * zevap 585 586 IF( PRESENT(pEvap) ) pEvap = - zfact_evap * zevap 587 IF( PRESENT(prhoa) ) prhoa = zrho 588 589 END SUBROUTINE BULK_FORMULA_SCLR 590 591 SUBROUTINE BULK_FORMULA_VCTR( pzu, pTs, pqs, pTa, pqa, & 592 & pCd, pCh, pCe, & 593 & pwnd, pUb, pslp, & 594 & pTau, pQsen, pQlat, & 595 & pEvap, prhoa, pfact_evap ) 541 596 !!---------------------------------------------------------------------------------- 542 597 REAL(wp), INTENT(in) :: pzu ! height above the sea-level where all this takes place (normally 10m) … … 558 613 REAL(wp), DIMENSION(jpi,jpj), INTENT(out), OPTIONAL :: pEvap ! Evaporation [kg/m^2/s] 559 614 REAL(wp), DIMENSION(jpi,jpj), INTENT(out), OPTIONAL :: prhoa ! Air density at z=pzu [kg/m^3] 560 !! 561 REAL(wp) :: ztaa, zgamma, zrho, zUrho, zevap 562 INTEGER :: ji, jj, jq ! dummy loop indices 563 !!---------------------------------------------------------------------------------- 564 DO_2D_11_11 565 566 !! Need ztaa, absolute temperature at pzu (formula to estimate rho_air needs absolute temperature, not the potential temperature "pTa") 567 ztaa = pTa(ji,jj) ! first guess... 568 DO jq = 1, 4 569 zgamma = gamma_moist( 0.5*(ztaa+pTs(ji,jj)) , pqa(ji,jj) ) 570 ztaa = pTa(ji,jj) - zgamma*pzu ! Absolute temp. is slightly colder... 571 END DO 572 zrho = rho_air(ztaa, pqa(ji,jj), pslp(ji,jj)) 573 zrho = rho_air(ztaa, pqa(ji,jj), pslp(ji,jj)-zrho*grav*pzu) ! taking into account that we are pzu m above the sea level where SLP is given! 574 575 zUrho = pUb(ji,jj)*MAX(zrho, 1._wp) ! rho*U10 576 577 pTau(ji,jj) = zUrho * pCd(ji,jj) * pwnd(ji,jj) ! Wind stress module 578 579 zevap = zUrho * pCe(ji,jj) * (pqa(ji,jj) - pqs(ji,jj)) 580 pQsen(ji,jj) = zUrho * pCh(ji,jj) * (pTa(ji,jj) - pTs(ji,jj)) * cp_air(pqa(ji,jj)) 581 pQlat(ji,jj) = L_vap(pTs(ji,jj)) * zevap 582 583 IF( PRESENT(pEvap) ) pEvap(ji,jj) = - zevap 615 REAL(wp), INTENT(in) , OPTIONAL :: pfact_evap ! ABOMINATION: corrective factor for evaporation (doing this against my will! /laurent) 616 !! 617 REAL(wp) :: ztaa, zgamma, zrho, zUrho, zevap, zfact_evap 618 INTEGER :: ji, jj 619 !!---------------------------------------------------------------------------------- 620 zfact_evap = 1._wp 621 IF( PRESENT(pfact_evap) ) zfact_evap = pfact_evap 622 623 DO_2D_11_11 624 625 CALL BULK_FORMULA_SCLR( pzu, pTs(ji,jj), pqs(ji,jj), pTa(ji,jj), pqa(ji,jj), & 626 & pCd(ji,jj), pCh(ji,jj), pCe(ji,jj), & 627 & pwnd(ji,jj), pUb(ji,jj), pslp(ji,jj), & 628 & pTau(ji,jj), pQsen(ji,jj), pQlat(ji,jj), & 629 & pEvap=zevap, prhoa=zrho, pfact_evap=zfact_evap ) 630 631 IF( PRESENT(pEvap) ) pEvap(ji,jj) = zevap 584 632 IF( PRESENT(prhoa) ) prhoa(ji,jj) = zrho 585 633 586 634 END_2D 587 635 END SUBROUTINE BULK_FORMULA_VCTR 588 589 590 SUBROUTINE BULK_FORMULA_SCLR( pzu, pTs, pqs, pTa, pqa, &591 & pCd, pCh, pCe, &592 & pwnd, pUb, pslp, &593 & pTau, pQsen, pQlat, pEvap, prhoa )594 !!----------------------------------------------------------------------------------595 REAL(wp), INTENT(in) :: pzu ! height above the sea-level where all this takes place (normally 10m)596 REAL(wp), INTENT(in) :: pTs ! water temperature at the air-sea interface [K]597 REAL(wp), INTENT(in) :: pqs ! satur. spec. hum. at T=pTs [kg/kg]598 REAL(wp), INTENT(in) :: pTa ! potential air temperature at z=pzu [K]599 REAL(wp), INTENT(in) :: pqa ! specific humidity at z=pzu [kg/kg]600 REAL(wp), INTENT(in) :: pCd601 REAL(wp), INTENT(in) :: pCh602 REAL(wp), INTENT(in) :: pCe603 REAL(wp), INTENT(in) :: pwnd ! wind speed module at z=pzu [m/s]604 REAL(wp), INTENT(in) :: pUb ! bulk wind speed at z=pzu (inc. pot. effect of gustiness etc) [m/s]605 REAL(wp), INTENT(in) :: pslp ! sea-level atmospheric pressure [Pa]606 !!607 REAL(wp), INTENT(out) :: pTau ! module of the wind stress [N/m^2]608 REAL(wp), INTENT(out) :: pQsen ! [W/m^2]609 REAL(wp), INTENT(out) :: pQlat ! [W/m^2]610 !!611 REAL(wp), INTENT(out), OPTIONAL :: pEvap ! Evaporation [kg/m^2/s]612 REAL(wp), INTENT(out), OPTIONAL :: prhoa ! Air density at z=pzu [kg/m^3]613 !!614 REAL(wp) :: ztaa, zgamma, zrho, zUrho, zevap615 INTEGER :: jq616 !!----------------------------------------------------------------------------------617 618 !! Need ztaa, absolute temperature at pzu (formula to estimate rho_air needs absolute temperature, not the potential temperature "pTa")619 ztaa = pTa ! first guess...620 DO jq = 1, 4621 zgamma = gamma_moist( 0.5*(ztaa+pTs) , pqa )622 ztaa = pTa - zgamma*pzu ! Absolute temp. is slightly colder...623 END DO624 zrho = rho_air(ztaa, pqa, pslp)625 zrho = rho_air(ztaa, pqa, pslp-zrho*grav*pzu) ! taking into account that we are pzu m above the sea level where SLP is given!626 627 zUrho = pUb*MAX(zrho, 1._wp) ! rho*U10628 629 pTau = zUrho * pCd * pwnd ! Wind stress module630 631 zevap = zUrho * pCe * (pqa - pqs)632 pQsen = zUrho * pCh * (pTa - pTs) * cp_air(pqa)633 pQlat = L_vap(pTs) * zevap634 635 IF( PRESENT(pEvap) ) pEvap = - zevap636 IF( PRESENT(prhoa) ) prhoa = zrho637 638 END SUBROUTINE BULK_FORMULA_SCLR639 640 641 636 642 637 -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/SBC/sbcblk_skin_coare.F90
r12377 r12724 199 199 ! Okay test on updated absorbed flux: 200 200 !#LB: remove??? has a strong influence !!! 201 IF( (.NOT. l_exit).AND.(Qnt_ac(ji,jj) + zQabs*r dt <= 0._wp) ) THEN201 IF( (.NOT. l_exit).AND.(Qnt_ac(ji,jj) + zQabs*rn_Dt <= 0._wp) ) THEN 202 202 l_exit = .TRUE. 203 203 l_destroy_wl = .TRUE. … … 211 211 ! 2/ Regardless of WL formed (dT==0 or dT>0), we are in the process to initiate one or warm further it ! 212 212 213 ztac = Tau_ac(ji,jj) + MAX(.002_wp , pTau(ji,jj))*r dt ! updated momentum integral213 ztac = Tau_ac(ji,jj) + MAX(.002_wp , pTau(ji,jj))*rn_Dt ! updated momentum integral 214 214 !PRINT *, '#LBD: updated value for Tac=', REAL(ztac,4) 215 215 … … 218 218 DO jl = 1, 5 219 219 zQabs = frac_solar_abs(zHwl)*pQsw(ji,jj) + pQnsol(ji,jj) 220 zqac = Qnt_ac(ji,jj) + zQabs*r dt ! updated heat absorbed220 zqac = Qnt_ac(ji,jj) + zQabs*rn_Dt ! updated heat absorbed 221 221 IF( zqac <= 0._wp ) EXIT 222 222 zHwl = MAX( MIN( Hwl_max , zcd1*ztac/SQRT(zqac)) , 0.1_wp ) ! Warm-layer depth -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/SBC/sbcblk_skin_ecmwf.F90
r12377 r12724 214 214 zcst2 = zcst1 / ( 5._wp*zHwl*zusw2 ) !OR: zcst2 = zcst1*rNuwl0 / ( 5._wp*zHwl*zusw2 ) ??? 215 215 216 zcst0 = r dt * (rNuwl0 + 1._wp) / zHwl216 zcst0 = rn_Dt * (rNuwl0 + 1._wp) / zHwl 217 217 218 218 ZA = zcst0 * zQabs / ( rNuwl0 * zRhoCp_w ) -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/SBC/sbccpl.F90
r12606 r12724 193 193 194 194 REAL(wp) :: rpref = 101000._wp ! reference atmospheric pressure[N/m2] 195 REAL(wp) :: r1_grau ! = 1.e0 / (grav * r au0)195 REAL(wp) :: r1_grau ! = 1.e0 / (grav * rho0) 196 196 197 197 INTEGER , ALLOCATABLE, SAVE, DIMENSION(:) :: nrcvinfo ! OASIS info argument … … 1116 1116 IF( ln_dm2dc .AND. ncpl_qsr_freq /= 86400 ) & 1117 1117 & CALL ctl_stop( 'sbc_cpl_rcv: diurnal cycle reconstruction (ln_dm2dc) needs daily couping for solar radiation' ) 1118 ncpl_qsr_freq = 86400 / ncpl_qsr_freq ! used by top 1118 1119 IF( ncpl_qsr_freq /= 0) ncpl_qsr_freq = 86400 / ncpl_qsr_freq ! used by top 1120 1119 1121 ENDIF 1120 1122 ! … … 1124 1126 ! ! Receive all the atmos. fields (including ice information) 1125 1127 ! ! ======================================================= ! 1126 isec = ( kt - nit000 ) * NINT( r dt ) ! date of exchanges1128 isec = ( kt - nit000 ) * NINT( rn_Dt ) ! date of exchanges 1127 1129 DO jn = 1, jprcv ! received fields sent by the atmosphere 1128 1130 IF( srcv(jn)%laction ) CALL cpl_rcv( jn, isec, frcv(jn)%z3, xcplmask(:,:,1:nn_cplmodel), nrcvinfo(jn) ) … … 1251 1253 IF( kt /= nit000 ) ssh_ibb(:,:) = ssh_ib(:,:) !* Swap of ssh_ib fields 1252 1254 1253 r1_grau = 1.e0 / (grav * r au0) !* constant for optimization1255 r1_grau = 1.e0 / (grav * rho0) !* constant for optimization 1254 1256 ssh_ib(:,:) = - ( frcv(jpr_mslp)%z3(:,:,1) - rpref ) * r1_grau ! equivalent ssh (inverse barometer) 1255 1257 apr (:,:) = frcv(jpr_mslp)%z3(:,:,1) !atmospheric pressure … … 2101 2103 !!---------------------------------------------------------------------- 2102 2104 ! 2103 isec = ( kt - nit000 ) * NINT( r dt ) ! date of exchanges2105 isec = ( kt - nit000 ) * NINT( rn_Dt ) ! date of exchanges 2104 2106 2105 2107 zfr_l(:,:) = 1.- fr_i(:,:) -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/SBC/sbcdcy.F90
r12377 r12724 86 86 ! -------------- 87 87 ! When are we during the day (from 0 to 1) 88 zlo = ( REAL(nsec_day, wp) - 0.5_wp * r dt ) / rday89 zup = zlo + ( REAL(nn_fsbc, wp) * r dt ) / rday88 zlo = ( REAL(nsec_day, wp) - 0.5_wp * rn_Dt ) / rday 89 zup = zlo + ( REAL(nn_fsbc, wp) * rn_Dt ) / rday 90 90 ! 91 91 IF( nday_qsr == -1 ) THEN ! first time step only … … 251 251 END_2D 252 252 ! 253 ztmp = rday / ( r dt * REAL(nn_fsbc, wp) )253 ztmp = rday / ( rn_Dt * REAL(nn_fsbc, wp) ) 254 254 rscal(:,:) = rscal(:,:) * ztmp 255 255 ! -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/SBC/sbcfwb.F90
r12377 r12724 126 126 ENDIF 127 127 ! ! Update fwfold if new year start 128 ikty = 365 * 86400 / r dt !!bug use of 365 days leap year or 360d year !!!!!!!128 ikty = 365 * 86400 / rn_Dt !!bug use of 365 days leap year or 360d year !!!!!!! 129 129 IF( MOD( kt, ikty ) == 0 ) THEN 130 130 a_fwb_b = a_fwb ! mean sea level taking into account the ice+snow 131 131 ! sum over the global domain 132 a_fwb = glob_sum( 'sbcfwb', e1e2t(:,:) * ( ssh(:,:,Kmm) + snwice_mass(:,:) * r1_r au0 ) )132 a_fwb = glob_sum( 'sbcfwb', e1e2t(:,:) * ( ssh(:,:,Kmm) + snwice_mass(:,:) * r1_rho0 ) ) 133 133 a_fwb = a_fwb * 1.e+3 / ( area * rday * 365. ) ! convert in Kg/m3/s = mm/s 134 134 !!gm ! !!bug 365d year -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/SBC/sbcice_cice.F90
r12680 r12724 13 13 USE dom_oce ! ocean space and time domain 14 14 USE domvvl 15 USE phycst, only : rcp, r au0, r1_rau0, rhos, rhoi15 USE phycst, only : rcp, rho0, r1_rho0, rhos, rhoi 16 16 USE in_out_manager ! I/O manager 17 17 USE iom, ONLY : iom_put,iom_use ! I/O manager library !!Joakim edit … … 228 228 IF( .NOT.ln_rstart ) THEN 229 229 IF( ln_ice_embd ) THEN ! embedded sea-ice: deplete the initial ssh below sea-ice area 230 ssh(:,:,Kmm) = ssh(:,:,Kmm) - snwice_mass(:,:) * r1_r au0231 ssh(:,:,Kbb) = ssh(:,:,Kbb) - snwice_mass(:,:) * r1_r au0230 ssh(:,:,Kmm) = ssh(:,:,Kmm) - snwice_mass(:,:) * r1_rho0 231 ssh(:,:,Kbb) = ssh(:,:,Kbb) - snwice_mass(:,:) * r1_rho0 232 232 233 233 !!gm This should be put elsewhere.... (same remark for limsbc) … … 421 421 ! Freezing/melting potential 422 422 ! Calculated over NEMO leapfrog timestep (hence 2*dt) 423 nfrzmlt(:,:) = r au0 * rcp * e3t_m(:,:) * ( Tocnfrz-sst_m(:,:) ) / ( 2.0*dt )423 nfrzmlt(:,:) = rho0 * rcp * e3t_m(:,:) * ( Tocnfrz-sst_m(:,:) ) / ( 2.0*dt ) 424 424 425 425 ztmp(:,:) = nfrzmlt(:,:) … … 454 454 zintb = REAL( nn_fsbc + 1 ) / REAL( nn_fsbc ) * 0.5_wp 455 455 ! 456 zpice(:,:) = ssh_m(:,:) + ( zintn * snwice_mass(:,:) + zintb * snwice_mass_b(:,:) ) * r1_r au0456 zpice(:,:) = ssh_m(:,:) + ( zintn * snwice_mass(:,:) + zintb * snwice_mass_b(:,:) ) * r1_rho0 457 457 ! 458 458 ! -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/SBC/sbcmod.F90
r12377 r12724 187 187 ! 188 188 IF( .NOT.ln_usr ) THEN ! the model calendar needs some specificities (except in user defined case) 189 IF( MOD( rday , r dt ) /= 0. ) CALL ctl_stop( 'the time step must devide the number of second of in a day' )189 IF( MOD( rday , rn_Dt ) /= 0. ) CALL ctl_stop( 'the time step must devide the number of second of in a day' ) 190 190 IF( MOD( rday , 2. ) /= 0. ) CALL ctl_stop( 'the number of second of in a day must be an even number' ) 191 IF( MOD( r dt , 2. ) /= 0. ) CALL ctl_stop( 'the time step (in second) must be an even number' )191 IF( MOD( rn_Dt , 2. ) /= 0. ) CALL ctl_stop( 'the time step (in second) must be an even number' ) 192 192 ENDIF 193 193 ! !** check option consistency … … 309 309 ! SAS time-step has to be declared in OASIS (mandatory) -> nn_fsbc has to be modified accordingly 310 310 IF( nn_components /= jp_iam_nemo ) THEN 311 IF( nn_components == jp_iam_opa ) nn_fsbc = cpl_freq('O_SFLX') / NINT(r dt)312 IF( nn_components == jp_iam_sas ) nn_fsbc = cpl_freq('I_SFLX') / NINT(r dt)311 IF( nn_components == jp_iam_opa ) nn_fsbc = cpl_freq('O_SFLX') / NINT(rn_Dt) 312 IF( nn_components == jp_iam_sas ) nn_fsbc = cpl_freq('I_SFLX') / NINT(rn_Dt) 313 313 ! 314 314 IF(lwp)THEN … … 331 331 ENDIF 332 332 ! 333 IF( MOD( rday, REAL(nn_fsbc, wp) * r dt ) /= 0 ) &333 IF( MOD( rday, REAL(nn_fsbc, wp) * rn_Dt ) /= 0 ) & 334 334 & CALL ctl_warn( 'sbc_init : nn_fsbc is NOT a multiple of the number of time steps in a day' ) 335 335 ! 336 IF( ln_dm2dc .AND. NINT(rday) / ( nn_fsbc * NINT(r dt) ) < 8 ) &336 IF( ln_dm2dc .AND. NINT(rday) / ( nn_fsbc * NINT(rn_Dt) ) < 8 ) & 337 337 & CALL ctl_warn( 'sbc_init : diurnal cycle for qsr: the sampling of the diurnal cycle is too small...' ) 338 338 ! -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/SBC/sbcrnf.F90
r12590 r12724 138 138 ! ! set temperature & salinity content of runoffs 139 139 IF( ln_rnf_tem ) THEN ! use runoffs temperature data 140 rnf_tsc(:,:,jp_tem) = ( sf_t_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_r au0140 rnf_tsc(:,:,jp_tem) = ( sf_t_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rho0 141 141 CALL eos_fzp( sss_m(:,:), ztfrz(:,:) ) 142 142 WHERE( sf_t_rnf(1)%fnow(:,:,1) == -999._wp ) ! if missing data value use SST as runoffs temperature 143 rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_r au0143 rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rho0 144 144 END WHERE 145 145 ELSE ! use SST as runoffs temperature 146 146 !CEOD River is fresh water so must at least be 0 unless we consider ice 147 rnf_tsc(:,:,jp_tem) = MAX( sst_m(:,:), 0.0_wp ) * rnf(:,:) * r1_r au0147 rnf_tsc(:,:,jp_tem) = MAX( sst_m(:,:), 0.0_wp ) * rnf(:,:) * r1_rho0 148 148 ENDIF 149 149 ! ! use runoffs salinity data 150 IF( ln_rnf_sal ) rnf_tsc(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_r au0150 IF( ln_rnf_sal ) rnf_tsc(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rho0 151 151 ! ! else use S=0 for runoffs (done one for all in the init) 152 152 CALL iom_put( 'runoffs' , rnf(:,:) ) ! output runoff mass flux 153 IF( iom_use('hflx_rnf_cea') ) CALL iom_put( 'hflx_rnf_cea', rnf_tsc(:,:,jp_tem) * r au0 * rcp ) ! output runoff sensible heat (W/m2)153 IF( iom_use('hflx_rnf_cea') ) CALL iom_put( 'hflx_rnf_cea', rnf_tsc(:,:,jp_tem) * rho0 * rcp ) ! output runoff sensible heat (W/m2) 154 154 ENDIF 155 155 ! … … 211 211 DO_2D_11_11 212 212 DO jk = 1, nk_rnf(ji,jj) 213 phdivn(ji,jj,jk) = phdivn(ji,jj,jk) - ( rnf(ji,jj) + rnf_b(ji,jj) ) * zfact * r1_r au0 / h_rnf(ji,jj)213 phdivn(ji,jj,jk) = phdivn(ji,jj,jk) - ( rnf(ji,jj) + rnf_b(ji,jj) ) * zfact * r1_rho0 / h_rnf(ji,jj) 214 214 END DO 215 215 END_2D … … 222 222 ! ! apply the runoff input flow 223 223 DO jk = 1, nk_rnf(ji,jj) 224 phdivn(ji,jj,jk) = phdivn(ji,jj,jk) - ( rnf(ji,jj) + rnf_b(ji,jj) ) * zfact * r1_r au0 / h_rnf(ji,jj)224 phdivn(ji,jj,jk) = phdivn(ji,jj,jk) - ( rnf(ji,jj) + rnf_b(ji,jj) ) * zfact * r1_rho0 / h_rnf(ji,jj) 225 225 END DO 226 226 END_2D … … 228 228 ELSE !== runoff put only at the surface ==! 229 229 h_rnf (:,:) = e3t (:,:,1,Kmm) ! update h_rnf to be depth of top box 230 phdivn(:,:,1) = phdivn(:,:,1) - ( rnf(:,:)+rnf_b(:,:) ) * zfact * r1_r au0 / e3t(:,:,1,Kmm)230 phdivn(:,:,1) = phdivn(:,:,1) - ( rnf(:,:)+rnf_b(:,:) ) * zfact * r1_rho0 / e3t(:,:,1,Kmm) 231 231 ENDIF 232 232 ! -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/STO/storng.F90
r12377 r12724 50 50 51 51 ! Parameters to generate real random variates 52 REAL(KIND=wp), PARAMETER :: huge64=9223372036854775808.0 ! +153 52 REAL(KIND=wp), PARAMETER :: zero=0.0, half=0.5, one=1.0, two=2.0 54 53 … … 275 274 REAL(KIND=wp) :: uran 276 275 277 uran = half * ( one + REAL(kiss(),wp) / huge64)276 uran = half * ( one + REAL(kiss(),wp) / HUGE(1._wp) ) 278 277 279 278 END SUBROUTINE kiss_uniform … … 298 297 rsq = two 299 298 DO WHILE ( (rsq.GE.one).OR. (rsq.EQ.zero) ) 300 u1 = REAL(kiss(),wp) / huge64301 u2 = REAL(kiss(),wp) / huge64299 u1 = REAL(kiss(),wp) / HUGE(1._wp) 300 u2 = REAL(kiss(),wp) / HUGE(1._wp) 302 301 rsq = u1*u1 + u2*u2 303 302 ENDDO -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TDE/tide_mod.F90
r12343 r12724 171 171 IF( ln_scal_load.AND.ln_read_load ) & 172 172 & CALL ctl_stop('Choose between ln_scal_load and ln_read_load') 173 IF( ln_tide_ramp.AND.((nitend-nit000+1)*r dt/rday < rn_tide_ramp_dt) ) &173 IF( ln_tide_ramp.AND.((nitend-nit000+1)*rn_Dt/rday < rn_tide_ramp_dt) ) & 174 174 & CALL ctl_stop('rn_tide_ramp_dt must be lower than run duration') 175 175 IF( ln_tide_ramp.AND.(rn_tide_ramp_dt<0.) ) & … … 424 424 !!---------------------------------------------------------------------- 425 425 426 IF( nsec_day == NINT(0.5_wp * r dt) .OR. kt == nit000 ) THEN ! start a new day426 IF( nsec_day == NINT(0.5_wp * rn_Dt) .OR. kt == nit000 ) THEN ! start a new day 427 427 ! 428 428 CALL tide_harmo(tide_components, tide_harmonics, ndt05) ! Update oscillation parameters of tidal components for start of current day … … 441 441 IF( ln_tide_pot ) CALL tide_init_potential 442 442 ! 443 rn_tide_ramp_t = (kt - nit000)*r dt ! Elapsed time in seconds443 rn_tide_ramp_t = (kt - nit000)*rn_Dt ! Elapsed time in seconds 444 444 ENDIF 445 445 ! -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/eosbn2.F90
r12622 r12724 192 192 !! *** ROUTINE eos_insitu *** 193 193 !! 194 !! ** Purpose : Compute the in situ density (ratio rho/r au0) from194 !! ** Purpose : Compute the in situ density (ratio rho/rho0) from 195 195 !! potential temperature and salinity using an equation of state 196 196 !! selected in the nameos namelist 197 197 !! 198 !! ** Method : prd(t,s,z) = ( rho(t,s,z) - r au0 ) / rau0198 !! ** Method : prd(t,s,z) = ( rho(t,s,z) - rho0 ) / rho0 199 199 !! with prd in situ density anomaly no units 200 200 !! t TEOS10: CT or EOS80: PT Celsius … … 202 202 !! z depth meters 203 203 !! rho in situ density kg/m^3 204 !! r au0 reference density kg/m^3204 !! rho0 reference density kg/m^3 205 205 !! 206 206 !! ln_teos10 : polynomial TEOS-10 equation of state is used for rho(t,s,z). … … 211 211 !! 212 212 !! ln_seos : simplified equation of state 213 !! prd(t,s,z) = ( -a0*(1+lambda/2*(T-T0)+mu*z+nu*(S-S0))*(T-T0) + b0*(S-S0) ) / r au0213 !! prd(t,s,z) = ( -a0*(1+lambda/2*(T-T0)+mu*z+nu*(S-S0))*(T-T0) + b0*(S-S0) ) / rho0 214 214 !! linear case function of T only: rn_alpha<>0, other coefficients = 0 215 215 !! linear eos function of T and S: rn_alpha and rn_beta<>0, other coefficients=0 … … 268 268 zn = ( ( zn3 * zh + zn2 ) * zh + zn1 ) * zh + zn0 269 269 ! 270 prd(ji,jj,jk) = ( zn * r1_r au0 - 1._wp ) * ztm ! density anomaly (masked)270 prd(ji,jj,jk) = ( zn * r1_rho0 - 1._wp ) * ztm ! density anomaly (masked) 271 271 ! 272 272 END_3D … … 284 284 & - rn_nu * zt * zs 285 285 ! 286 prd(ji,jj,jk) = zn * r1_r au0 * ztm ! density anomaly (masked)286 prd(ji,jj,jk) = zn * r1_rho0 * ztm ! density anomaly (masked) 287 287 END_3D 288 288 ! … … 300 300 !! *** ROUTINE eos_insitu_pot *** 301 301 !! 302 !! ** Purpose : Compute the in situ density (ratio rho/r au0) and the302 !! ** Purpose : Compute the in situ density (ratio rho/rho0) and the 303 303 !! potential volumic mass (Kg/m3) from potential temperature and 304 304 !! salinity fields using an equation of state selected in the … … 380 380 prhop(ji,jj,jk) = prhop(ji,jj,jk) + zn0_sto(jsmp) ! potential density referenced at the surface 381 381 ! 382 prd(ji,jj,jk) = prd(ji,jj,jk) + ( zn_sto(jsmp) * r1_r au0 - 1._wp ) ! density anomaly (masked)382 prd(ji,jj,jk) = prd(ji,jj,jk) + ( zn_sto(jsmp) * r1_rho0 - 1._wp ) ! density anomaly (masked) 383 383 END DO 384 384 prhop(ji,jj,jk) = 0.5_wp * prhop(ji,jj,jk) * ztm / nn_sto_eos … … 420 420 prhop(ji,jj,jk) = zn0 * ztm ! potential density referenced at the surface 421 421 ! 422 prd(ji,jj,jk) = ( zn * r1_r au0 - 1._wp ) * ztm ! density anomaly (masked)422 prd(ji,jj,jk) = ( zn * r1_rho0 - 1._wp ) * ztm ! density anomaly (masked) 423 423 END_3D 424 424 ENDIF … … 435 435 & + rn_b0 * ( 1._wp - 0.5_wp*rn_lambda2*zs ) * zs & 436 436 & - rn_nu * zt * zs 437 prhop(ji,jj,jk) = ( r au0 + zn ) * ztm437 prhop(ji,jj,jk) = ( rho0 + zn ) * ztm 438 438 ! ! density anomaly (masked) 439 439 zn = zn - ( rn_a0 * rn_mu1 * zt + rn_b0 * rn_mu2 * zs ) * zh 440 prd(ji,jj,jk) = zn * r1_r au0 * ztm440 prd(ji,jj,jk) = zn * r1_rho0 * ztm 441 441 ! 442 442 END_3D … … 455 455 !! *** ROUTINE eos_insitu_2d *** 456 456 !! 457 !! ** Purpose : Compute the in situ density (ratio rho/r au0) from457 !! ** Purpose : Compute the in situ density (ratio rho/rho0) from 458 458 !! potential temperature and salinity using an equation of state 459 459 !! selected in the nameos namelist. * 2D field case … … 509 509 zn = ( ( zn3 * zh + zn2 ) * zh + zn1 ) * zh + zn0 510 510 ! 511 prd(ji,jj) = zn * r1_r au0 - 1._wp ! unmasked in situ density anomaly511 prd(ji,jj) = zn * r1_rho0 - 1._wp ! unmasked in situ density anomaly 512 512 ! 513 513 END_2D … … 525 525 & - rn_nu * zt * zs 526 526 ! 527 prd(ji,jj) = zn * r1_r au0 ! unmasked in situ density anomaly527 prd(ji,jj) = zn * r1_rho0 ! unmasked in situ density anomaly 528 528 ! 529 529 END_2D … … 589 589 zn = ( ( zn3 * zh + zn2 ) * zh + zn1 ) * zh + zn0 590 590 ! 591 pab(ji,jj,jk,jp_tem) = zn * r1_r au0 * ztm591 pab(ji,jj,jk,jp_tem) = zn * r1_rho0 * ztm 592 592 ! 593 593 ! beta … … 610 610 zn = ( ( zn3 * zh + zn2 ) * zh + zn1 ) * zh + zn0 611 611 ! 612 pab(ji,jj,jk,jp_sal) = zn / zs * r1_r au0 * ztm612 pab(ji,jj,jk,jp_sal) = zn / zs * r1_rho0 * ztm 613 613 ! 614 614 END_3D … … 623 623 ! 624 624 zn = rn_a0 * ( 1._wp + rn_lambda1*zt + rn_mu1*zh ) + rn_nu*zs 625 pab(ji,jj,jk,jp_tem) = zn * r1_r au0 * ztm ! alpha625 pab(ji,jj,jk,jp_tem) = zn * r1_rho0 * ztm ! alpha 626 626 ! 627 627 zn = rn_b0 * ( 1._wp - rn_lambda2*zs - rn_mu2*zh ) - rn_nu*zt 628 pab(ji,jj,jk,jp_sal) = zn * r1_r au0 * ztm ! beta628 pab(ji,jj,jk,jp_sal) = zn * r1_rho0 * ztm ! beta 629 629 ! 630 630 END_3D … … 695 695 zn = ( ( zn3 * zh + zn2 ) * zh + zn1 ) * zh + zn0 696 696 ! 697 pab(ji,jj,jp_tem) = zn * r1_r au0697 pab(ji,jj,jp_tem) = zn * r1_rho0 698 698 ! 699 699 ! beta … … 716 716 zn = ( ( zn3 * zh + zn2 ) * zh + zn1 ) * zh + zn0 717 717 ! 718 pab(ji,jj,jp_sal) = zn / zs * r1_r au0718 pab(ji,jj,jp_sal) = zn / zs * r1_rho0 719 719 ! 720 720 ! … … 730 730 ! 731 731 zn = rn_a0 * ( 1._wp + rn_lambda1*zt + rn_mu1*zh ) + rn_nu*zs 732 pab(ji,jj,jp_tem) = zn * r1_r au0 ! alpha732 pab(ji,jj,jp_tem) = zn * r1_rho0 ! alpha 733 733 ! 734 734 zn = rn_b0 * ( 1._wp - rn_lambda2*zs - rn_mu2*zh ) - rn_nu*zt 735 pab(ji,jj,jp_sal) = zn * r1_r au0 ! beta735 pab(ji,jj,jp_sal) = zn * r1_rho0 ! beta 736 736 ! 737 737 END_2D … … 800 800 zn = ( ( zn3 * zh + zn2 ) * zh + zn1 ) * zh + zn0 801 801 ! 802 pab(jp_tem) = zn * r1_r au0802 pab(jp_tem) = zn * r1_rho0 803 803 ! 804 804 ! beta … … 821 821 zn = ( ( zn3 * zh + zn2 ) * zh + zn1 ) * zh + zn0 822 822 ! 823 pab(jp_sal) = zn / zs * r1_r au0823 pab(jp_sal) = zn / zs * r1_rho0 824 824 ! 825 825 ! … … 832 832 ! 833 833 zn = rn_a0 * ( 1._wp + rn_lambda1*zt + rn_mu1*zh ) + rn_nu*zs 834 pab(jp_tem) = zn * r1_r au0 ! alpha834 pab(jp_tem) = zn * r1_rho0 ! alpha 835 835 ! 836 836 zn = rn_b0 * ( 1._wp - rn_lambda2*zs - rn_mu2*zh ) - rn_nu*zt 837 pab(jp_sal) = zn * r1_r au0 ! beta837 pab(jp_sal) = zn * r1_rho0 ! beta 838 838 ! 839 839 CASE DEFAULT … … 1053 1053 !! ** Method : PE is defined analytically as the vertical 1054 1054 !! primitive of EOS times -g integrated between 0 and z>0. 1055 !! pen is the nonlinear bsq-PE anomaly: pen = ( PE - r au0 gz ) / rau0 gz - rd1055 !! pen is the nonlinear bsq-PE anomaly: pen = ( PE - rho0 gz ) / rho0 gz - rd 1056 1056 !! = 1/z * /int_0^z rd dz - rd 1057 1057 !! where rd is the density anomaly (see eos_rhd function) 1058 1058 !! ab_pe are partial derivatives of PE anomaly with respect to T and S: 1059 !! ab_pe(1) = - 1/(r au0 gz) * dPE/dT + drd/dT = - d(pen)/dT1060 !! ab_pe(2) = 1/(r au0 gz) * dPE/dS + drd/dS = d(pen)/dS1059 !! ab_pe(1) = - 1/(rho0 gz) * dPE/dT + drd/dT = - d(pen)/dT 1060 !! ab_pe(2) = 1/(rho0 gz) * dPE/dS + drd/dS = d(pen)/dS 1061 1061 !! 1062 1062 !! ** Action : - pen : PE anomaly given at T-points … … 1104 1104 zn = ( zn2 * zh + zn1 ) * zh + zn0 1105 1105 ! 1106 ppen(ji,jj,jk) = zn * zh * r1_r au0 * ztm1106 ppen(ji,jj,jk) = zn * zh * r1_rho0 * ztm 1107 1107 ! 1108 1108 ! alphaPE non-linear anomaly … … 1119 1119 zn = ( zn2 * zh + zn1 ) * zh + zn0 1120 1120 ! 1121 pab_pe(ji,jj,jk,jp_tem) = zn * zh * r1_r au0 * ztm1121 pab_pe(ji,jj,jk,jp_tem) = zn * zh * r1_rho0 * ztm 1122 1122 ! 1123 1123 ! betaPE non-linear anomaly … … 1134 1134 zn = ( zn2 * zh + zn1 ) * zh + zn0 1135 1135 ! 1136 pab_pe(ji,jj,jk,jp_sal) = zn / zs * zh * r1_r au0 * ztm1136 pab_pe(ji,jj,jk,jp_sal) = zn / zs * zh * r1_rho0 * ztm 1137 1137 ! 1138 1138 END_3D … … 1145 1145 zh = gdept(ji,jj,jk,Kmm) ! depth in meters at t-point 1146 1146 ztm = tmask(ji,jj,jk) ! tmask 1147 zn = 0.5_wp * zh * r1_r au0 * ztm1147 zn = 0.5_wp * zh * r1_rho0 * ztm 1148 1148 ! ! Potential Energy 1149 1149 ppen(ji,jj,jk) = ( rn_a0 * rn_mu1 * zt + rn_b0 * rn_mu2 * zs ) * zn … … 1187 1187 IF(lwm) WRITE( numond, nameos ) 1188 1188 ! 1189 r au0 = 1026._wp !: volumic mass of reference [kg/m3]1189 rho0 = 1026._wp !: volumic mass of reference [kg/m3] 1190 1190 rcp = 3991.86795711963_wp !: heat capacity [J/K] 1191 1191 ! … … 1599 1599 WRITE(numout,*) ' ==>>> use of simplified eos: ' 1600 1600 WRITE(numout,*) ' rhd(dT=T-10,dS=S-35,Z) = [-a0*(1+lambda1/2*dT+mu1*Z)*dT ' 1601 WRITE(numout,*) ' + b0*(1+lambda2/2*dT+mu2*Z)*dS - nu*dT*dS] / r au0'1601 WRITE(numout,*) ' + b0*(1+lambda2/2*dT+mu2*Z)*dS - nu*dT*dS] / rho0' 1602 1602 WRITE(numout,*) ' with the following coefficients :' 1603 1603 WRITE(numout,*) ' thermal exp. coef. rn_a0 = ', rn_a0 … … 1618 1618 END SELECT 1619 1619 ! 1620 r au0_rcp = rau0 * rcp1621 r1_r au0 = 1._wp / rau01620 rho0_rcp = rho0 * rcp 1621 r1_rho0 = 1._wp / rho0 1622 1622 r1_rcp = 1._wp / rcp 1623 r1_r au0_rcp = 1._wp / rau0_rcp1623 r1_rho0_rcp = 1._wp / rho0_rcp 1624 1624 ! 1625 1625 IF(lwp) THEN … … 1636 1636 IF(lwp) WRITE(numout,*) 1637 1637 IF(lwp) WRITE(numout,*) ' Associated physical constant' 1638 IF(lwp) WRITE(numout,*) ' volumic mass of reference r au0 = ', rau0 , ' kg/m^3'1639 IF(lwp) WRITE(numout,*) ' 1. / r au0 r1_rau0 = ', r1_rau0, ' m^3/kg'1638 IF(lwp) WRITE(numout,*) ' volumic mass of reference rho0 = ', rho0 , ' kg/m^3' 1639 IF(lwp) WRITE(numout,*) ' 1. / rho0 r1_rho0 = ', r1_rho0, ' m^3/kg' 1640 1640 IF(lwp) WRITE(numout,*) ' ocean specific heat rcp = ', rcp , ' J/Kelvin' 1641 IF(lwp) WRITE(numout,*) ' r au0 * rcp rau0_rcp = ', rau0_rcp1642 IF(lwp) WRITE(numout,*) ' 1. / ( r au0 * rcp ) r1_rau0_rcp = ', r1_rau0_rcp1641 IF(lwp) WRITE(numout,*) ' rho0 * rcp rho0_rcp = ', rho0_rcp 1642 IF(lwp) WRITE(numout,*) ' 1. / ( rho0 * rcp ) r1_rho0_rcp = ', r1_rho0_rcp 1643 1643 ! 1644 1644 END SUBROUTINE eos_init -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/traadv.F90
r12624 r12724 93 93 IF( ln_timing ) CALL timing_start('tra_adv') 94 94 ! 95 ! ! set time step96 IF( neuler == 0 .AND. kt == nit000 ) THEN ; r2dt = rdt ! at nit000 (Euler)97 ELSEIF( kt <= nit000 + 1 ) THEN ; r2dt = 2._wp * rdt ! at nit000 or nit000+1 (Leapfrog)98 ENDIF99 !100 95 ! !== effective transport ==! 101 96 zuu(:,:,jpk) = 0._wp … … 153 148 CALL tra_adv_cen ( kt, nit000, 'TRA', zuu, zvv, zww, Kmm, pts, jpts, Krhs, nn_cen_h, nn_cen_v ) 154 149 CASE ( np_FCT ) ! FCT scheme : 2nd / 4th order 155 CALL tra_adv_fct ( kt, nit000, 'TRA', r 2dt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs, nn_fct_h, nn_fct_v )150 CALL tra_adv_fct ( kt, nit000, 'TRA', rDt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs, nn_fct_h, nn_fct_v ) 156 151 CASE ( np_MUS ) ! MUSCL 157 CALL tra_adv_mus ( kt, nit000, 'TRA', r 2dt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs, ln_mus_ups )152 CALL tra_adv_mus ( kt, nit000, 'TRA', rDt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs, ln_mus_ups ) 158 153 CASE ( np_UBS ) ! UBS 159 CALL tra_adv_ubs ( kt, nit000, 'TRA', r 2dt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs, nn_ubs_v )154 CALL tra_adv_ubs ( kt, nit000, 'TRA', rDt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs, nn_ubs_v ) 160 155 CASE ( np_QCK ) ! QUICKEST 161 CALL tra_adv_qck ( kt, nit000, 'TRA', r 2dt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs )156 CALL tra_adv_qck ( kt, nit000, 'TRA', rDt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs ) 162 157 ! 163 158 END SELECT -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/traadv_fct.F90
r12590 r12724 20 20 USE diaptr ! poleward transport diagnostics 21 21 USE diaar5 ! AR5 diagnostics 22 USE phycst , ONLY : r au0_rcp22 USE phycst , ONLY : rho0_rcp 23 23 USE zdf_oce , ONLY : ln_zad_Aimp 24 24 ! -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/traatf.F90
r12680 r12724 114 114 IF( ln_bdy ) CALL bdy_tra( kt, Kbb, pts, Kaa ) ! BDY open boundaries 115 115 116 ! set time step size (Euler/Leapfrog)117 IF( neuler == 0 .AND. kt == nit000 ) THEN ; r2dt = rdt ! at nit000 (Euler)118 ELSEIF( kt <= nit000 + 1 ) THEN ; r2dt = 2._wp* rdt ! at nit000 or nit000+1 (Leapfrog)119 ENDIF120 121 116 ! trends computation initialisation 122 117 IF( l_trdtra ) THEN … … 129 124 ENDIF 130 125 ! total trend for the non-time-filtered variables. 131 zfact = 1.0 / r dt126 zfact = 1.0 / rn_Dt 132 127 ! G Nurser 23 Mar 2017. Recalculate trend as Delta(e3t*T)/e3tn; e3tn cancel from pts(Kmm) terms 133 128 DO jk = 1, jpkm1 … … 145 140 ENDIF 146 141 147 IF( neuler == 0 .AND. kt == nit000 ) THEN ! Euler time-stepping142 IF( l_1st_euler ) THEN ! Euler time-stepping 148 143 ! 149 144 IF (l_trdtra .AND. .NOT. ln_linssh ) THEN ! Zero Asselin filter contribution must be explicitly written out since for vvl … … 157 152 ELSE ! Leap-Frog + Asselin filter time stepping 158 153 ! 159 IF( ln_linssh ) THEN ; CALL tra_atf_fix( kt, Kbb, Kmm, Kaa, nit000, 'TRA', pts, jpts ) ! linear free surface160 ELSE ; CALL tra_atf_vvl( kt, Kbb, Kmm, Kaa, nit000, r dt, 'TRA', pts, sbc_tsc, sbc_tsc_b, jpts ) ! non-linear free surface154 IF( ln_linssh ) THEN ; CALL tra_atf_fix( kt, Kbb, Kmm, Kaa, nit000, 'TRA', pts, jpts ) ! linear free surface 155 ELSE ; CALL tra_atf_vvl( kt, Kbb, Kmm, Kaa, nit000, rn_Dt, 'TRA', pts, sbc_tsc, sbc_tsc_b, jpts ) ! non-linear free surface 161 156 ENDIF 162 157 ! … … 167 162 ENDIF 168 163 ! 169 IF( l_trdtra .AND. ln_linssh ) THEN ! trend of the Asselin filter (tb filtered - tb)/dt 170 zfact = 1._wp / r2dt 164 IF( l_trdtra .AND. ln_linssh ) THEN ! trend of the Asselin filter (tb filtered - tb)/dt 171 165 DO jk = 1, jpkm1 172 ztrdt(:,:,jk) = ( pts(:,:,jk,jp_tem,Kmm) - ztrdt(:,:,jk) ) * zfact173 ztrds(:,:,jk) = ( pts(:,:,jk,jp_sal,Kmm) - ztrds(:,:,jk) ) * zfact166 ztrdt(:,:,jk) = ( pts(:,:,jk,jp_tem,Kmm) - ztrdt(:,:,jk) ) * r1_Dt 167 ztrds(:,:,jk) = ( pts(:,:,jk,jp_sal,Kmm) - ztrds(:,:,jk) ) * r1_Dt 174 168 END DO 175 169 CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_tem, jptra_atf, ztrdt ) … … 220 214 ztd = pt(ji,jj,jk,jn,Kaa) - 2._wp * ztn + pt(ji,jj,jk,jn,Kbb) ! time laplacian on tracers 221 215 ! 222 pt(ji,jj,jk,jn,Kmm) = ztn + atfp * ztd ! pt <-- filtered pt216 pt(ji,jj,jk,jn,Kmm) = ztn + rn_atfp * ztd ! pt <-- filtered pt 223 217 END_3D 224 218 ! … … 235 229 !! 236 230 !! ** Method : - Apply a thickness weighted Asselin time filter on now fields. 237 !! pt(Kmm) = ( e3t_Kmm*pt(Kmm) + atfp*[ e3t_Kbb*pt(Kbb) - 2 e3t_Kmm*pt(Kmm) + e3t_Kaa*pt(Kaa) ] )238 !! /( e3t_Kmm + atfp*[ e3t_Kbb - 2 e3t_Kmm + e3t_Kaa ] )231 !! pt(Kmm) = ( e3t_Kmm*pt(Kmm) + rn_atfp*[ e3t_Kbb*pt(Kbb) - 2 e3t_Kmm*pt(Kmm) + e3t_Kaa*pt(Kaa) ] ) 232 !! /( e3t_Kmm + rn_atfp*[ e3t_Kbb - 2 e3t_Kmm + e3t_Kaa ] ) 239 233 !! 240 234 !! ** Action : - pt(Kmm) ready for the next time step … … 278 272 ENDIF 279 273 zfact = 1._wp / p2dt 280 zfact1 = atfp * p2dt281 zfact2 = zfact1 * r1_r au0274 zfact1 = rn_atfp * p2dt 275 zfact2 = zfact1 * r1_rho0 282 276 DO jn = 1, kjpt 283 277 DO_3D_00_00( 1, jpkm1 ) … … 293 287 ztc_d = ztc_a - 2. * ztc_n + ztc_b 294 288 ! 295 ze3t_f = ze3t_n + atfp * ze3t_d296 ztc_f = ztc_n + atfp * ztc_d289 ze3t_f = ze3t_n + rn_atfp * ze3t_d 290 ztc_f = ztc_n + rn_atfp * ztc_d 297 291 ! 298 292 ! Add asselin correction on scale factors: -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/traatfQCO.F90
r12624 r12724 114 114 ! IF( ln_bdy ) CALL bdy_tra( kt, Kbb, pts, Kaa ) ! BDY open boundaries 115 115 116 ! set time step size (Euler/Leapfrog)117 IF( neuler == 0 .AND. kt == nit000 ) THEN ; r2dt = rdt ! at nit000 (Euler)118 ELSEIF( kt <= nit000 + 1 ) THEN ; r2dt = 2._wp* rdt ! at nit000 or nit000+1 (Leapfrog)119 ENDIF120 121 116 ! trends computation initialisation 122 117 IF( l_trdtra ) THEN … … 129 124 ENDIF 130 125 ! total trend for the non-time-filtered variables. 131 zfact = 1.0 / r dt126 zfact = 1.0 / rn_Dt 132 127 ! G Nurser 23 Mar 2017. Recalculate trend as Delta(e3t*T)/e3tn; e3tn cancel from pts(Kmm) terms 133 128 DO jk = 1, jpkm1 … … 149 144 ENDIF 150 145 151 IF( neuler == 0 .AND. kt == nit000) THEN ! Euler time-stepping146 IF( l_1st_euler ) THEN ! Euler time-stepping 152 147 ! 153 148 IF (l_trdtra .AND. .NOT. ln_linssh ) THEN ! Zero Asselin filter contribution must be explicitly written out since for vvl … … 161 156 ELSE ! Leap-Frog + Asselin filter time stepping 162 157 ! 163 IF ( ln_linssh ) THEN ; CALL tra_atf_fix_lf( kt, Kbb, Kmm, Kaa, nit000, 'TRA', pts, jpts ) ! linear free surface164 ELSE ; CALL tra_atf_qco_lf( kt, Kbb, Kmm, Kaa, nit000, r dt, 'TRA', pts, sbc_tsc, sbc_tsc_b, jpts ) ! non-linear free surface158 IF ( ln_linssh ) THEN ; CALL tra_atf_fix_lf( kt, Kbb, Kmm, Kaa, nit000, 'TRA', pts, jpts ) ! linear free surface 159 ELSE ; CALL tra_atf_qco_lf( kt, Kbb, Kmm, Kaa, nit000, rn_Dt, 'TRA', pts, sbc_tsc, sbc_tsc_b, jpts ) ! non-linear free surface 165 160 ENDIF 166 161 ! … … 172 167 ! 173 168 IF( l_trdtra .AND. ln_linssh ) THEN ! trend of the Asselin filter (tb filtered - tb)/dt 174 zfact = 1._wp / r2dt175 169 DO jk = 1, jpkm1 176 ztrdt(:,:,jk) = ( pts(:,:,jk,jp_tem,Kmm) - ztrdt(:,:,jk) ) * zfact177 ztrds(:,:,jk) = ( pts(:,:,jk,jp_sal,Kmm) - ztrds(:,:,jk) ) * zfact170 ztrdt(:,:,jk) = ( pts(:,:,jk,jp_tem,Kmm) - ztrdt(:,:,jk) ) * r1_Dt 171 ztrds(:,:,jk) = ( pts(:,:,jk,jp_sal,Kmm) - ztrds(:,:,jk) ) * r1_Dt 178 172 END DO 179 173 CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_tem, jptra_atf, ztrdt ) … … 224 218 ztd = pt(ji,jj,jk,jn,Kaa) - 2._wp * ztn + pt(ji,jj,jk,jn,Kbb) ! time laplacian on tracers 225 219 ! 226 pt(ji,jj,jk,jn,Kmm) = ztn + atfp * ztd ! pt <-- filtered pt220 pt(ji,jj,jk,jn,Kmm) = ztn + rn_atfp * ztd ! pt <-- filtered pt 227 221 END_3D 228 222 ! … … 239 233 !! 240 234 !! ** Method : - Apply a thickness weighted Asselin time filter on now fields. 241 !! pt(Kmm) = ( e3t_m*pt(Kmm) + atfp*[ e3t_b*pt(Kbb) - 2 e3t_m*pt(Kmm) + e3t_a*pt(Kaa) ] )242 !! /( e3t_m + atfp*[ e3t_b - 2 e3t_m + e3t_a ] )235 !! pt(Kmm) = ( e3t_m*pt(Kmm) + rn_atfp*[ e3t_b*pt(Kbb) - 2 e3t_m*pt(Kmm) + e3t_a*pt(Kaa) ] ) 236 !! /( e3t_m + rn_atfp*[ e3t_b - 2 e3t_m + e3t_a ] ) 243 237 !! 244 238 !! ** Action : - pt(Kmm) ready for the next time step … … 282 276 ENDIF 283 277 zfact = 1._wp / p2dt 284 zfact1 = atfp * p2dt285 zfact2 = zfact1 * r1_r au0278 zfact1 = rn_atfp * p2dt 279 zfact2 = zfact1 * r1_rho0 286 280 DO jn = 1, kjpt 287 281 DO_3D_00_00( 1, jpkm1 ) … … 297 291 ztc_d = ztc_a - 2. * ztc_n + ztc_b 298 292 ! 299 ztc_f = ztc_n + atfp * ztc_d293 ztc_f = ztc_n + rn_atfp * ztc_d 300 294 ! 301 295 ! Asselin correction on scale factors is done via ssh in r3t_f -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/trabbc.F90
r12590 r12724 67 67 !! ocean bottom can be computed once and is added to the temperature 68 68 !! trend juste above the bottom at each time step: 69 !! ta = ta + Qsf / (r au0 rcp e3T) for k= mbkt69 !! ta = ta + Qsf / (rho0 rcp e3T) for k= mbkt 70 70 !! Where Qsf is the geothermal heat flux. 71 71 !! … … 104 104 ENDIF 105 105 ! 106 CALL iom_put ( "hfgeou" , r au0_rcp * qgh_trd0(:,:) )106 CALL iom_put ( "hfgeou" , rho0_rcp * qgh_trd0(:,:) ) 107 107 IF(sn_cfctl%l_prtctl) CALL prt_ctl( tab3d_1=pts(:,:,:,jp_tem,Krhs), clinfo1=' bbc - Ta: ', mask1=tmask, clinfo3='tra-ta' ) 108 108 ! … … 164 164 CASE ( 1 ) !* constant flux 165 165 IF(lwp) WRITE(numout,*) ' ==>>> constant heat flux = ', rn_geoflx_cst 166 qgh_trd0(:,:) = r1_r au0_rcp * rn_geoflx_cst166 qgh_trd0(:,:) = r1_rho0_rcp * rn_geoflx_cst 167 167 ! 168 168 CASE ( 2 ) !* variable geothermal heat flux : read the geothermal fluxes in mW/m2 … … 181 181 182 182 CALL fld_read( nit000, 1, sf_qgh ) ! Read qgh data 183 qgh_trd0(:,:) = r1_r au0_rcp * sf_qgh(1)%fnow(:,:,1) * 1.e-3 ! conversion in W/m2183 qgh_trd0(:,:) = r1_rho0_rcp * sf_qgh(1)%fnow(:,:,1) * 1.e-3 ! conversion in W/m2 184 184 ! 185 185 CASE DEFAULT -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/traldf_iso.F90
r12622 r12724 110 110 REAL(wp) :: zmsku, zahu_w, zabe1, zcof1, zcoef3 ! local scalars 111 111 REAL(wp) :: zmskv, zahv_w, zabe2, zcof2, zcoef4 ! - - 112 REAL(wp) :: zcoef0, ze3w_2, zsign , z2dt, z1_2dt! - -112 REAL(wp) :: zcoef0, ze3w_2, zsign ! - - 113 113 REAL(wp), DIMENSION(jpi,jpj) :: zdkt, zdk1t, z2d 114 114 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdit, zdjt, zftu, zftv, ztfw … … 130 130 & iom_use("uadv_salttr") .OR. iom_use("vadv_salttr") ) ) l_hst = .TRUE. 131 131 ! 132 ! ! set time step size (Euler/Leapfrog)133 IF( neuler == 0 .AND. kt == nit000 ) THEN ; z2dt = rdt ! at nit000 (Euler)134 ELSE ; z2dt = 2.* rdt ! (Leapfrog)135 ENDIF136 z1_2dt = 1._wp / z2dt137 132 ! 138 133 IF( kpass == 1 ) THEN ; zsign = 1._wp ! bilaplacian operator require a minus sign (eddy diffusivity >0) … … 182 177 DO_3D_10_10( 2, jpkm1 ) 183 178 ze3w_2 = e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) 184 zcoef0 = z2dt * ( akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ze3w_2 )185 akz(ji,jj,jk) = MAX( zcoef0 - 0.5_wp , 0._wp ) * ze3w_2 * z1_2dt179 zcoef0 = rDt * ( akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ze3w_2 ) 180 akz(ji,jj,jk) = MAX( zcoef0 - 0.5_wp , 0._wp ) * ze3w_2 * r1_Dt 186 181 END_3D 187 182 ENDIF -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/traldf_triad.F90
r12622 r12724 87 87 INTEGER :: ip,jp,kp ! dummy loop indices 88 88 INTEGER :: ierr ! local integer 89 REAL(wp) :: zmsku, zabe1, zcof1, zcoef3 90 REAL(wp) :: zmskv, zabe2, zcof2, zcoef4 91 REAL(wp) :: zcoef0, ze3w_2, zsign , z2dt, z1_2dt! - -89 REAL(wp) :: zmsku, zabe1, zcof1, zcoef3 ! local scalars 90 REAL(wp) :: zmskv, zabe2, zcof2, zcoef4 ! - - 91 REAL(wp) :: zcoef0, ze3w_2, zsign ! - - 92 92 ! 93 93 REAL(wp) :: zslope_skew, zslope_iso, zslope2, zbu, zbv … … 112 112 l_hst = .FALSE. 113 113 l_ptr = .FALSE. 114 IF( cdtype == 'TRA' .AND. ( iom_use( 'sophtldf' ) .OR. iom_use( 'sopstldf' ) ) ) l_ptr = .TRUE. 115 IF( cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. & 116 & iom_use("uadv_salttr") .OR. iom_use("vadv_salttr") ) ) l_hst = .TRUE. 117 ! 118 ! ! set time step size (Euler/Leapfrog) 119 IF( neuler == 0 .AND. kt == kit000 ) THEN ; z2dt = rdt ! at nit000 (Euler) 120 ELSE ; z2dt = 2.* rdt ! (Leapfrog) 114 IF( cdtype == 'TRA' ) THEN 115 IF( iom_use( 'sophtldf' ) .OR. iom_use( 'sopstldf') ) l_ptr = .TRUE. 116 IF( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. & 117 & iom_use("uadv_salttr") .OR. iom_use("vadv_salttr") ) l_hst = .TRUE. 121 118 ENDIF 122 z1_2dt = 1._wp / z2dt123 119 ! 124 120 IF( kpass == 1 ) THEN ; zsign = 1._wp ! bilaplacian operator require a minus sign (eddy diffusivity >0) … … 193 189 DO_3D_10_10( 2, jpkm1 ) 194 190 ze3w_2 = e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) 195 zcoef0 = z2dt * ( akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ze3w_2 )196 akz(ji,jj,jk) = MAX( zcoef0 - 0.5_wp , 0._wp ) * ze3w_2 * z1_2dt191 zcoef0 = rDt * ( akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ze3w_2 ) 192 akz(ji,jj,jk) = MAX( zcoef0 - 0.5_wp , 0._wp ) * ze3w_2 * r1_Dt 197 193 END_3D 198 194 ENDIF -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/tramle.F90
r12590 r12724 41 41 42 42 REAL(wp) :: r5_21 = 5.e0 / 21.e0 ! factor used in mle streamfunction computation 43 REAL(wp) :: rb_c ! ML buoyancy criteria = g rho_c /r au0 where rho_c is defined in zdfmld43 REAL(wp) :: rb_c ! ML buoyancy criteria = g rho_c /rho0 where rho_c is defined in zdfmld 44 44 REAL(wp) :: rc_f ! MLE coefficient (= rn_ce / (5 km * fo) ) in nn_mle=1 case 45 45 … … 113 113 zc = e3t(ji,jj,jk,Kmm) * REAL( MIN( MAX( 0, inml_mle(ji,jj)-jk ) , 1 ) ) ! zc being 0 outside the ML t-points 114 114 zmld(ji,jj) = zmld(ji,jj) + zc 115 zbm (ji,jj) = zbm (ji,jj) + zc * (r au0 - rhop(ji,jj,jk) ) * r1_rau0115 zbm (ji,jj) = zbm (ji,jj) + zc * (rho0 - rhop(ji,jj,jk) ) * r1_rho0 116 116 zn2 (ji,jj) = zn2 (ji,jj) + zc * (rn2(ji,jj,jk)+rn2(ji,jj,jk+1))*0.5_wp 117 117 END_3D … … 274 274 IF( ln_mle ) THEN ! MLE initialisation 275 275 ! 276 rb_c = grav * rn_rho_c_mle /r au0 ! Mixed Layer buoyancy criteria276 rb_c = grav * rn_rho_c_mle /rho0 ! Mixed Layer buoyancy criteria 277 277 IF(lwp) WRITE(numout,*) 278 278 IF(lwp) WRITE(numout,*) ' ML buoyancy criteria = ', rb_c, ' m/s2 ' -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/tranpc.F90
r12590 r12724 68 68 LOGICAL :: l_bottom_reached, l_column_treated 69 69 REAL(wp) :: zta, zalfa, zsum_temp, zsum_alfa, zaw, zdz, zsum_z 70 REAL(wp) :: zsa, zbeta, zsum_sali, zsum_beta, zbw, zrw, z1_r 2dt70 REAL(wp) :: zsa, zbeta, zsum_sali, zsum_beta, zbw, zrw, z1_rDt 71 71 REAL(wp), PARAMETER :: zn2_zero = 1.e-14_wp ! acceptance criteria for neutrality (N2==0) 72 72 REAL(wp), DIMENSION( jpk ) :: zvn2 ! vertical profile of N2 at 1 given point... … … 302 302 ! 303 303 IF( l_trdtra ) THEN ! send the Non penetrative mixing trends for diagnostic 304 z1_r 2dt = 1._wp / (2._wp * rdt)305 ztrdt(:,:,:) = ( pts(:,:,:,jp_tem,Kaa) - ztrdt(:,:,:) ) * z1_r 2dt306 ztrds(:,:,:) = ( pts(:,:,:,jp_sal,Kaa) - ztrds(:,:,:) ) * z1_r 2dt304 z1_rDt = 1._wp / (2._wp * rn_Dt) 305 ztrdt(:,:,:) = ( pts(:,:,:,jp_tem,Kaa) - ztrdt(:,:,:) ) * z1_rDt 306 ztrds(:,:,:) = ( pts(:,:,:,jp_sal,Kaa) - ztrds(:,:,:) ) * z1_rDt 307 307 CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_tem, jptra_npc, ztrdt ) 308 308 CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_sal, jptra_npc, ztrds ) -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/traqsr.F90
r12590 r12724 88 88 !! I(k) = Qsr*( rn_abs*EXP(z(k)/rn_si0) + (1.-rn_abs)*EXP(z(k)/rn_si1) ) 89 89 !! The temperature trend associated with the solar radiation penetration 90 !! is given by : zta = 1/e3t dk[ I ] / (r au0*Cp)90 !! is given by : zta = 1/e3t dk[ I ] / (rho0*Cp) 91 91 !! At the bottom, boudary condition for the radiation is no flux : 92 92 !! all heat which has not been absorbed in the above levels is put … … 136 136 ! !-----------------------------------! 137 137 IF( kt == nit000 ) THEN !== 1st time step ==! 138 !!gm case neuler not taken into account.... 139 IF( ln_rstart .AND. iom_varid( numror, 'qsr_hc_b', ldstop = .FALSE. ) > 0 ) THEN ! read in restart 138 IF( ln_rstart .AND. iom_varid( numror, 'qsr_hc_b', ldstop = .FALSE. ) > 0 .AND. .NOT.l_1st_euler ) THEN ! read in restart 140 139 IF(lwp) WRITE(numout,*) ' nit000-1 qsr tracer content forcing field read in the restart file' 141 140 z1_2 = 0.5_wp … … 157 156 ! 158 157 DO jk = 1, nksr 159 qsr_hc(:,:,jk) = r1_r au0_rcp * ( etot3(:,:,jk) - etot3(:,:,jk+1) )158 qsr_hc(:,:,jk) = r1_rho0_rcp * ( etot3(:,:,jk) - etot3(:,:,jk+1) ) 160 159 END DO 161 160 ! … … 229 228 ! 230 229 DO_3D_00_00( 1, nksr ) 231 qsr_hc(ji,jj,jk) = r1_r au0_rcp * ( zea(ji,jj,jk) - zea(ji,jj,jk+1) )230 qsr_hc(ji,jj,jk) = r1_rho0_rcp * ( zea(ji,jj,jk) - zea(ji,jj,jk+1) ) 232 231 END_3D 233 232 ! … … 236 235 CASE( np_2BD ) !== 2-bands fluxes ==! 237 236 ! 238 zz0 = rn_abs * r1_r au0_rcp ! surface equi-partition in 2-bands239 zz1 = ( 1. - rn_abs ) * r1_r au0_rcp237 zz0 = rn_abs * r1_rho0_rcp ! surface equi-partition in 2-bands 238 zz1 = ( 1. - rn_abs ) * r1_rho0_rcp 240 239 DO_3D_00_00( 1, nksr ) 241 240 zc0 = zz0 * EXP( -gdepw(ji,jj,jk ,Kmm)*xsi0r ) + zz1 * EXP( -gdepw(ji,jj,jk ,Kmm)*xsi1r ) … … 255 254 ! sea-ice: store the 1st ocean level attenuation coefficient 256 255 DO_2D_00_00 257 IF( qsr(ji,jj) /= 0._wp ) THEN ; fraqsr_1lev(ji,jj) = qsr_hc(ji,jj,1) / ( r1_r au0_rcp * qsr(ji,jj) )256 IF( qsr(ji,jj) /= 0._wp ) THEN ; fraqsr_1lev(ji,jj) = qsr_hc(ji,jj,1) / ( r1_rho0_rcp * qsr(ji,jj) ) 258 257 ELSE ; fraqsr_1lev(ji,jj) = 1._wp 259 258 ENDIF … … 265 264 zetot(:,:,nksr+1:jpk) = 0._wp ! below ~400m set to zero 266 265 DO jk = nksr, 1, -1 267 zetot(:,:,jk) = zetot(:,:,jk+1) + qsr_hc(:,:,jk) * r au0_rcp266 zetot(:,:,jk) = zetot(:,:,jk+1) + qsr_hc(:,:,jk) * rho0_rcp 268 267 END DO 269 268 CALL iom_put( 'qsr3d', zetot ) ! 3D distribution of shortwave Radiation -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/trasbc.F90
r12590 r12724 125 125 ! !== Now sbc tracer content fields ==! 126 126 DO_2D_01_00 127 sbc_tsc(ji,jj,jp_tem) = r1_r au0_rcp * qns(ji,jj) ! non solar heat flux128 sbc_tsc(ji,jj,jp_sal) = r1_r au0 * sfx(ji,jj) ! salt flux due to freezing/melting127 sbc_tsc(ji,jj,jp_tem) = r1_rho0_rcp * qns(ji,jj) ! non solar heat flux 128 sbc_tsc(ji,jj,jp_sal) = r1_rho0 * sfx(ji,jj) ! salt flux due to freezing/melting 129 129 END_2D 130 130 IF( ln_linssh ) THEN !* linear free surface 131 131 DO_2D_01_00 132 sbc_tsc(ji,jj,jp_tem) = sbc_tsc(ji,jj,jp_tem) + r1_r au0 * emp(ji,jj) * pts(ji,jj,1,jp_tem,Kmm)133 sbc_tsc(ji,jj,jp_sal) = sbc_tsc(ji,jj,jp_sal) + r1_r au0 * emp(ji,jj) * pts(ji,jj,1,jp_sal,Kmm)132 sbc_tsc(ji,jj,jp_tem) = sbc_tsc(ji,jj,jp_tem) + r1_rho0 * emp(ji,jj) * pts(ji,jj,1,jp_tem,Kmm) 133 sbc_tsc(ji,jj,jp_sal) = sbc_tsc(ji,jj,jp_sal) + r1_rho0 * emp(ji,jj) * pts(ji,jj,1,jp_sal,Kmm) 134 134 END_2D 135 135 IF( iom_use('emp_x_sst') ) CALL iom_put( "emp_x_sst", emp (:,:) * pts(:,:,1,jp_tem,Kmm) ) -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/trazdf.F90
r12590 r12724 67 67 ENDIF 68 68 ! 69 IF( neuler == 0 .AND. kt == nit000 ) THEN ; r2dt = rdt ! at nit000, = rdt (restarting with Euler time stepping)70 ELSEIF( kt <= nit000 + 1 ) THEN ; r2dt = 2. * rdt ! otherwise, = 2 rdt (leapfrog)71 ENDIF72 !73 69 IF( l_trdtra ) THEN !* Save ta and sa trends 74 70 ALLOCATE( ztrdt(jpi,jpj,jpk) , ztrds(jpi,jpj,jpk) ) … … 78 74 ! 79 75 ! !* compute lateral mixing trend and add it to the general trend 80 CALL tra_zdf_imp( kt, nit000, 'TRA', r 2dt, Kbb, Kmm, Krhs, pts, Kaa, jpts )76 CALL tra_zdf_imp( kt, nit000, 'TRA', rDt, Kbb, Kmm, Krhs, pts, Kaa, jpts ) 81 77 82 78 !!gm WHY here ! and I don't like that ! … … 89 85 IF( l_trdtra ) THEN ! save the vertical diffusive trends for further diagnostics 90 86 DO jk = 1, jpkm1 91 ztrdt(:,:,jk) = ( ( pts(:,:,jk,jp_tem,Kaa)*e3t(:,:,jk,Kaa) & 92 & - pts(:,:,jk,jp_tem,Kbb)*e3t(:,:,jk,Kbb) ) & 93 & / (e3t(:,:,jk,Kmm)*r2dt) ) - ztrdt(:,:,jk) 94 ztrds(:,:,jk) = ( ( pts(:,:,jk,jp_sal,Kaa)*e3t(:,:,jk,Kaa) & 95 & - pts(:,:,jk,jp_sal,Kbb)*e3t(:,:,jk,Kbb) ) & 96 & / (e3t(:,:,jk,Kmm)*r2dt) ) - ztrds(:,:,jk) 87 ztrdt(:,:,jk) = ( ( pts(:,:,jk,jp_tem,Kaa)*e3t(:,:,jk,Kaa) & 88 & - pts(:,:,jk,jp_tem,Kbb)*e3t(:,:,jk,Kbb) ) & 89 & / ( e3t(:,:,jk,Kmm)*rDt ) ) & 90 & - ztrdt(:,:,jk) 91 ztrds(:,:,jk) = ( ( pts(:,:,jk,jp_sal,Kaa)*e3t(:,:,jk,Kaa) & 92 & - pts(:,:,jk,jp_sal,Kbb)*e3t(:,:,jk,Kbb) ) & 93 & / ( e3t(:,:,jk,Kmm)*rDt ) ) & 94 & - ztrds(:,:,jk) 97 95 END DO 98 96 !!gm this should be moved in trdtra.F90 and done on all trends -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRD/trddyn.F90
r12622 r12724 141 141 ! ! wind stress trends 142 142 ALLOCATE( z2dx(jpi,jpj) , z2dy(jpi,jpj) ) 143 z2dx(:,:) = ( utau_b(:,:) + utau(:,:) ) / ( e3u(:,:,1,Kmm) * r au0 )144 z2dy(:,:) = ( vtau_b(:,:) + vtau(:,:) ) / ( e3v(:,:,1,Kmm) * r au0 )143 z2dx(:,:) = ( utau_b(:,:) + utau(:,:) ) / ( e3u(:,:,1,Kmm) * rho0 ) 144 z2dy(:,:) = ( vtau_b(:,:) + vtau(:,:) ) / ( e3v(:,:,1,Kmm) * rho0 ) 145 145 CALL iom_put( "utrd_tau", z2dx ) 146 146 CALL iom_put( "vtrd_tau", z2dy ) -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRD/trdglo.F90
r12616 r12724 77 77 INTEGER :: ji, jj, jk ! dummy loop indices 78 78 INTEGER :: ikbu, ikbv ! local integers 79 REAL(wp):: zvm, zvt, zvs, z1_2r au0 ! local scalars79 REAL(wp):: zvm, zvt, zvs, z1_2rho0 ! local scalars 80 80 REAL(wp), DIMENSION(jpi,jpj) :: ztswu, ztswv, z2dx, z2dy ! 2D workspace 81 81 !!---------------------------------------------------------------------- … … 126 126 ! 127 127 IF( ktrd == jpdyn_zdf ) THEN ! zdf trend: compute separately the surface forcing trend 128 z1_2r au0 = 0.5_wp / rau0128 z1_2rho0 = 0.5_wp / rho0 129 129 DO_2D_10_10 130 130 zvt = ( utau_b(ji,jj) + utau(ji,jj) ) * tmask_i(ji+1,jj) * tmask_i(ji,jj) * umask(ji,jj,jk) & 131 & * z1_2r au0 * e1e2u(ji,jj)131 & * z1_2rho0 * e1e2u(ji,jj) 132 132 zvs = ( vtau_b(ji,jj) + vtau(ji,jj) ) * tmask_i(ji,jj+1) * tmask_i(ji,jj) * vmask(ji,jj,jk) & 133 & * z1_2r au0 * e1e2v(ji,jj)133 & * z1_2rho0 * e1e2v(ji,jj) 134 134 umo(jpdyn_tau) = umo(jpdyn_tau) + zvt 135 135 vmo(jpdyn_tau) = vmo(jpdyn_tau) + zvs … … 142 142 ! ! 143 143 ! IF( ln_drgimp ) THEN ! implicit drag case: compute separately the bottom friction 144 ! z1_2r au0 = 0.5_wp / rau0144 ! z1_2rho0 = 0.5_wp / rho0 145 145 ! DO jj = 1, jpjm1 146 146 ! DO ji = 1, jpim1 … … 204 204 CALL eos( ts(:,:,:,:,Kmm), rhd, rhop ) ! now potential density 205 205 206 zcof = 0.5_wp / r au0 ! Density flux at w-point206 zcof = 0.5_wp / rho0 ! Density flux at w-point 207 207 zkz(:,:,1) = 0._wp 208 208 DO jk = 2, jpk … … 210 210 END DO 211 211 212 zcof = 0.5_wp / r au0 ! Density flux at u and v-points212 zcof = 0.5_wp / rho0 ! Density flux at u and v-points 213 213 DO_3D_10_10( 1, jpkm1 ) 214 214 zkx(ji,jj,jk) = zcof * e2u(ji,jj) * e3u(ji,jj,jk,Kmm) & … … 351 351 9546 FORMAT(' 0 < horizontal diffusion : ', e20.13) 352 352 9547 FORMAT(' 0 < vertical diffusion : ', e20.13) 353 9548 FORMAT(' pressure gradient u2 = - 1/r au0 u.dz(rhop) : ', e20.13, ' u.dz(rhop) =', e20.13)353 9548 FORMAT(' pressure gradient u2 = - 1/rho0 u.dz(rhop) : ', e20.13, ' u.dz(rhop) =', e20.13) 354 354 ! 355 355 ! Save potential to kinetic energy conversion for next time step -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRD/trdken.F90
r12616 r12724 103 103 zke(:,1, : ) = 0._wp 104 104 DO_3D_01_01( 1, jpkm1 ) 105 zke(ji,jj,jk) = 0.5_wp * r au0 *( uu(ji ,jj,jk,Kmm) * putrd(ji ,jj,jk) * bu(ji ,jj,jk) &105 zke(ji,jj,jk) = 0.5_wp * rho0 *( uu(ji ,jj,jk,Kmm) * putrd(ji ,jj,jk) * bu(ji ,jj,jk) & 106 106 & + uu(ji-1,jj,jk,Kmm) * putrd(ji-1,jj,jk) * bu(ji-1,jj,jk) & 107 107 & + vv(ji,jj ,jk,Kmm) * pvtrd(ji,jj ,jk) * bv(ji,jj ,jk) & … … 124 124 zke2d(1,:) = 0._wp ; zke2d(:,1) = 0._wp 125 125 DO_2D_01_01 126 zke2d(ji,jj) = r1_r au0 * 0.5_wp * ( z2dx(ji,jj) + z2dx(ji-1,jj) &126 zke2d(ji,jj) = r1_rho0 * 0.5_wp * ( z2dx(ji,jj) + z2dx(ji-1,jj) & 127 127 & + z2dy(ji,jj) + z2dy(ji,jj-1) ) * r1_bt(ji,jj,1) 128 128 END_2D … … 208 208 ! 209 209 ! Local constant initialization 210 zcoef = - r au0 * grav * 0.5_wp210 zcoef = - rho0 * grav * 0.5_wp 211 211 212 212 ! Surface value (also valid in partial step case) -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRD/trdtra.F90
r12616 r12724 242 242 !!---------------------------------------------------------------------- 243 243 244 IF( neuler == 0 .AND. kt == nit000 ) THEN ; r2dt = rdt ! = rdt (restart with Euler time stepping)245 ELSEIF( kt <= nit000 + 1) THEN ; r2dt = 2. * rdt ! = 2 rdt (leapfrog)246 ENDIF247 248 244 ! ! 3D output of tracers trends using IOM interface 249 245 IF( ln_tra_trd ) CALL trd_tra_iom ( ptrdx, ptrdy, ktrd, kt, Kmm ) … … 253 249 254 250 ! ! Potential ENergy trends 255 IF( ln_PE_trd ) CALL trd_pen( ptrdx, ptrdy, ktrd, kt, r 2dt, Kmm )251 IF( ln_PE_trd ) CALL trd_pen( ptrdx, ptrdy, ktrd, kt, rDt, Kmm ) 256 252 257 253 ! ! Mixed layer trends for active tracers … … 286 282 CASE ( jptra_atf ) ; CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_atf, '3D' ) ! asselin time filter (last trend) 287 283 ! 288 CALL trd_mxl( kt, r 2dt ) ! trends: Mixed-layer (output)284 CALL trd_mxl( kt, rDt ) ! trends: Mixed-layer (output) 289 285 END SELECT 290 286 ! -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRD/trdvor.F90
r12622 r12724 106 106 ztswu(:,:) = 0.e0 ; ztswv(:,:) = 0.e0 107 107 DO_2D_00_00 108 ztswu(ji,jj) = 0.5 * ( utau_b(ji,jj) + utau(ji,jj) ) / ( e3u(ji,jj,1,Kmm) * r au0 )109 ztswv(ji,jj) = 0.5 * ( vtau_b(ji,jj) + vtau(ji,jj) ) / ( e3v(ji,jj,1,Kmm) * r au0 )108 ztswu(ji,jj) = 0.5 * ( utau_b(ji,jj) + utau(ji,jj) ) / ( e3u(ji,jj,1,Kmm) * rho0 ) 109 ztswv(ji,jj) = 0.5 * ( vtau_b(ji,jj) + vtau(ji,jj) ) / ( e3v(ji,jj,1,Kmm) * rho0 ) 110 110 END_2D 111 111 ! … … 390 390 ! III.1 compute total trend 391 391 ! ------------------------ 392 zmean = 1._wp / ( REAL( nmoydpvor, wp ) * 2._wp * r dt )392 zmean = 1._wp / ( REAL( nmoydpvor, wp ) * 2._wp * rn_Dt ) 393 393 vor_avrtot(:,:) = ( vor_avr(:,:) - vor_avrbn(:,:) + vor_avrb(:,:) - vor_avrbb(:,:) ) * zmean 394 394 … … 509 509 ENDIF 510 510 #if defined key_diainstant 511 zsto = nn_write*r dt511 zsto = nn_write*rn_Dt 512 512 clop = "inst("//TRIM(clop)//")" 513 513 #else 514 zsto = r dt514 zsto = rn_Dt 515 515 clop = "ave("//TRIM(clop)//")" 516 516 #endif 517 zout = nn_trd*r dt517 zout = nn_trd*rn_Dt 518 518 519 519 IF(lwp) WRITE(numout,*) ' netCDF initialization' … … 521 521 ! II.2 Compute julian date from starting date of the run 522 522 ! ------------------------ 523 CALL ymds2ju( nyear, nmonth, nday, r dt, zjulian )523 CALL ymds2ju( nyear, nmonth, nday, rn_Dt, zjulian ) 524 524 zjulian = zjulian - adatrj ! set calendar origin to the beginning of the experiment 525 525 IF(lwp) WRITE(numout,*)' ' … … 533 533 IF(lwp) WRITE(numout,*) ' Name of NETCDF file ', clhstnam 534 534 CALL histbeg( clhstnam, jpi, glamf, jpj, gphif,1, jpi, & ! Horizontal grid : glamt and gphit 535 & 1, jpj, nit000-1, zjulian, r dt, nh_t, nidvor, domain_id=nidom, snc4chunks=snc4set )535 & 1, jpj, nit000-1, zjulian, rn_Dt, nh_t, nidvor, domain_id=nidom, snc4chunks=snc4set ) 536 536 CALL wheneq( jpi*jpj, fmask, 1, 1., ndexvor1, ndimvor1 ) ! surface 537 537 -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/USR/usrdef_hgr.F90
r12377 r12724 107 107 IF( ln_bench ) THEN ! benchmark: forced the resolution to be 106 km 108 108 ze1 = 106000._wp ! but keep (lat,lon) at the right nn_GYRE resolution 109 CALL ctl_warn( ' GYRE used as Benchmark: e1=e2=106km, no need to adjust r dt, ahm,aht ' )109 CALL ctl_warn( ' GYRE used as Benchmark: e1=e2=106km, no need to adjust rn_Dt, ahm,aht ' ) 110 110 ENDIF 111 111 IF( nprint==1 .AND. lwp ) THEN -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/USR/usrdef_sbc.F90
r12377 r12724 89 89 90 90 ! current day (in hours) since january the 1st of the current year 91 ztime = REAL( kt ) * r dt / (rmmss * rhhmm) & ! total incrementation (in hours)91 ztime = REAL( kt ) * rn_Dt / (rmmss * rhhmm) & ! total incrementation (in hours) 92 92 & - (nyear - 1) * rjjhh * zyydd ! minus years since beginning of experiment (in hours) 93 93 … … 154 154 !accumulates days of previous months of this year 155 155 ! day (in hours) since january the 1st 156 ztime = FLOAT( kt ) * r dt / (rmmss * rhhmm) & ! incrementation in hour156 ztime = FLOAT( kt ) * rn_Dt / (rmmss * rhhmm) & ! incrementation in hour 157 157 & - (nyear - 1) * rjjhh * zyydd ! - nber of hours the precedent years 158 158 ztimemax = ((5.*30.)+21.)* 24. ! 21th june in hours -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/ZDF/zdfdrg.F90
r12616 r12724 166 166 !!--------------------------------------------------------------------- 167 167 ! 168 !!gm bug : time step is only r dt (not 2 rdt if euler start !)169 zm1_2dt = - 1._wp / ( 2._wp * r dt )168 !!gm bug : time step is only rn_Dt (not 2 rn_Dt if euler start !) 169 zm1_2dt = - 1._wp / ( 2._wp * rn_Dt ) 170 170 171 171 IF( l_trddyn ) THEN ! trends: store the input trends -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/ZDF/zdfgls.F90
r12622 r12724 171 171 ! 172 172 ! surface friction 173 ustar2_surf(ji,jj) = r1_r au0 * taum(ji,jj) * tmask(ji,jj,1)173 ustar2_surf(ji,jj) = r1_rho0 * taum(ji,jj) * tmask(ji,jj,1) 174 174 ! 175 175 !!gm Rq we may add here r_ke0(_top/_bot) ? ==>> think about that... … … 270 270 & / ( e3t(ji,jj,jk ,Kmm) * e3w(ji,jj,jk,Kmm) ) 271 271 ! ! diagonal 272 zdiag(ji,jj,jk) = 1._wp - zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) + r dt * zdiss * wmask(ji,jj,jk)272 zdiag(ji,jj,jk) = 1._wp - zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) + rn_Dt * zdiss * wmask(ji,jj,jk) 273 273 ! ! right hand side in en 274 en(ji,jj,jk) = en(ji,jj,jk) + r dt * zesh2 * wmask(ji,jj,jk)274 en(ji,jj,jk) = en(ji,jj,jk) + rn_Dt * zesh2 * wmask(ji,jj,jk) 275 275 END_3D 276 276 ! … … 482 482 & / ( e3t(ji,jj,jk ,Kmm) * e3w(ji,jj,jk,Kmm) ) 483 483 ! ! diagonal 484 zdiag(ji,jj,jk) = 1._wp - zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) + r dt * zdiss * wmask(ji,jj,jk)484 zdiag(ji,jj,jk) = 1._wp - zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) + rn_Dt * zdiss * wmask(ji,jj,jk) 485 485 ! ! right hand side in psi 486 psi(ji,jj,jk) = psi(ji,jj,jk) + r dt * zesh2 * wmask(ji,jj,jk)486 psi(ji,jj,jk) = psi(ji,jj,jk) + rn_Dt * zesh2 * wmask(ji,jj,jk) 487 487 END_3D 488 488 ! … … 1012 1012 rc04 = rc03 * rc0 1013 1013 rsbc_tke1 = -3._wp/2._wp*rn_crban*ra_sf*rl_sf ! Dirichlet + Wave breaking 1014 rsbc_tke2 = r dt * rn_crban / rl_sf ! Neumann + Wave breaking1014 rsbc_tke2 = rn_Dt * rn_crban / rl_sf ! Neumann + Wave breaking 1015 1015 zcr = MAX(rsmall, rsbc_tke1**(1./(-ra_sf*3._wp/2._wp))-1._wp ) 1016 1016 rtrans = 0.2_wp / zcr ! Ad. inverse transition length between log and wave layer 1017 1017 rsbc_zs1 = rn_charn/grav ! Charnock formula for surface roughness 1018 1018 rsbc_zs2 = rn_frac_hs / 0.85_wp / grav * 665._wp ! Rascle formula for surface roughness 1019 rsbc_psi1 = -0.5_wp * r dt * rc0**(rpp-2._wp*rmm) / rsc_psi1020 rsbc_psi2 = -0.5_wp * r dt * rc0**rpp * rnn * vkarmn**rnn / rsc_psi ! Neumann + NO Wave breaking1021 ! 1022 rfact_tke = -0.5_wp / rsc_tke * r dt ! Cst used for the Diffusion term of tke1023 rfact_psi = -0.5_wp / rsc_psi * r dt ! Cst used for the Diffusion term of tke1019 rsbc_psi1 = -0.5_wp * rn_Dt * rc0**(rpp-2._wp*rmm) / rsc_psi 1020 rsbc_psi2 = -0.5_wp * rn_Dt * rc0**rpp * rnn * vkarmn**rnn / rsc_psi ! Neumann + NO Wave breaking 1021 ! 1022 rfact_tke = -0.5_wp / rsc_tke * rn_Dt ! Cst used for the Diffusion term of tke 1023 rfact_psi = -0.5_wp / rsc_psi * rn_Dt ! Cst used for the Diffusion term of tke 1024 1024 ! 1025 1025 ! !* Wall proximity function -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/ZDF/zdfiwm.F90
r12622 r12724 23 23 USE phycst ! physical constants 24 24 ! 25 USE fldread ! field read 25 26 USE prtctl ! Print control 26 27 USE in_out_manager ! I/O manager … … 88 89 !! This is divided into three components: 89 90 !! 1. Bottom-intensified low-mode dissipation at critical slopes 90 !! zemx_iwm(z) = ( ecri_iwm / r au0 ) * EXP( -(H-z)/hcri_iwm )91 !! zemx_iwm(z) = ( ecri_iwm / rho0 ) * EXP( -(H-z)/hcri_iwm ) 91 92 !! / ( 1. - EXP( - H/hcri_iwm ) ) * hcri_iwm 92 93 !! where hcri_iwm is the characteristic length scale of the bottom 93 94 !! intensification, ecri_iwm a map of available power, and H the ocean depth. 94 95 !! 2. Pycnocline-intensified low-mode dissipation 95 !! zemx_iwm(z) = ( epyc_iwm / r au0 ) * ( sqrt(rn2(z))^nn_zpyc )96 !! zemx_iwm(z) = ( epyc_iwm / rho0 ) * ( sqrt(rn2(z))^nn_zpyc ) 96 97 !! / SUM( sqrt(rn2(z))^nn_zpyc * e3w[z) ) 97 98 !! where epyc_iwm is a map of available power, and nn_zpyc … … 99 100 !! energy dissipation. 100 101 !! 3. WKB-height dependent high mode dissipation 101 !! zemx_iwm(z) = ( ebot_iwm / r au0 ) * rn2(z) * EXP(-z_wkb(z)/hbot_iwm)102 !! zemx_iwm(z) = ( ebot_iwm / rho0 ) * rn2(z) * EXP(-z_wkb(z)/hbot_iwm) 102 103 !! / SUM( rn2(z) * EXP(-z_wkb(z)/hbot_iwm) * e3w[z) ) 103 104 !! where hbot_iwm is the characteristic length scale of the WKB bottom … … 152 153 DO_2D_11_11 153 154 zhdep(ji,jj) = gdepw_0(ji,jj,mbkt(ji,jj)+1) ! depth of the ocean 154 zfact(ji,jj) = r au0 * ( 1._wp - EXP( -zhdep(ji,jj) / hcri_iwm(ji,jj) ) )155 zfact(ji,jj) = rho0 * ( 1._wp - EXP( -zhdep(ji,jj) / hcri_iwm(ji,jj) ) ) 155 156 IF( zfact(ji,jj) /= 0._wp ) zfact(ji,jj) = ecri_iwm(ji,jj) / zfact(ji,jj) 156 157 END_2D … … 184 185 ! 185 186 DO_2D_11_11 186 IF( zfact(ji,jj) /= 0 ) zfact(ji,jj) = epyc_iwm(ji,jj) / ( r au0 * zfact(ji,jj) )187 IF( zfact(ji,jj) /= 0 ) zfact(ji,jj) = epyc_iwm(ji,jj) / ( rho0 * zfact(ji,jj) ) 187 188 END_2D 188 189 ! … … 199 200 ! 200 201 DO_2D_11_11 201 IF( zfact(ji,jj) /= 0 ) zfact(ji,jj) = epyc_iwm(ji,jj) / ( r au0 * zfact(ji,jj) )202 IF( zfact(ji,jj) /= 0 ) zfact(ji,jj) = epyc_iwm(ji,jj) / ( rho0 * zfact(ji,jj) ) 202 203 END_2D 203 204 ! … … 246 247 ! 247 248 DO_2D_11_11 248 IF( zfact(ji,jj) /= 0 ) zfact(ji,jj) = ebot_iwm(ji,jj) / ( r au0 * zfact(ji,jj) )249 IF( zfact(ji,jj) /= 0 ) zfact(ji,jj) = ebot_iwm(ji,jj) / ( rho0 * zfact(ji,jj) ) 249 250 END_2D 250 251 ! … … 258 259 ! Calculate molecular kinematic viscosity 259 260 znu_t(:,:,:) = 1.e-4_wp * ( 17.91_wp - 0.53810_wp * ts(:,:,:,jp_tem,Kmm) + 0.00694_wp * ts(:,:,:,jp_tem,Kmm) * ts(:,:,:,jp_tem,Kmm) & 260 & + 0.02305_wp * ts(:,:,:,jp_sal,Kmm) ) * tmask(:,:,:) * r1_r au0261 & + 0.02305_wp * ts(:,:,:,jp_sal,Kmm) ) * tmask(:,:,:) * r1_rho0 261 262 DO jk = 2, jpkm1 262 263 znu_w(:,:,jk) = 0.5_wp * ( znu_t(:,:,jk-1) + znu_t(:,:,jk) ) * wmask(:,:,jk) … … 296 297 END_3D 297 298 CALL mpp_sum( 'zdfiwm', zztmp ) 298 zztmp = r au0 * zztmp ! Global integral of rauo * Kz * N^2 = power contributing to mixing299 zztmp = rho0 * zztmp ! Global integral of rauo * Kz * N^2 = power contributing to mixing 299 300 ! 300 301 IF(lwp) THEN … … 340 341 !* output useful diagnostics: Kz*N^2 , 341 342 !!gm Kz*N2 should take into account the ratio avs/avt if it is used.... (see diaar5) 342 ! vertical integral of r au0 * Kz * N^2 , energy density (zemx_iwm)343 ! vertical integral of rho0 * Kz * N^2 , energy density (zemx_iwm) 343 344 IF( iom_use("bflx_iwm") .OR. iom_use("pcmap_iwm") ) THEN 344 345 ALLOCATE( z2d(jpi,jpj) , z3d(jpi,jpj,jpk) ) … … 348 349 z2d(:,:) = z2d(:,:) + e3w(:,:,jk,Kmm) * z3d(:,:,jk) * wmask(:,:,jk) 349 350 END DO 350 z2d(:,:) = r au0 * z2d(:,:)351 z2d(:,:) = rho0 * z2d(:,:) 351 352 CALL iom_put( "bflx_iwm", z3d ) 352 353 CALL iom_put( "pcmap_iwm", z2d ) … … 386 387 !! de Lavergne et al. in prep., 2017 387 388 !!---------------------------------------------------------------------- 388 INTEGER :: inum ! local integer 389 INTEGER :: ifpr ! dummy loop indices 390 INTEGER :: inum ! local integer 389 391 INTEGER :: ios 390 392 REAL(wp) :: zbot, zpyc, zcri ! local scalars 391 !! 392 NAMELIST/namzdf_iwm/ nn_zpyc, ln_mevar, ln_tsdiff 393 ! 394 CHARACTER(len=256) :: cn_dir ! Root directory for location of ssr files 395 INTEGER, PARAMETER :: jpiwm = 5 ! maximum number of files to read 396 INTEGER, PARAMETER :: jp_mpb = 1 397 INTEGER, PARAMETER :: jp_mpp = 2 398 INTEGER, PARAMETER :: jp_mpc = 3 399 INTEGER, PARAMETER :: jp_dsb = 4 400 INTEGER, PARAMETER :: jp_dsc = 5 401 ! 402 TYPE(FLD_N), DIMENSION(jpiwm) :: slf_iwm ! array of namelist informations 403 TYPE(FLD_N) :: sn_mpb, sn_mpp, sn_mpc ! informations about Mixing Power field to be read 404 TYPE(FLD_N) :: sn_dsb, sn_dsc ! informations about Decay Scale field to be read 405 TYPE(FLD ), DIMENSION(jpiwm) :: sf_iwm ! structure of input fields (file informations, fields read) 406 ! 407 NAMELIST/namzdf_iwm/ nn_zpyc, ln_mevar, ln_tsdiff, & 408 & cn_dir, sn_mpb, sn_mpp, sn_mpc, sn_dsb, sn_dsc 393 409 !!---------------------------------------------------------------------- 394 410 ! … … 425 441 IF( zdf_iwm_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'zdf_iwm_init : unable to allocate iwm arrays' ) 426 442 ! 443 ! store namelist information in an array 444 slf_iwm(jp_mpb) = sn_mpb ; slf_iwm(jp_mpp) = sn_mpp ; slf_iwm(jp_mpc) = sn_mpc 445 slf_iwm(jp_dsb) = sn_dsb ; slf_iwm(jp_dsc) = sn_dsc 446 ! 447 DO ifpr= 1, jpiwm 448 ALLOCATE( sf_iwm(ifpr)%fnow(jpi,jpj,1) ) 449 IF( slf_iwm(ifpr)%ln_tint )ALLOCATE( sf_iwm(ifpr)%fdta(jpi,jpj,1,2) ) 450 END DO 451 452 ! fill sf_iwm with sf_iwm and control print 453 CALL fld_fill( sf_iwm, slf_iwm , cn_dir, 'zdfiwm_init', 'iwm input file', 'namiwm' ) 454 455 ! ! hard-coded default definition (to be defined in namelist ?) 456 sf_iwm(jp_mpb)%fnow(:,:,1) = 1.e-6 457 sf_iwm(jp_mpp)%fnow(:,:,1) = 1.e-6 458 sf_iwm(jp_mpc)%fnow(:,:,1) = 1.e-10 459 sf_iwm(jp_dsb)%fnow(:,:,1) = 100. 460 sf_iwm(jp_dsc)%fnow(:,:,1) = 100. 461 427 462 ! ! read necessary fields 428 CALL iom_open('mixing_power_bot',inum) ! energy flux for high-mode wave breaking [W/m2] 429 CALL iom_get (inum, jpdom_data, 'field', ebot_iwm, 1 ) 430 CALL iom_close(inum) 431 ! 432 CALL iom_open('mixing_power_pyc',inum) ! energy flux for pynocline-intensified wave breaking [W/m2] 433 CALL iom_get (inum, jpdom_data, 'field', epyc_iwm, 1 ) 434 CALL iom_close(inum) 435 ! 436 CALL iom_open('mixing_power_cri',inum) ! energy flux for critical slope wave breaking [W/m2] 437 CALL iom_get (inum, jpdom_data, 'field', ecri_iwm, 1 ) 438 CALL iom_close(inum) 439 ! 440 CALL iom_open('decay_scale_bot',inum) ! spatially variable decay scale for high-mode wave breaking [m] 441 CALL iom_get (inum, jpdom_data, 'field', hbot_iwm, 1 ) 442 CALL iom_close(inum) 443 ! 444 CALL iom_open('decay_scale_cri',inum) ! spatially variable decay scale for critical slope wave breaking [m] 445 CALL iom_get (inum, jpdom_data, 'field', hcri_iwm, 1 ) 446 CALL iom_close(inum) 447 448 ebot_iwm(:,:) = ebot_iwm(:,:) * ssmask(:,:) 449 epyc_iwm(:,:) = epyc_iwm(:,:) * ssmask(:,:) 450 ecri_iwm(:,:) = ecri_iwm(:,:) * ssmask(:,:) 463 CALL fld_read( nit000, 1, sf_iwm ) 464 465 ebot_iwm(:,:) = sf_iwm(1)%fnow(:,:,1) * ssmask(:,:) ! energy flux for high-mode wave breaking [W/m2] 466 epyc_iwm(:,:) = sf_iwm(2)%fnow(:,:,1) * ssmask(:,:) ! energy flux for pynocline-intensified wave breaking [W/m2] 467 ecri_iwm(:,:) = sf_iwm(3)%fnow(:,:,1) * ssmask(:,:) ! energy flux for critical slope wave breaking [W/m2] 468 hbot_iwm(:,:) = sf_iwm(4)%fnow(:,:,1) ! spatially variable decay scale for high-mode wave breaking [m] 469 hcri_iwm(:,:) = sf_iwm(5)%fnow(:,:,1) ! spatially variable decay scale for critical slope wave breaking [m] 451 470 452 471 zbot = glob_sum( 'zdfiwm', e1e2t(:,:) * ebot_iwm(:,:) ) 453 472 zpyc = glob_sum( 'zdfiwm', e1e2t(:,:) * epyc_iwm(:,:) ) 454 473 zcri = glob_sum( 'zdfiwm', e1e2t(:,:) * ecri_iwm(:,:) ) 474 455 475 IF(lwp) THEN 456 476 WRITE(numout,*) ' High-mode wave-breaking energy: ', zbot * 1.e-12_wp, 'TW' -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/ZDF/zdfmxl.F90
r12624 r12724 98 98 nmln(:,:) = nlb10 ! Initialization to the number of w ocean point 99 99 hmlp(:,:) = 0._wp ! here hmlp used as a dummy variable, integrating vertically N^2 100 zN2_c = grav * rho_c * r1_r au0 ! convert density criteria into N^2 criteria100 zN2_c = grav * rho_c * r1_rho0 ! convert density criteria into N^2 criteria 101 101 DO_3D_11_11( nlb10, jpkm1 ) 102 102 ikt = mbkt(ji,jj) -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/ZDF/zdfosm.F90
r12625 r12724 302 302 DO_2D_00_00 303 303 ! Surface downward irradiance (so always +ve) 304 zrad0(ji,jj) = qsr(ji,jj) * r1_r au0_rcp304 zrad0(ji,jj) = qsr(ji,jj) * r1_rho0_rcp 305 305 ! Downwards irradiance at base of boundary layer 306 306 zradh(ji,jj) = zrad0(ji,jj) * ( zz0 * EXP( -hbl(ji,jj)/rn_si0 ) + zz1 * EXP( -hbl(ji,jj)/rn_si1) ) … … 314 314 zbeta = rab_n(ji,jj,1,jp_sal) 315 315 ! Upwards surface Temperature flux for non-local term 316 zwth0(ji,jj) = - qns(ji,jj) * r1_r au0_rcp * tmask(ji,jj,1)316 zwth0(ji,jj) = - qns(ji,jj) * r1_rho0_rcp * tmask(ji,jj,1) 317 317 ! Upwards surface salinity flux for non-local term 318 zws0(ji,jj) = - ( ( emp(ji,jj)-rnf(ji,jj) ) * ts(ji,jj,1,jp_sal,Kmm) + sfx(ji,jj) ) * r1_r au0 * tmask(ji,jj,1)318 zws0(ji,jj) = - ( ( emp(ji,jj)-rnf(ji,jj) ) * ts(ji,jj,1,jp_sal,Kmm) + sfx(ji,jj) ) * r1_rho0 * tmask(ji,jj,1) 319 319 ! Non radiative upwards surface buoyancy flux 320 320 zwb0(ji,jj) = grav * zthermal * zwth0(ji,jj) - grav * zbeta * zws0(ji,jj) … … 326 326 zwbav(ji,jj) = grav * zthermal * zwthav(ji,jj) - grav * zbeta * zwsav(ji,jj) 327 327 ! Surface upward velocity fluxes 328 zuw0(ji,jj) = -utau(ji,jj) * r1_r au0 * tmask(ji,jj,1)329 zvw0(ji,jj) = -vtau(ji,jj) * r1_r au0 * tmask(ji,jj,1)328 zuw0(ji,jj) = -utau(ji,jj) * r1_rho0 * tmask(ji,jj,1) 329 zvw0(ji,jj) = -vtau(ji,jj) * r1_rho0 * tmask(ji,jj,1) 330 330 ! Friction velocity (zustar), at T-point : LMD94 eq. 2 331 331 zustar(ji,jj) = MAX( SQRT( SQRT( zuw0(ji,jj) * zuw0(ji,jj) + zvw0(ji,jj) * zvw0(ji,jj) ) ), 1.0e-8 ) … … 443 443 & + 0.135 * zla(ji,jj) * zwstrl(ji,jj)**3/hbl(ji,jj) ) 444 444 445 zvel_max = - ( 1.0 + 1.0 * ( zwstrl(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird * rn_ rdt / hbl(ji,jj) ) &445 zvel_max = - ( 1.0 + 1.0 * ( zwstrl(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird * rn_Dt / hbl(ji,jj) ) & 446 446 & * zwb_ent(ji,jj) / ( zwstrl(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird 447 447 ! Entrainment including component due to shear turbulence. Modified Langmuir component, but gives same result for La=0.3 For testing uncomment. … … 449 449 ! & + ( 0.15 * ( 1.0 - EXP( -0.5 * zla(ji,jj) ) ) + 0.03 / zla(ji,jj)**2 ) * zustar(ji,jj)**3/hbl(ji,jj) ) 450 450 451 ! zvel_max = - ( 1.0 + 1.0 * ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird * rn_ rdt / zhbl(ji,jj) ) * zwb_ent(ji,jj) / &451 ! zvel_max = - ( 1.0 + 1.0 * ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird * rn_Dt / zhbl(ji,jj) ) * zwb_ent(ji,jj) / & 452 452 ! & ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird 453 453 zzdhdt = - zwb_ent(ji,jj) / ( zvel_max + MAX(zdb_bl(ji,jj),0.0) ) … … 460 460 IF ( zzdhdt < 0._wp ) THEN 461 461 ! For long timsteps factor in brackets slows the rapid collapse of the OSBL 462 zpert = 2.0 * ( 1.0 + 2.0 * zwstrl(ji,jj) * rn_ rdt / hbl(ji,jj) ) * zwstrl(ji,jj)**2 / hbl(ji,jj)462 zpert = 2.0 * ( 1.0 + 2.0 * zwstrl(ji,jj) * rn_Dt / hbl(ji,jj) ) * zwstrl(ji,jj)**2 / hbl(ji,jj) 463 463 ELSE 464 zpert = 2.0 * ( 1.0 + 2.0 * zwstrl(ji,jj) * rn_ rdt / hbl(ji,jj) ) * zwstrl(ji,jj)**2 / hbl(ji,jj) &464 zpert = 2.0 * ( 1.0 + 2.0 * zwstrl(ji,jj) * rn_Dt / hbl(ji,jj) ) * zwstrl(ji,jj)**2 / hbl(ji,jj) & 465 465 & + MAX( zdb_bl(ji,jj), 0.0 ) 466 466 ENDIF … … 474 474 ibld(:,:) = 3 475 475 476 zhbl_t(:,:) = hbl(:,:) + (zdhdt(:,:) - ww(ji,jj,ibld(ji,jj)))* rn_ rdt ! certainly need wb here, so subtract it476 zhbl_t(:,:) = hbl(:,:) + (zdhdt(:,:) - ww(ji,jj,ibld(ji,jj)))* rn_Dt ! certainly need wb here, so subtract it 477 477 zhbl_t(:,:) = MIN(zhbl_t(:,:), ht(:,:)) 478 zdhdt(:,:) = MIN(zdhdt(:,:), (zhbl_t(:,:) - hbl(:,:))/rn_ rdt + ww(ji,jj,ibld(ji,jj))) ! adjustment to represent limiting by ocean bottom478 zdhdt(:,:) = MIN(zdhdt(:,:), (zhbl_t(:,:) - hbl(:,:))/rn_Dt + ww(ji,jj,ibld(ji,jj))) ! adjustment to represent limiting by ocean bottom 479 479 480 480 DO_3D_00_00( 4, jpkm1 ) … … 498 498 IF ( lconv(ji,jj) ) THEN 499 499 !unstable 500 zvel_max = - ( 1.0 + 1.0 * ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird * rn_ rdt / hbl(ji,jj) ) &500 zvel_max = - ( 1.0 + 1.0 * ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird * rn_Dt / hbl(ji,jj) ) & 501 501 & * zwb_ent(ji,jj) / ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird 502 502 … … 505 505 & - zbeta * ( zs_bl(ji,jj) - ts(ji,jj,jm,jp_sal,Kmm) ) ), 0.0 ) + zvel_max 506 506 507 zhbl_s = zhbl_s + MIN( - zwb_ent(ji,jj) / zdb * rn_ rdt / FLOAT(ibld(ji,jj)-imld(ji,jj) ), &507 zhbl_s = zhbl_s + MIN( - zwb_ent(ji,jj) / zdb * rn_Dt / FLOAT(ibld(ji,jj)-imld(ji,jj) ), & 508 508 & e3w(ji,jj,jk,Kmm) ) 509 509 zhbl_s = MIN(zhbl_s, ht(ji,jj)) … … 1255 1255 IF ( iom_use("us_x") ) CALL iom_put( "us_x", tmask(:,:,1)*zustke*zcos_wind ) ! x surface Stokes drift 1256 1256 IF ( iom_use("us_y") ) CALL iom_put( "us_y", tmask(:,:,1)*zustke*zsin_wind ) ! y surface Stokes drift 1257 IF ( iom_use("wind_wave_abs_power") ) CALL iom_put( "wind_wave_abs_power", 1000.*r au0*tmask(:,:,1)*zustar**2*zustke )1257 IF ( iom_use("wind_wave_abs_power") ) CALL iom_put( "wind_wave_abs_power", 1000.*rho0*tmask(:,:,1)*zustar**2*zustke ) 1258 1258 ! Stokes drift read in from sbcwave (=2). 1259 1259 CASE(2) 1260 1260 IF ( iom_use("us_x") ) CALL iom_put( "us_x", ut0sd ) ! x surface Stokes drift 1261 1261 IF ( iom_use("us_y") ) CALL iom_put( "us_y", vt0sd ) ! y surface Stokes drift 1262 IF ( iom_use("wind_wave_abs_power") ) CALL iom_put( "wind_wave_abs_power", 1000.*r au0*tmask(:,:,1)*zustar**2* &1262 IF ( iom_use("wind_wave_abs_power") ) CALL iom_put( "wind_wave_abs_power", 1000.*rho0*tmask(:,:,1)*zustar**2* & 1263 1263 & SQRT(ut0sd**2 + vt0sd**2 ) ) 1264 1264 END SELECT … … 1276 1276 IF ( iom_use("zwstrl") ) CALL iom_put( "zwstrl", tmask(:,:,1)*zwstrl ) ! Langmuir velocity scale 1277 1277 IF ( iom_use("zustar") ) CALL iom_put( "zustar", tmask(:,:,1)*zustar ) ! friction velocity scale 1278 IF ( iom_use("wind_power") ) CALL iom_put( "wind_power", 1000.*r au0*tmask(:,:,1)*zustar**3 ) ! BL depth internal to zdf_osm routine1279 IF ( iom_use("wind_wave_power") ) CALL iom_put( "wind_wave_power", 1000.*r au0*tmask(:,:,1)*zustar**2*zustke )1278 IF ( iom_use("wind_power") ) CALL iom_put( "wind_power", 1000.*rho0*tmask(:,:,1)*zustar**3 ) ! BL depth internal to zdf_osm routine 1279 IF ( iom_use("wind_wave_power") ) CALL iom_put( "wind_wave_power", 1000.*rho0*tmask(:,:,1)*zustar**2*zustke ) 1280 1280 IF ( iom_use("zhbl") ) CALL iom_put( "zhbl", tmask(:,:,1)*zhbl ) ! BL depth internal to zdf_osm routine 1281 1281 IF ( iom_use("zhml") ) CALL iom_put( "zhml", tmask(:,:,1)*zhml ) ! ML depth internal to zdf_osm routine … … 1505 1505 imld_rst(:,:) = nlb10 ! Initialization to the number of w ocean point 1506 1506 hbl(:,:) = 0._wp ! here hbl used as a dummy variable, integrating vertically N^2 1507 zN2_c = grav * rho_c * r1_r au0 ! convert density criteria into N^2 criteria1507 zN2_c = grav * rho_c * r1_rho0 ! convert density criteria into N^2 criteria 1508 1508 ! 1509 1509 hbl(:,:) = 0._wp ! here hbl used as a dummy variable, integrating vertically N^2 -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/ZDF/zdfric.F90
r12377 r12724 174 174 ! 175 175 DO_2D_00_00 176 zustar = SQRT( taum(ji,jj) * r1_r au0 )176 zustar = SQRT( taum(ji,jj) * r1_rho0 ) 177 177 zhek = rn_ekmfc * zustar / ( ABS( ff_t(ji,jj) ) + rsmall ) ! Ekman depth 178 178 zh_ekm(ji,jj) = MAX( rn_mldmin , MIN( zhek , rn_mldmax ) ) ! set allowed range -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/ZDF/zdftke.F90
r12622 r12724 207 207 !!-------------------------------------------------------------------- 208 208 ! 209 zbbrau = rn_ebb / r au0 ! Local constant initialisation210 zfact1 = -.5_wp * r dt211 zfact2 = 1.5_wp * r dt * rn_ediss209 zbbrau = rn_ebb / rho0 ! Local constant initialisation 210 zfact1 = -.5_wp * rn_Dt 211 zfact2 = 1.5_wp * rn_Dt * rn_ediss 212 212 zfact3 = 0.5_wp * rn_ediss 213 213 ! … … 215 215 ! ! Surface/top/bottom boundary condition on tke 216 216 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 217 217 ! 218 218 DO_2D_00_00 219 219 en(ji,jj,1) = MAX( rn_emin0, zbbrau * taum(ji,jj) ) * tmask(ji,jj,1) 220 220 END_2D 221 IF ( ln_isfcav ) THEN222 DO_2D_00_00223 en(ji,jj,mikt(ji,jj)) = rn_emin * tmask(ji,jj,1)224 END_2D225 ENDIF226 221 ! 227 222 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< … … 229 224 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 230 225 ! 231 ! en(bot) = (ebb0/r au0)*0.5*sqrt(u_botfr^2+v_botfr^2) (min value rn_emin)226 ! en(bot) = (ebb0/rho0)*0.5*sqrt(u_botfr^2+v_botfr^2) (min value rn_emin) 232 227 ! where ebb0 does not includes surface wave enhancement (i.e. ebb0=3.75) 233 228 ! Note that stress averaged is done using an wet-only calculation of u and v at t-point like in zdfsh2 … … 238 233 zmsku = ( 2. - umask(ji-1,jj,mbkt(ji,jj)) * umask(ji,jj,mbkt(ji,jj)) ) 239 234 zmskv = ( 2. - vmask(ji,jj-1,mbkt(ji,jj)) * vmask(ji,jj,mbkt(ji,jj)) ) 240 ! ! where 0.001875 = (rn_ebb0/r au0) * 0.5 = 3.75*0.5/1000. (CAUTION CdU<0)235 ! ! where 0.001875 = (rn_ebb0/rho0) * 0.5 = 3.75*0.5/1000. (CAUTION CdU<0) 241 236 zebot = - 0.001875_wp * rCdU_bot(ji,jj) * SQRT( ( zmsku*( uu(ji,jj,mbkt(ji,jj),Kbb)+uu(ji-1,jj,mbkt(ji,jj),Kbb) ) )**2 & 242 237 & + ( zmskv*( vv(ji,jj,mbkt(ji,jj),Kbb)+vv(ji,jj-1,mbkt(ji,jj),Kbb) ) )**2 ) … … 247 242 zmsku = ( 2. - umask(ji-1,jj,mikt(ji,jj)) * umask(ji,jj,mikt(ji,jj)) ) 248 243 zmskv = ( 2. - vmask(ji,jj-1,mikt(ji,jj)) * vmask(ji,jj,mikt(ji,jj)) ) 249 ! ! where 0.001875 = (rn_ebb0/r au0) * 0.5 = 3.75*0.5/1000. (CAUTION CdU<0)244 ! ! where 0.001875 = (rn_ebb0/rho0) * 0.5 = 3.75*0.5/1000. (CAUTION CdU<0) 250 245 zetop = - 0.001875_wp * rCdU_top(ji,jj) * SQRT( ( zmsku*( uu(ji,jj,mikt(ji,jj),Kbb)+uu(ji-1,jj,mikt(ji,jj),Kbb) ) )**2 & 251 246 & + ( zmskv*( vv(ji,jj,mikt(ji,jj),Kbb)+vv(ji,jj-1,mikt(ji,jj),Kbb) ) )**2 ) 252 en(ji,jj,mikt(ji,jj)) = MAX( zetop, rn_emin ) * (1._wp - tmask(ji,jj,1)) ! masked at ocean surface247 en(ji,jj,mikt(ji,jj)) = en(ji,jj,1) * tmask(ji,jj,1) + MAX( zetop, rn_emin ) * (1._wp - tmask(ji,jj,1)) * ssmask(ji,jj) ! masked at ocean surface 253 248 END_2D 254 249 ENDIF … … 290 285 zwlc = rn_lc * SIN( rpi * gdepw(ji,jj,jk,Kmm) / zhlc(ji,jj) ) ! warning: optimization: zus^3 is in zfr_i 291 286 ! ! TKE Langmuir circulation source term 292 en(ji,jj,jk) = en(ji,jj,jk) + r dt * zfr_i(ji,jj) * ( zwlc * zwlc * zwlc ) / zhlc(ji,jj)287 en(ji,jj,jk) = en(ji,jj,jk) + rn_Dt * zfr_i(ji,jj) * ( zwlc * zwlc * zwlc ) / zhlc(ji,jj) 293 288 ENDIF 294 289 ENDIF … … 329 324 ! 330 325 ! ! right hand side in en 331 en(ji,jj,jk) = en(ji,jj,jk) + r dt * ( p_sh2(ji,jj,jk)& ! shear326 en(ji,jj,jk) = en(ji,jj,jk) + rn_Dt * ( p_sh2(ji,jj,jk) & ! shear 332 327 & - p_avt(ji,jj,jk) * rn2(ji,jj,jk) & ! stratification 333 328 & + zfact3 * dissl(ji,jj,jk) * en(ji,jj,jk) & ! dissipation … … 443 438 zmxld(:,:,:) = rmxl_min 444 439 ! 445 IF( ln_mxl0 ) THEN ! surface mixing length = F(stress) : l=vkarmn*2.e5*taum/(r au0*g)446 zraug = vkarmn * 2.e5_wp / ( r au0 * grav )440 IF( ln_mxl0 ) THEN ! surface mixing length = F(stress) : l=vkarmn*2.e5*taum/(rho0*g) 441 zraug = vkarmn * 2.e5_wp / ( rho0 * grav ) 447 442 DO_2D_00_00 448 443 zmxlm(ji,jj,1) = MAX( rn_mxl0, zraug * taum(ji,jj) * tmask(ji,jj,1) ) … … 527 522 IF( nn_pdl == 1 ) THEN !* Prandtl number case: update avt 528 523 DO_3D_00_00( 2, jpkm1 ) 529 p_avt(ji,jj,jk) = MAX( apdlr(ji,jj,jk) * p_avt(ji,jj,jk), avtb_2d(ji,jj) * avtb(jk) ) * tmask(ji,jj,jk)524 p_avt(ji,jj,jk) = MAX( apdlr(ji,jj,jk) * p_avt(ji,jj,jk), avtb_2d(ji,jj) * avtb(jk) ) * wmask(ji,jj,jk) 530 525 END_3D 531 526 ENDIF -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/nemogcm.F90
r12482 r12724 60 60 USE diacfl ! CFL diagnostics (dia_cfl_init routine) 61 61 USE diamlr ! IOM context management for multiple-linear-regression analysis 62 #if defined key_qco 62 63 USE steplf ! NEMO time-stepping (stplf routine) 64 #else 65 USE step ! NEMO time-stepping (stp routine) 66 #endif 63 67 USE isfstp ! ice shelf (isf_stp_init routine) 64 68 USE icbini ! handle bergs, initialisation … … 84 88 #endif 85 89 ! 90 USE in_out_manager ! I/O manager 86 91 USE lib_mpp ! distributed memory computing 87 92 USE mppini ! shared/distributed memory setting (mpp_init routine) … … 160 165 ! !== time stepping ==! 161 166 ! !-----------------------! 167 ! 168 ! !== set the model time-step ==! 169 ! 162 170 istp = nit000 163 171 ! … … 178 186 ! 179 187 DO WHILE( istp <= nitend .AND. nstop == 0 ) 188 #if defined key_qco 180 189 CALL stplf 190 #else 191 CALL stp 192 #endif 181 193 istp = istp + 1 182 194 END DO … … 202 214 ENDIF 203 215 216 #if defined key_qco 204 217 CALL stplf ( istp ) 218 #else 219 CALL stp ( istp ) 220 #endif 205 221 istp = istp + 1 206 222 … … 314 330 IF( lwm ) CALL ctl_opn( numond, 'output.namelist.dyn', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, -1, .FALSE. ) 315 331 ! open /dev/null file to be able to supress output write easily 332 IF( Agrif_Root() ) THEN 316 333 CALL ctl_opn( numnul, '/dev/null', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, -1, .FALSE. ) 317 ! 334 #ifdef key_agrif 335 ELSE 336 numnul = Agrif_Parent(numnul) 337 #endif 338 ENDIF 318 339 ! !--------------------! 319 340 ! ! Open listing units ! -> need sn_cfctl from namctl to define lwp … … 479 500 480 501 ! ! Icebergs 481 CALL icb_init( r dt, nit000) ! initialise icebergs instance502 CALL icb_init( rn_Dt, nit000) ! initialise icebergs instance 482 503 483 504 ! ice shelf -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/oce.F90
r12377 r12724 28 28 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: rn2b , rn2 !: brunt-vaisala frequency**2 [s-2] 29 29 ! 30 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: rhd !: in situ density anomalie rhd=(rho-r au0)/rau0 [no units]30 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: rhd !: in situ density anomalie rhd=(rho-rho0)/rho0 [no units] 31 31 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: rhop !: potential volumic mass [kg/m3] 32 32 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: Cu_adv !: vertical Courant number (adaptive-implicit) -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/step.F90
r12680 r12724 91 91 !! --------------------------------------------------------------------- 92 92 #if defined key_agrif 93 IF( nstop > 0 ) return ! avoid to go further if an error was detected during previous time step 93 94 kstp = nit000 + Agrif_Nb_Step() 94 95 Kbb_a = Nbb; Kmm_a = Nnn; Krhs_a = Nrhs ! agrif_oce module copies of time level indices … … 104 105 ! 105 106 IF( ln_timing ) CALL timing_start('stp') 107 ! 108 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 109 ! model timestep 110 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 111 ! 112 IF( l_1st_euler ) THEN 113 ! start or restart with Euler 1st time-step 114 rDt = rn_Dt 115 r1_Dt = 1._wp / rDt 116 ENDIF 106 117 ! 107 118 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> … … 303 314 #if defined key_agrif 304 315 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 305 ! AGRIF 316 ! AGRIF recursive integration 306 317 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 307 318 Kbb_a = Nbb; Kmm_a = Nnn; Krhs_a = Nrhs ! agrif_oce module copies of time level indices 308 319 CALL Agrif_Integrate_ChildGrids( stp ) ! allows to finish all the Child Grids before updating 309 310 IF( Agrif_NbStepint() == 0 ) THEN 311 CALL Agrif_update_all( ) ! Update all components 312 ENDIF 320 #endif 321 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 322 ! Control 323 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 324 CALL stp_ctl ( kstp, Nbb, Nnn, indic ) 325 #if defined key_agrif 326 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 327 ! AGRIF update 328 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 329 IF( Agrif_NbStepint() == 0 .AND. nstop == 0 ) THEN 330 CALL Agrif_update_all( ) ! Update all components 331 ENDIF 313 332 #endif 314 333 IF( ln_diaobs ) CALL dia_obs ( kstp, Nnn ) ! obs-minus-model (assimilation) diagnostics (call after dynamics update) 315 334 316 335 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 317 ! Control 318 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 319 CALL stp_ctl ( kstp, Nbb, Nnn, indic ) 320 336 ! File manipulation at the end of the first time step 337 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 321 338 IF( kstp == nit000 ) THEN ! 1st time step only 322 339 CALL iom_close( numror ) ! close input ocean restart file … … 332 349 ! 333 350 #if defined key_iomput 351 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 352 ! Finalize contextes if end of simulation or error detected 353 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 334 354 IF( kstp == nitend .OR. indic < 0 ) THEN 335 355 CALL iom_context_finalize( cxios_context ) ! needed for XIOS+AGRIF 336 IF(lrxios) CALL iom_context_finalize( crxios_context)356 IF( lrxios ) CALL iom_context_finalize( crxios_context ) 337 357 IF( ln_crs ) CALL iom_context_finalize( trim(cxios_context)//"_crs" ) ! 338 358 ENDIF 339 359 #endif 360 ! 361 IF( l_1st_euler ) THEN ! recover Leap-frog timestep 362 rDt = 2._wp * rn_Dt 363 r1_Dt = 1._wp / rDt 364 l_1st_euler = .FALSE. 365 ENDIF 340 366 ! 341 367 IF( ln_timing ) CALL timing_stop('stp') -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/stepLF.F90
r12680 r12724 107 107 ! 108 108 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 109 ! model timestep 110 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 111 ! 112 IF( l_1st_euler ) THEN 113 ! start or restart with Euler 1st time-step 114 rDt = rn_Dt 115 r1_Dt = 1._wp / rDt 116 ENDIF 117 ! 118 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 119 109 120 ! update I/O and calendar 110 121 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< … … 356 367 IF( kstp == nitend .OR. indic < 0 ) THEN 357 368 CALL iom_context_finalize( cxios_context ) ! needed for XIOS+AGRIF 358 369 IF(lrxios) CALL iom_context_finalize( crxios_context ) 359 370 IF( ln_crs ) CALL iom_context_finalize( trim(cxios_context)//"_crs" ) ! 360 371 ENDIF 361 372 #endif 373 ! 374 IF( l_1st_euler ) THEN ! recover Leap-frog timestep 375 rDt = 2._wp * rn_Dt 376 r1_Dt = 1._wp / rDt 377 l_1st_euler = .FALSE. 378 ENDIF 362 379 ! 363 380 IF( ln_timing ) CALL timing_stop('stplf') -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/timing.F90
r11536 r12724 390 390 WRITE(numtime,'(A28,F11.6,A2, F4.1,A3,A25,I8)') 'Waiting global time : ',timing_glob(4*ji-1) & 391 391 & , ' (', zperc,' %)', ' on MPI rank : ', ji 392 zsypd = rn_ rdt * REAL(nitend-nit000-1, wp) / (timing_glob(4*ji) * 365.)392 zsypd = rn_Dt * REAL(nitend-nit000-1, wp) / (timing_glob(4*ji) * 365.) 393 393 WRITE(numtime,'(A28,F11.6,A7,F10.3,A2,A15,I8)') 'Total time : ',timing_glob(4*ji ) & 394 394 & , ' (SYPD: ', zsypd, ')', ' on MPI rank : ', ji
Note: See TracChangeset
for help on using the changeset viewer.