Skip to content

Commit 8db821c

Browse files
binli2337BinLiu-NOAAwramstrombensonrAndrewHazelton
authored
Consider surface ocean current in air-sea flux calculation (#755)
* Moving nest performance optimization stage 2. * update atmos_model and FV3GFS_io read performance when io_layout=1,1 and allow one to override data integrity checks in FMS restart logic * Add the following HAFS ccpp physics suites (@ChunxiZhang-NOAA and @BinLiu-NOAA): suite_FV3_HAFS_v0_thompson.xml suite_FV3_HAFS_v0_thompson_nonsst.xml suite_FV3_HAFS_v0_thompson_noahmp.xml suite_FV3_HAFS_v0_thompson_noahmp_nonsst.xml * Update submodule upp, which has the fix for regional latlon grid crossing the prime meridian. * Only call atmosphere_fill_nest_cpl at the cap driver time steps (coupling time steps). This is to reduce the overhead introduced by downscaling the coupling variables from FV3ATM parent to nest. * Removed reference to unused variable parent_x. * Update to point submodule ccpp/physics to the feature/hafsv0.3_final branch of the hafs-community fork. * FV3-related typedefs changes for the Hurricane PBL options * Update submodule ccpp/physics, which added the tc_pbl option in the GFS sa-TKE EDMF PBL scheme for HAFS/hurricane modeling. * Update to point the support/HAFS branch for upp, ccpp-physics and atmos_cubed_sphere. * Adding upoff as a namelist parameter * Update submodule atmos_cubed_sphere, which has updated the time string in internal tracker output (fort.602, phtcf file). * fix initialization issue for moving nest grid in debug mode (#622) * Update submodule atmos_cubed_sphere to point the production/hafs.v1 branch. * Update submodule upp, which cherry-picked the wind GUST fix from the develop branch. * Create ESMF field attributes using the same kind as field data values (#618) * Use 32bit value for 'missing_value' and '_FillValue' attributes * Update ccpp/suites_not_used/suite_FV3_HAFS_v1* files, needed for the latest sync. * Update submodule UPP to point to the feature/hafsv2_baseline branch. * Add a namelist to include ocean current in the computation of air-sea fluxes. * Change the variable name for zonal ocean current from ssu to usfco. * Change the variable name for meridional ocean current from ssv to vsfco. * Update HAFS thompson ccpp suites and move suite_FV3_HAFS_v1_thompson.xml and suite_FV3_HAFS_v1_thompson_nonsst.xml under ccpp/suites since they are used by operational HAFS configurations. * Update usfco and vsfco standard and long names in GFS_typedefs.meta. * Update standard name for icplocn2atm in ccpp/data/GFS_typedefs.meta. --------- Co-authored-by: Bin.Liu <Bin.Liu@noaa.gov> Co-authored-by: William Ramstrom <William.Ramstrom@noaa.gov> Co-authored-by: Rusty.Benson <rusty.benson@noaa.gov> Co-authored-by: AndrewHazelton <andrew.hazelton@noaa.gov> Co-authored-by: Biju Thomas <biju.thomas@noaa.gov>
1 parent ef04de2 commit 8db821c

13 files changed

+167
-17
lines changed

atmos_model.F90

+52
Original file line numberDiff line numberDiff line change
@@ -1977,6 +1977,58 @@ subroutine assign_importdata(jdat, rc)
19771977
endif
19781978
endif
19791979

1980+
! get zonal ocean current:
1981+
!--------------------------------------------------------------------------
1982+
fldname = 'ocn_current_zonal'
1983+
if (trim(impfield_name) == trim(fldname)) then
1984+
findex = queryImportFields(fldname)
1985+
if (importFieldsValid(findex) .and. GFS_control%cplocn2atm) then
1986+
!$omp parallel do default(shared) private(i,j,nb,ix)
1987+
do j=jsc,jec
1988+
do i=isc,iec
1989+
nb = Atm_block%blkno(i,j)
1990+
ix = Atm_block%ixp(i,j)
1991+
GFS_Data(nb)%Sfcprop%usfco(ix) = zero
1992+
if (GFS_Data(nb)%Sfcprop%oceanfrac(ix) > zero) then ! ocean points
1993+
if(mergeflg(i,j)) then
1994+
GFS_Data(nb)%Sfcprop%usfco(ix) = zero
1995+
datar8(i,j) = zero
1996+
else
1997+
GFS_Data(nb)%Sfcprop%usfco(ix) = datar8(i,j)
1998+
endif
1999+
endif
2000+
enddo
2001+
enddo
2002+
if (mpp_pe() == mpp_root_pe() .and. debug) print *,'get usfco from mediator'
2003+
endif
2004+
endif
2005+
2006+
! get meridional ocean current:
2007+
!--------------------------------------------------------------------------
2008+
fldname = 'ocn_current_merid'
2009+
if (trim(impfield_name) == trim(fldname)) then
2010+
findex = queryImportFields(fldname)
2011+
if (importFieldsValid(findex) .and. GFS_control%cplocn2atm) then
2012+
!$omp parallel do default(shared) private(i,j,nb,ix)
2013+
do j=jsc,jec
2014+
do i=isc,iec
2015+
nb = Atm_block%blkno(i,j)
2016+
ix = Atm_block%ixp(i,j)
2017+
GFS_Data(nb)%Sfcprop%vsfco(ix) = zero
2018+
if (GFS_Data(nb)%Sfcprop%oceanfrac(ix) > zero) then ! ocean points
2019+
if(mergeflg(i,j)) then
2020+
GFS_Data(nb)%Sfcprop%vsfco(ix) = zero
2021+
datar8(i,j) = zero
2022+
else
2023+
GFS_Data(nb)%Sfcprop%vsfco(ix) = datar8(i,j)
2024+
endif
2025+
endif
2026+
enddo
2027+
enddo
2028+
if (mpp_pe() == mpp_root_pe() .and. debug) print *,'get vsfco from mediator'
2029+
endif
2030+
endif
2031+
19802032
! get sea ice fraction: fice or sea ice concentration from the mediator
19812033
!-----------------------------------------------------------------------
19822034
fldname = 'ice_fraction'

ccpp/data/GFS_typedefs.F90

+16-1
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,8 @@ module GFS_typedefs
236236
real (kind=kind_phys), pointer :: soiltype_frac(:,:) => null() !< fractions [0:1] of soil categories
237237
!< [tsea in gbphys.f]
238238
real (kind=kind_phys), pointer :: tsfco (:) => null() !< sst in K
239+
real (kind=kind_phys), pointer :: usfco (:) => null() !< surface zonal current in m s-1
240+
real (kind=kind_phys), pointer :: vsfco (:) => null() !< surface meridional current in m s-1
239241
real (kind=kind_phys), pointer :: tsfcl (:) => null() !< surface land temperature in K
240242
real (kind=kind_phys), pointer :: tisfc (:) => null() !< surface temperature over ice fraction
241243
real (kind=kind_phys), pointer :: tiice(:,:) => null() !< internal ice temperature
@@ -1315,6 +1317,10 @@ module GFS_typedefs
13151317
!< 0=no change
13161318
!< 6=areodynamical roughness over water with input 10-m wind
13171319
!< 7=slightly decrease Cd for higher wind speed compare to 6
1320+
!--- air_sea_flux scheme
1321+
integer :: icplocn2atm !< air_sea flux options over ocean:
1322+
!< 0=no change
1323+
!< l=including ocean current in the computation of air_sea fluxes
13181324

13191325
!--- potential temperature definition in surface layer physics
13201326
logical :: thsfc_loc !< flag for local vs. standard potential temperature
@@ -2321,6 +2327,8 @@ subroutine sfcprop_create (Sfcprop, IM, Model)
23212327
endif
23222328

23232329
allocate (Sfcprop%tsfc (IM))
2330+
allocate (Sfcprop%usfco (IM))
2331+
allocate (Sfcprop%vsfco (IM))
23242332
allocate (Sfcprop%tsfco (IM))
23252333
allocate (Sfcprop%tsfcl (IM))
23262334
allocate (Sfcprop%tisfc (IM))
@@ -2378,6 +2386,8 @@ subroutine sfcprop_create (Sfcprop, IM, Model)
23782386
endif
23792387

23802388
Sfcprop%tsfc = clear_val
2389+
Sfcprop%usfco = clear_val
2390+
Sfcprop%vsfco = clear_val
23812391
Sfcprop%tsfco = clear_val
23822392
Sfcprop%tsfcl = clear_val
23832393
Sfcprop%tisfc = clear_val
@@ -3815,6 +3825,9 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, &
38153825
!< 6=areodynamical roughness over water with input 10-m wind
38163826
!< 7=slightly decrease Cd for higher wind speed compare to 6
38173827
!< negative when cplwav2atm=.true. - i.e. two way wave coupling
3828+
integer :: icplocn2atm = 0 !< air_sea_flux options over ocean
3829+
!< 0=ocean current is not used in the computation of air_sea fluxes
3830+
!< 1=including ocean current in the computation of air_sea fluxes
38183831

38193832
!--- potential temperature definition in surface layer physics
38203833
logical :: thsfc_loc = .true. !< flag for local vs. standard potential temperature
@@ -4074,7 +4087,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, &
40744087
frac_grid, min_lakeice, min_seaice, min_lake_height, &
40754088
ignore_lake, frac_ice, &
40764089
!--- surface layer
4077-
sfc_z0_type, &
4090+
sfc_z0_type, icplocn2atm, &
40784091
!--- switch beteeen local and standard potential temperature
40794092
thsfc_loc, &
40804093
!--- switches in 2-m diagnostics
@@ -5000,6 +5013,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, &
50005013
!--- surface layer
50015014
Model%sfc_z0_type = sfc_z0_type
50025015
if (Model%cplwav2atm) Model%sfc_z0_type = -1
5016+
Model%icplocn2atm = icplocn2atm
50035017

50045018
!--- potential temperature reference in sfc layer
50055019
Model%thsfc_loc = thsfc_loc
@@ -6824,6 +6838,7 @@ subroutine control_print(Model)
68246838
print *, ' '
68256839
print *, 'surface layer options'
68266840
print *, ' sfc_z0_type : ', Model%sfc_z0_type
6841+
print *, ' icplocn2atm : ', Model%icplocn2atm
68276842
print *, ' '
68286843
print *, 'vertical diffusion coefficients'
68296844
print *, ' xkzm_m : ', Model%xkzm_m

ccpp/data/GFS_typedefs.meta

+20
Original file line numberDiff line numberDiff line change
@@ -805,6 +805,20 @@
805805
dimensions = (horizontal_loop_extent)
806806
type = real
807807
kind = kind_phys
808+
[usfco]
809+
standard_name = x_ocean_current
810+
long_name = zonal current at ocean surface
811+
units = m s-1
812+
dimensions = (horizontal_loop_extent)
813+
type = real
814+
kind = kind_phys
815+
[vsfco]
816+
standard_name = y_ocean_current
817+
long_name = meridional current at ocean surface
818+
units = m s-1
819+
dimensions = (horizontal_loop_extent)
820+
type = real
821+
kind = kind_phys
808822
[tsfcl]
809823
standard_name = surface_skin_temperature_over_land
810824
long_name = surface skin temperature over land
@@ -5855,6 +5869,12 @@
58555869
units = flag
58565870
dimensions = ()
58575871
type = integer
5872+
[icplocn2atm]
5873+
standard_name = control_for_air_sea_flux_computation_over_water
5874+
long_name = air-sea flux option
5875+
units = 1
5876+
dimensions = ()
5877+
type = integer
58585878
[xkzminv]
58595879
standard_name = max_atmosphere_heat_diffusivity_due_to_background
58605880
long_name = maximum background value of heat diffusivity

ccpp/driver/GFS_diagnostics.F90

+22
Original file line numberDiff line numberDiff line change
@@ -3932,6 +3932,28 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop
39323932
ExtDiag(idx)%data(nb)%var2 => Sfcprop(nb)%tsfc(:)
39333933
enddo
39343934

3935+
idx = idx + 1
3936+
ExtDiag(idx)%axes = 2
3937+
ExtDiag(idx)%name = 'usfco'
3938+
ExtDiag(idx)%desc = 'surface zonal current'
3939+
ExtDiag(idx)%unit = 'm/s'
3940+
ExtDiag(idx)%mod_name = 'gfs_sfc'
3941+
allocate (ExtDiag(idx)%data(nblks))
3942+
do nb = 1,nblks
3943+
ExtDiag(idx)%data(nb)%var2 => Sfcprop(nb)%usfco(:)
3944+
enddo
3945+
3946+
idx = idx + 1
3947+
ExtDiag(idx)%axes = 2
3948+
ExtDiag(idx)%name = 'vsfco'
3949+
ExtDiag(idx)%desc = 'surface meridional current'
3950+
ExtDiag(idx)%unit = 'm/s'
3951+
ExtDiag(idx)%mod_name = 'gfs_sfc'
3952+
allocate (ExtDiag(idx)%data(nblks))
3953+
do nb = 1,nblks
3954+
ExtDiag(idx)%data(nb)%var2 => Sfcprop(nb)%vsfco(:)
3955+
enddo
3956+
39353957
if (Model%frac_grid) then
39363958
do num = 1,Model%kice
39373959
write (xtra,'(i1)') num

ccpp/suites_not_used/suite_FV3_HAFS_v1_thompson.xml ccpp/suites/suite_FV3_HAFS_v1_thompson.xml

+1-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
<scheme>rad_sw_pre</scheme>
1919
<scheme>rrtmg_sw</scheme>
2020
<scheme>rrtmg_sw_post</scheme>
21-
<scheme>rrtmg_lw_pre</scheme>
2221
<scheme>rrtmg_lw</scheme>
2322
<scheme>rrtmg_lw_post</scheme>
2423
<scheme>GFS_rrtmg_post</scheme>
@@ -61,7 +60,6 @@
6160
<scheme>unified_ugwp_post</scheme>
6261
<scheme>GFS_GWD_generic_post</scheme>
6362
<scheme>GFS_suite_stateout_update</scheme>
64-
<scheme>ozphys_2015</scheme>
6563
<scheme>h2ophys</scheme>
6664
<scheme>get_phi_fv3</scheme>
6765
<scheme>GFS_suite_interstitial_3</scheme>
@@ -79,7 +77,7 @@
7977
<scheme>mp_thompson_post</scheme>
8078
<scheme>GFS_MP_generic_post</scheme>
8179
<scheme>maximum_hourly_diagnostics</scheme>
82-
<scheme>phys_tend</scheme>
80+
<scheme>GFS_physics_post</scheme>
8381
</subcycle>
8482
</group>
8583
<group name="stochastics">

ccpp/suites_not_used/suite_FV3_HAFS_v1_thompson_nonsst.xml ccpp/suites/suite_FV3_HAFS_v1_thompson_nonsst.xml

+1-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
<scheme>rad_sw_pre</scheme>
1919
<scheme>rrtmg_sw</scheme>
2020
<scheme>rrtmg_sw_post</scheme>
21-
<scheme>rrtmg_lw_pre</scheme>
2221
<scheme>rrtmg_lw</scheme>
2322
<scheme>rrtmg_lw_post</scheme>
2423
<scheme>GFS_rrtmg_post</scheme>
@@ -59,7 +58,6 @@
5958
<scheme>unified_ugwp_post</scheme>
6059
<scheme>GFS_GWD_generic_post</scheme>
6160
<scheme>GFS_suite_stateout_update</scheme>
62-
<scheme>ozphys_2015</scheme>
6361
<scheme>h2ophys</scheme>
6462
<scheme>get_phi_fv3</scheme>
6563
<scheme>GFS_suite_interstitial_3</scheme>
@@ -77,7 +75,7 @@
7775
<scheme>mp_thompson_post</scheme>
7876
<scheme>GFS_MP_generic_post</scheme>
7977
<scheme>maximum_hourly_diagnostics</scheme>
80-
<scheme>phys_tend</scheme>
78+
<scheme>GFS_physics_post</scheme>
8179
</subcycle>
8280
</group>
8381
<group name="stochastics">

ccpp/suites_not_used/suite_FV3_HAFS_v1_thompson_noahmp.xml

+1-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
<scheme>rad_sw_pre</scheme>
1919
<scheme>rrtmg_sw</scheme>
2020
<scheme>rrtmg_sw_post</scheme>
21-
<scheme>rrtmg_lw_pre</scheme>
2221
<scheme>rrtmg_lw</scheme>
2322
<scheme>rrtmg_lw_post</scheme>
2423
<scheme>GFS_rrtmg_post</scheme>
@@ -61,7 +60,6 @@
6160
<scheme>unified_ugwp_post</scheme>
6261
<scheme>GFS_GWD_generic_post</scheme>
6362
<scheme>GFS_suite_stateout_update</scheme>
64-
<scheme>ozphys_2015</scheme>
6563
<scheme>h2ophys</scheme>
6664
<scheme>get_phi_fv3</scheme>
6765
<scheme>GFS_suite_interstitial_3</scheme>
@@ -79,7 +77,7 @@
7977
<scheme>mp_thompson_post</scheme>
8078
<scheme>GFS_MP_generic_post</scheme>
8179
<scheme>maximum_hourly_diagnostics</scheme>
82-
<scheme>phys_tend</scheme>
80+
<scheme>GFS_physics_post</scheme>
8381
</subcycle>
8482
</group>
8583
<group name="stochastics">

ccpp/suites_not_used/suite_FV3_HAFS_v1_thompson_noahmp_nonsst.xml

+1-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
<scheme>rad_sw_pre</scheme>
1919
<scheme>rrtmg_sw</scheme>
2020
<scheme>rrtmg_sw_post</scheme>
21-
<scheme>rrtmg_lw_pre</scheme>
2221
<scheme>rrtmg_lw</scheme>
2322
<scheme>rrtmg_lw_post</scheme>
2423
<scheme>GFS_rrtmg_post</scheme>
@@ -59,7 +58,6 @@
5958
<scheme>unified_ugwp_post</scheme>
6059
<scheme>GFS_GWD_generic_post</scheme>
6160
<scheme>GFS_suite_stateout_update</scheme>
62-
<scheme>ozphys_2015</scheme>
6361
<scheme>h2ophys</scheme>
6462
<scheme>get_phi_fv3</scheme>
6563
<scheme>GFS_suite_interstitial_3</scheme>
@@ -77,7 +75,7 @@
7775
<scheme>mp_thompson_post</scheme>
7876
<scheme>GFS_MP_generic_post</scheme>
7977
<scheme>maximum_hourly_diagnostics</scheme>
80-
<scheme>phys_tend</scheme>
78+
<scheme>GFS_physics_post</scheme>
8179
</subcycle>
8280
</group>
8381
<group name="stochastics">

cpl/module_cplfields.F90

+3-1
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ module module_cplfields
156156
FieldInfo("t2m ", "s") ]
157157

158158
! Import Fields ----------------------------------------
159-
integer, public, parameter :: NimportFields = 62
159+
integer, public, parameter :: NimportFields = 64
160160
logical, public :: importFieldsValid(NimportFields)
161161
type(ESMF_Field), target, public :: importFields(NimportFields)
162162

@@ -179,6 +179,8 @@ module module_cplfields
179179
FieldInfo("inst_ice_vis_dir_albedo ", "s"), &
180180
FieldInfo("wave_z0_roughness_length ", "s"), &
181181
FieldInfo("inst_tracer_diag_aod ", "s"), &
182+
FieldInfo("ocn_current_zonal ", "s"), &
183+
FieldInfo("ocn_current_merid ", "s"), &
182184

183185
! For receiving fluxes from mediator
184186
FieldInfo("stress_on_air_ocn_zonal ", "s"), &

0 commit comments

Comments
 (0)