Skip to content

Commit

Permalink
add salinity effect in sfclay and sfclayrev (#1963)
Browse files Browse the repository at this point in the history
TYPE: enhancement

KEYWORDS: salinity effect, saturation vapor pressure, ocean

SOURCE: internal

DESCRIPTION OF CHANGES:
Problem:
The salinity effect of ocean is not considered when computing saturation vapor pressure.

Solution:
Add the effect in the MM5 and revised MM5 surface layer schemes. The 0.98 factor (set in the code as SALINITY_FACTOR) is an approximation for salinity of 34 part per thousands, and applied for saturation specific humidity. Here the approximation is applied to saturation mixing ratio. The lakemask field is used to exclude this effect from inland lakes.

LIST OF MODIFIED FILES:
M phys/module_sf_sfclay.F
M phys/module_sf_sfclayrev.F
M phys/module_surface_driver.F

TESTS CONDUCTED:
- Tested in many tropical cyclone cases.
- The Jenkins tests are all passing.

RELEASE NOTE: Add salinity effect in MM5 and revised MM5 surface layer schemes. The effect is lower the saturation vapor pressure over ocean by about 2%.
  • Loading branch information
weiwangncar authored Jan 24, 2024
1 parent 3a50466 commit 0c4ed5f
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 18 deletions.
13 changes: 9 additions & 4 deletions phys/module_sf_sfclay.F
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ SUBROUTINE SFCLAY(U3D,V3D,T3D,QV3D,P3D,dz8w, &
GZ1OZ0,WSPD,BR,ISFFLX,DX, &
SVP1,SVP2,SVP3,SVPT0,EP1,EP2, &
KARMAN,EOMEG,STBOLT, &
P1000mb, &
P1000mb,LAKEMASK, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte, &
Expand Down Expand Up @@ -136,6 +136,7 @@ SUBROUTINE SFCLAY(U3D,V3D,T3D,QV3D,P3D,dz8w, &
INTENT(IN ) :: MAVAIL, &
PBLH, &
XLAND, &
LAKEMASK, &
TSK
REAL, DIMENSION( ims:ime, jms:jme ) , &
Expand Down Expand Up @@ -242,7 +243,7 @@ SUBROUTINE SFCLAY(U3D,V3D,T3D,QV3D,P3D,dz8w, &
QSFC(ims,j),LH(ims,j), &
GZ1OZ0(ims,j),WSPD(ims,j),BR(ims,j),ISFFLX,DX2D, &
SVP1,SVP2,SVP3,SVPT0,EP1,EP2,KARMAN,EOMEG,STBOLT, &
P1000mb, &
P1000mb,LAKEMASK(ims,j), &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte &
Expand All @@ -267,7 +268,7 @@ SUBROUTINE SFCLAY1D(J,UX,VX,T1D,QV1D,P1D,dz8w1d, &
QSFC,LH,GZ1OZ0,WSPD,BR,ISFFLX,DX, &
SVP1,SVP2,SVP3,SVPT0,EP1,EP2, &
KARMAN,EOMEG,STBOLT, &
P1000mb, &
P1000mb,LAKEMASK, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte, &
Expand All @@ -278,6 +279,7 @@ SUBROUTINE SFCLAY1D(J,UX,VX,T1D,QV1D,P1D,dz8w1d, &
!-------------------------------------------------------------------
REAL, PARAMETER :: XKA=2.4E-5
REAL, PARAMETER :: PRT=1.
REAL, PARAMETER :: SALINITY_FACTOR=0.98
INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
Expand All @@ -294,6 +296,7 @@ SUBROUTINE SFCLAY1D(J,UX,VX,T1D,QV1D,P1D,dz8w1d, &
INTENT(IN ) :: MAVAIL, &
PBLH, &
XLAND, &
LAKEMASK, &
TSK
!
REAL, DIMENSION( ims:ime ) , &
Expand Down Expand Up @@ -452,7 +455,9 @@ SUBROUTINE SFCLAY1D(J,UX,VX,T1D,QV1D,P1D,dz8w1d, &
DO 60 I=its,ite
E1=SVP1*EXP(SVP2*(TGDSA(I)-SVPT0)/(TGDSA(I)-SVP3))
! for land points QSFC can come from previous time step
if(xland(i).gt.1.5.or.qsfc(i).le.0.0)QSFC(I)=EP2*E1/(PSFC(I)-E1)
! the saturation vapor pressure for salty water is on average 2% lower
if(xland(i).gt.1.5 .and. lakemask(i).eq.0.) E1=E1*SALINITY_FACTOR
if(xland(i).gt.1.5.or.qsfc(i).le.0.0)QSFC(I)=EP2*E1/(PSFC(I)-E1)
! QGH CHANGED TO USE LOWEST-LEVEL AIR TEMP CONSISTENT WITH MYJSFC CHANGE
! Q2SAT = QGH IN LSM
E1=SVP1*EXP(SVP2*(T1D(I)-SVPT0)/(T1D(I)-SVP3))
Expand Down
13 changes: 9 additions & 4 deletions phys/module_sf_sfclayrev.F
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ SUBROUTINE SFCLAYREV(U3D,V3D,T3D,QV3D,P3D,dz8w, &
GZ1OZ0,WSPD,BR,ISFFLX,DX, &
SVP1,SVP2,SVP3,SVPT0,EP1,EP2, &
KARMAN,EOMEG,STBOLT, &
P1000mb, &
P1000mb,LAKEMASK, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte, &
Expand Down Expand Up @@ -137,6 +137,7 @@ SUBROUTINE SFCLAYREV(U3D,V3D,T3D,QV3D,P3D,dz8w, &
INTENT(IN ) :: MAVAIL, &
PBLH, &
XLAND, &
LAKEMASK, &
TSK
REAL, DIMENSION( ims:ime, jms:jme ) , &
INTENT(OUT ) :: U10, &
Expand Down Expand Up @@ -235,7 +236,7 @@ SUBROUTINE SFCLAYREV(U3D,V3D,T3D,QV3D,P3D,dz8w, &
QSFC(ims,j),LH(ims,j), &
GZ1OZ0(ims,j),WSPD(ims,j),BR(ims,j),ISFFLX,DX, &
SVP1,SVP2,SVP3,SVPT0,EP1,EP2,KARMAN,EOMEG,STBOLT, &
P1000mb, &
P1000mb,LAKEMASK(ims,j), &
shalwater_z0,water_depth(ims,j),shalwater_depth, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
Expand All @@ -261,7 +262,7 @@ SUBROUTINE SFCLAYREV1D(J,UX,VX,T1D,QV1D,P1D,dz8w1d, &
QSFC,LH,GZ1OZ0,WSPD,BR,ISFFLX,DX, &
SVP1,SVP2,SVP3,SVPT0,EP1,EP2, &
KARMAN,EOMEG,STBOLT, &
P1000mb, &
P1000mb,LAKEMASK, &
shalwater_z0,water_depth,shalwater_depth, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
Expand All @@ -273,6 +274,7 @@ SUBROUTINE SFCLAYREV1D(J,UX,VX,T1D,QV1D,P1D,dz8w1d, &
!-------------------------------------------------------------------
REAL, PARAMETER :: XKA=2.4E-5
REAL, PARAMETER :: PRT=1.
REAL, PARAMETER :: SALINITY_FACTOR=0.98
INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
Expand All @@ -289,6 +291,7 @@ SUBROUTINE SFCLAYREV1D(J,UX,VX,T1D,QV1D,P1D,dz8w1d, &
INTENT(IN ) :: MAVAIL, &
PBLH, &
XLAND, &
LAKEMASK, &
TSK
!
REAL, DIMENSION( ims:ime ) , &
Expand Down Expand Up @@ -459,7 +462,9 @@ SUBROUTINE SFCLAYREV1D(J,UX,VX,T1D,QV1D,P1D,dz8w1d, &
DO 60 I=its,ite
E1=SVP1*EXP(SVP2*(TGDSA(I)-SVPT0)/(TGDSA(I)-SVP3))
! for land points QSFC can come from previous time step
if(xland(i).gt.1.5.or.qsfc(i).le.0.0)QSFC(I)=EP2*E1/(PSFC(I)-E1)
! the saturation vapor pressure for salty water is on average 2% lower
if(xland(i).gt.1.5 .and. lakemask(i).eq.0.) E1=E1*SALINITY_FACTOR
if(xland(i).gt.1.5.or.qsfc(i).le.0.0)QSFC(I)=EP2*E1/(PSFC(I)-E1)
! QGH CHANGED TO USE LOWEST-LEVEL AIR TEMP CONSISTENT WITH MYJSFC CHANGE
! Q2SAT = QGH IN LSM
E1=SVP1*EXP(SVP2*(T1D(I)-SVPT0)/(T1D(I)-SVP3))
Expand Down
22 changes: 12 additions & 10 deletions phys/module_surface_driver.F
Original file line number Diff line number Diff line change
Expand Up @@ -2039,7 +2039,7 @@ SUBROUTINE surface_driver( &
u10,v10,th2,t2,q2, &
gz1oz0,wspd,br,isfflx,dx2d, &
svp1,svp2,svp3,svpt0,ep_1,ep_2,karman,eomeg,stbolt, &
P1000mb, &
P1000mb,lakemask, &
XICE,SST,TSK_SEA, &
CHS2_SEA,CHS_SEA,CPM_SEA,CQS2_SEA,FLHC_SEA,FLQC_SEA, &
HFX_SEA,LH_SEA,QFX_SEA,QGH_SEA,QSFC_SEA,ZNT_SEA, &
Expand All @@ -2057,7 +2057,7 @@ SUBROUTINE surface_driver( &
u10,v10,th2,t2,q2, &
gz1oz0,wspd,br,isfflx,dx2d, &
svp1,svp2,svp3,svpt0,ep_1,ep_2,karman,eomeg,stbolt, &
P1000mb, &
P1000mb,lakemask, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte, &
Expand Down Expand Up @@ -2092,7 +2092,7 @@ SUBROUTINE surface_driver( &
u10,v10,th2,t2,q2, &
gz1oz0,wspd,br,isfflx,dx, &
svp1,svp2,svp3,svpt0,ep_1,ep_2,karman,eomeg,stbolt, &
P1000mb, &
P1000mb,lakemask, &
XICE,SST,TSK_SEA, &
CHS2_SEA,CHS_SEA,CPM_SEA,CQS2_SEA,FLHC_SEA,FLQC_SEA, &
HFX_SEA,LH_SEA,QFX_SEA,QGH_SEA,QSFC_SEA,ZNT_SEA, &
Expand All @@ -2111,7 +2111,7 @@ SUBROUTINE surface_driver( &
u10,v10,th2,t2,q2, &
gz1oz0,wspd,br,isfflx,dx, &
svp1,svp2,svp3,svpt0,ep_1,ep_2,karman,eomeg,stbolt, &
P1000mb, &
P1000mb,lakemask, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte, &
Expand Down Expand Up @@ -5799,7 +5799,7 @@ SUBROUTINE sfclayrev_seaice_wrapper(U3D,V3D,T3D,QV3D,P3D,dz8w, &
GZ1OZ0,WSPD,BR,ISFFLX,DX, &
SVP1,SVP2,SVP3,SVPT0,EP1,EP2, &
KARMAN,EOMEG,STBOLT, &
P1000, &
P1000,LAKEMASK, &
XICE,SST,TSK_SEA, &
CHS2_SEA,CHS_SEA,CPM_SEA,CQS2_SEA,FLHC_SEA,FLQC_SEA, &
HFX_SEA,LH_SEA,QFX_SEA,QGH_SEA,QSFC_SEA,ZNT_SEA, &
Expand Down Expand Up @@ -5835,6 +5835,7 @@ SUBROUTINE sfclayrev_seaice_wrapper(U3D,V3D,T3D,QV3D,P3D,dz8w, &
INTENT(IN ) :: MAVAIL, &
PBLH, &
XLAND, &
LAKEMASK, &
TSK
REAL, DIMENSION( ims:ime, jms:jme ) , &
INTENT(OUT ) :: U10, &
Expand Down Expand Up @@ -6061,7 +6062,7 @@ SUBROUTINE sfclayrev_seaice_wrapper(U3D,V3D,T3D,QV3D,P3D,dz8w, &
GZ1OZ0,WSPD,BR,ISFFLX,DX, &
SVP1,SVP2,SVP3,SVPT0,EP1,EP2, &
KARMAN,EOMEG,STBOLT, &
P1000, &
P1000,lakemask, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte, &
Expand Down Expand Up @@ -6155,7 +6156,7 @@ SUBROUTINE sfclayrev_seaice_wrapper(U3D,V3D,T3D,QV3D,P3D,dz8w, &
ISFFLX,DX, &
SVP1,SVP2,SVP3,SVPT0,EP1,EP2, &
KARMAN,EOMEG,STBOLT, &
P1000, &
P1000,lakemask, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte, & ! 0
Expand Down Expand Up @@ -6230,7 +6231,7 @@ SUBROUTINE sfclay_seaice_wrapper(U3D,V3D,T3D,QV3D,P3D,dz8w, &
GZ1OZ0,WSPD,BR,ISFFLX,DX, &
SVP1,SVP2,SVP3,SVPT0,EP1,EP2, &
KARMAN,EOMEG,STBOLT, &
P1000, &
P1000,lakemask, &
XICE,SST,TSK_SEA, &
CHS2_SEA,CHS_SEA,CPM_SEA,CQS2_SEA,FLHC_SEA,FLQC_SEA, &
HFX_SEA,LH_SEA,QFX_SEA,QGH_SEA,QSFC_SEA,ZNT_SEA, &
Expand Down Expand Up @@ -6265,6 +6266,7 @@ SUBROUTINE sfclay_seaice_wrapper(U3D,V3D,T3D,QV3D,P3D,dz8w, &
INTENT(IN ) :: MAVAIL, &
PBLH, &
XLAND, &
LAKEMASK, &
TSK
REAL, DIMENSION( ims:ime, jms:jme ) , &
INTENT(OUT ) :: U10, &
Expand Down Expand Up @@ -6491,7 +6493,7 @@ SUBROUTINE sfclay_seaice_wrapper(U3D,V3D,T3D,QV3D,P3D,dz8w, &
GZ1OZ0,WSPD,BR,ISFFLX,DX, &
SVP1,SVP2,SVP3,SVPT0,EP1,EP2, &
KARMAN,EOMEG,STBOLT, &
P1000, &
P1000,lakemask, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte, &
Expand Down Expand Up @@ -6585,7 +6587,7 @@ SUBROUTINE sfclay_seaice_wrapper(U3D,V3D,T3D,QV3D,P3D,dz8w, &
ISFFLX,DX, &
SVP1,SVP2,SVP3,SVPT0,EP1,EP2, &
KARMAN,EOMEG,STBOLT, &
P1000, &
P1000,lakemask, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte, & ! 0
Expand Down

0 comments on commit 0c4ed5f

Please sign in to comment.