Skip to content
Snippets Groups Projects
Commit 1efda84e authored by Guillaume Samson's avatar Guillaume Samson :snowman2:
Browse files

Merge branch '157-abl-pressure-gradient-improvement' into 'main'

Resolve "ABL pressure gradient improvement"

Closes #157

See merge request nemo/nemo!229
parents a36dabe0 338721af
No related branches found
No related tags found
No related merge requests found
......@@ -323,6 +323,7 @@
ln_rstart_abl = .false.
ln_hpgls_frc = .false.
ln_pga_abl = .false. ! ABL pressure gradient anomaly forcing
ln_geos_winds = .false.
ln_smth_pblh = .false.
nn_dyn_restore = 0 ! restoring option for dynamical ABL variables: = 0 no restoring
......
......@@ -105,6 +105,8 @@ CONTAINS
REAL(wp), DIMENSION(A2D(0)) :: zwnd_i, zwnd_j
REAL(wp), DIMENSION(A2D(0)) :: zsspt, ztabs, zpre
REAL(wp), DIMENSION(A1Di(0),2:jpka) :: zCF
REAL(wp), DIMENSION(A2D(1),1:jpka) :: zpdif
REAL(wp), DIMENSION(A2D(0),1:jpka) :: zpabl, zpdta, zpgau, zpgav
REAL(wp), DIMENSION(A1Di(0),1:jpka) :: z_elem_a, z_elem_b, z_elem_c
!
INTEGER :: ji, jj, jk, jtra, jbak ! dummy loop indices
......@@ -140,10 +142,6 @@ CONTAINS
!zrough(:,:) = ght_abl(2) * EXP( - vkarmn / SQRT( MAX( Cdn_oce(:,:), 1.e-4 ) ) ) !<-- recover the value of z0 from Cdn_oce
zrough(:,:) = z0_from_Cd( ght_abl(2), pCd_du(:,:) / MAX( pwndm(:,:), 0.5_wp ) ) ! #LB: z0_from_Cd is define in sbc_phy.F90...
! sea surface potential temperature [K]
!zsspt(:,:) = theta_exner( psst(A2D(0))+rt0, pslp_dta(:,:) )
! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
! ! 1 *** Advance TKE to time n+1 and compute Avm_abl, Avt_abl, PBLh
! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
......@@ -282,11 +280,39 @@ CONTAINS
END IF
!
IF( ln_hpgls_frc ) THEN
IF( ln_pga_abl ) THEN
DO_3D( 0, 0, 0, 0, 0, jpka)
zpabl(ji,jj,jk) = pres_temp( tq_abl(ji,jj,jk,nt_n,jp_qa), pslp_dta(ji,jj), ght_abl(jk), ptpot=tq_abl(ji,jj,jk,nt_n,jp_ta) )
zpdta(ji,jj,jk) = pres_temp( pq_dta(ji,jj,jk) , pslp_dta(ji,jj), ght_abl(jk), ptpot=pt_dta(ji,jj,jk) )
zpdif(ji,jj,jk) = zpabl(ji,jj,jk) - zpdta(ji,jj,jk)
END_3D
zpdif(:,:,:) = MAX( MIN( zpdif(:,:,:), 10._wp ), -10._wp ) ! limiter due to ice/oce inconsistencies between nemo/si3 & atm frc
DO jk = 1, jpka
CALL smooth_pblh( zpdif(:,:,:), msk_abl(:,:) )
END DO
CALL lbc_lnk( 'ablmod', zpdif(:,:,:), 'T', 1.0_wp)
DO_3D( 0, 0, 0, 0, 1, jpka)
zpgau(ji,jj,jk) = ( 1._wp - 0.5_wp * umask(ji,jj,1) * umask(ji-1,jj,1) ) * &
& ( (zpdif(ji+1,jj,jk) - zpdif(ji ,jj,jk)) * r1_e1u(ji ,jj) * umask(ji ,jj,1) + &
& (zpdif(ji ,jj,jk) - zpdif(ji-1,jj,jk)) * r1_e1u(ji-1,jj) * umask(ji-1,jj,1) )
zpgav(ji,jj,jk) = ( 1._wp - 0.5_wp * vmask(ji,jj,1) * vmask(ji,jj-1,1) ) * &
& ( (zpdif(ji,jj+1,jk) - zpdif(ji,jj ,jk)) * r1_e2v(ji,jj ) * vmask(ji,jj ,1) + &
& (zpdif(ji,jj ,jk) - zpdif(ji,jj-1,jk)) * r1_e2v(ji,jj-1) * vmask(ji,jj-1,1) )
END_3D
ELSE
zpgau(:,:,:) = 0._wp
zpgav(:,:,:) = 0._wp
ENDIF
DO_1Dj( 0, 0 ) ! outer loop
DO jk = 1, jpka
DO_1Di( 0, 0 )
u_abl( ji, jj, jk, nt_a ) = u_abl( ji, jj, jk, nt_a ) - rDt_abl * e3t_abl(jk) * pgu_dta(ji,jj,jk)
v_abl( ji, jj, jk, nt_a ) = v_abl( ji, jj, jk, nt_a ) - rDt_abl * e3t_abl(jk) * pgv_dta(ji,jj,jk)
u_abl( ji, jj, jk, nt_a ) = u_abl( ji, jj, jk, nt_a ) - rDt_abl * e3t_abl(jk) * ( pgu_dta(ji,jj,jk) + zpgau(ji,jj,jk) )
v_abl( ji, jj, jk, nt_a ) = v_abl( ji, jj, jk, nt_a ) - rDt_abl * e3t_abl(jk) * ( pgv_dta(ji,jj,jk) + zpgav(ji,jj,jk) )
END_1D
ENDDO
END_1D
......@@ -788,8 +814,9 @@ CONTAINS
END DO
!!FL should not be needed because of Patankar procedure
tke_abl(A2D(0),1:jpka,nt_a) = MAX( tke_abl(A2D(0),1:jpka,nt_a), tke_min )
DO_1Di( 0, 0 )
tke_abl(ji,jj,1:jpka,nt_a) = MAX( tke_abl(ji,jj,1:jpka,nt_a), tke_min )
END_1D
!!
!! Diagnose PBL height
!! ----------------------------------------------------------
......
......@@ -26,6 +26,7 @@ MODULE par_abl
INTEGER , PUBLIC :: nn_dyn_restore !: restoring option for dynamical ABL variables
LOGICAL , PUBLIC :: ln_geos_winds !: large-scale restoring of ABL winds toward geostrophic winds
LOGICAL , PUBLIC :: ln_hpgls_frc !: forcing of ABL winds by large-scale pressure gradient
LOGICAL , PUBLIC :: ln_pga_abl !: ABL pressure gradient anomaly forcing
LOGICAL , PUBLIC :: ln_smth_pblh !: smoothing of atmospheric PBL height
!LOGICAL , PUBLIC :: ln_topbc_neumann = .FALSE. !: idealised testcases only
......
......@@ -73,7 +73,7 @@ CONTAINS
& ln_hpgls_frc, ln_geos_winds, nn_dyn_restore, &
& rn_ldyn_min , rn_ldyn_max, rn_ltra_min, rn_ltra_max, &
& nn_amxl, rn_Cm, rn_Ct, rn_Ce, rn_Ceps, rn_Rod, rn_Ric, &
& rn_vfac, ln_smth_pblh
& rn_vfac, ln_smth_pblh, ln_pga_abl
!!---------------------------------------------------------------------
! Namelist namsbc_abl in reference namelist : ABL parameters
......@@ -107,6 +107,9 @@ CONTAINS
ln_geos_winds = .FALSE.
WRITE(numout,*) ' ABL -- geostrophic guide disabled (not compatible with ln_hpgls_frc = .T.)'
END IF
IF( ln_pga_abl ) THEN
WRITE(numout,*) ' ABL -- pressure gradient anomaly forcing'
END IF
ELSE IF( ln_geos_winds ) THEN
WRITE(numout,*) ' ABL -- winds forced by geostrophic winds'
ELSE
......@@ -272,11 +275,6 @@ CONTAINS
nt_n = 1; nt_a = 2
! initialize ABL from data or restart
u_abl (:,:,:,nt_a ) = 0._wp
v_abl (:,:,:,nt_a ) = 0._wp
tq_abl (:,:,:,nt_a,: ) = 0._wp
tke_abl(:,:,:,nt_a ) = 0._wp
IF( ln_rstart_abl ) THEN
CALL abl_rst_read
ELSE
......@@ -320,11 +318,9 @@ CONTAINS
!!---------------------------------------------------------------------
INTEGER , INTENT(in) :: kt ! ocean time step
!!
!REAL(wp), DIMENSION(jpi,jpj) :: zssq, zcd_du, zsen, zlat, zevp
REAL(wp), DIMENSION(A2D(0)) :: zssq, zcd_du, zsen, zlat, zevp
REAL(wp), DIMENSION(A2D(0)) :: zssq, zcd_du, zsen, zlat, zevp
#if defined key_si3
!REAL(wp), DIMENSION(jpi,jpj) :: zssqi, zcd_dui, zseni, zevpi
REAL(wp), DIMENSION(A2D(0)) :: zssqi, zcd_dui, zseni, zevpi
REAL(wp), DIMENSION(A2D(0)) :: zssqi, zcd_dui, zseni, zevpi
#endif
INTEGER :: jbak, jbak_dta, ji, jj
!!---------------------------------------------------------------------
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment