Skip to content

Commit 257b47a

Browse files
authored
Merge pull request #41 from matsbn/feature-ocean_albedo_schemes - Add Taylor et al. (1996) ocean albedo scheme as an option
Add Taylor et al. (1996) ocean albedo scheme as an option
2 parents 2910de8 + 5e9d20b commit 257b47a

File tree

2 files changed

+59
-19
lines changed

2 files changed

+59
-19
lines changed

cime_config/namelist_definition_drv.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -904,6 +904,20 @@
904904
</values>
905905
</entry>
906906

907+
<entry id="ocean_albedo_scheme">
908+
<type>integer</type>
909+
<category>control</category>
910+
<group>MED_attributes</group>
911+
<desc>
912+
Ocean albedo scheme
913+
0 : Briegleb et al. (1986)
914+
1 : Taylor et al. (1996)
915+
</desc>
916+
<values>
917+
<value>0</value>
918+
</values>
919+
</entry>
920+
907921
<entry id="aoflux_grid">
908922
<type>char</type>
909923
<category>mapping</category>

mediator/med_phases_ocnalb_mod.F90

Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,14 @@ module med_phases_ocnalb_mod
5757
character(len=*) , parameter :: orb_fixed_parameters = 'fixed_parameters'
5858

5959
! used, reused in module
60-
logical :: flux_albav ! use average dif and dir albedos
61-
logical :: use_nextswcday ! use the scalar field for next time (otherwise, will be set using clock)
62-
logical :: use_min_albedo ! apply minimum value of albedo for direct vis, nir
63-
real(R8) :: min_albedo ! minimum value of albedo for direct vis, nir
64-
real(R8) :: albdif ! 60 deg reference albedo, diffuse
65-
real(R8) :: albdir ! 60 deg reference albedo, direct
60+
logical :: flux_albav ! use average dif and dir albedos
61+
logical :: use_nextswcday ! use the scalar field for next time (otherwise, will be set using clock)
62+
logical :: use_min_albedo ! apply minimum value of albedo for direct vis, nir
63+
logical :: use_briegleb ! use Briegleb et al. (1986) ocean albedo scheme
64+
real(R8) :: min_albedo ! minimum value of albedo for direct vis, nir
65+
real(R8) :: albdif ! 60 deg reference albedo, diffuse
66+
real(R8) :: albdir ! 60 deg reference albedo, direct
67+
integer :: ocean_albedo_scheme ! 0: Briegleb et al. (1986); 1: Taylor et al. (1996)
6668
!===============================================================================
6769
contains
6870
!===============================================================================
@@ -75,7 +77,7 @@ subroutine med_phases_ocnalb_init(gcomp, ocnalb, rc)
7577
! All input field bundles are ASSUMED to be on the ocean grid
7678
!-----------------------------------------------------------------------
7779

78-
use ESMF , only : ESMF_LogWrite, ESMF_LOGMSG_INFO, ESMF_SUCCESS, ESMF_FAILURE
80+
use ESMF , only : ESMF_LogWrite, ESMF_LogSetError, ESMF_LOGMSG_INFO, ESMF_SUCCESS, ESMF_FAILURE
7981
use ESMF , only : ESMF_VM, ESMF_VMGet, ESMF_Mesh, ESMF_MeshGet
8082
use ESMF , only : ESMF_GridComp, ESMF_GridCompGet
8183
use ESMF , only : ESMF_FieldBundleGet, ESMF_Field, ESMF_FieldGet
@@ -231,18 +233,36 @@ subroutine med_phases_ocnalb_init(gcomp, ocnalb, rc)
231233
if (.not. isPresent ) then
232234
use_nextswcday = .false.
233235
endif
234-
235-
if (flux_albav) then
236-
write(msg,'(2(A,f8.2))') trim(subname)//': mean albedos set: albdif = ',albdif,', albdir = ',albdir
237-
call ESMF_LogWrite(trim(msg), ESMF_LOGMSG_INFO)
236+
! Determine ocean albedo scheme
237+
call NUOPC_CompAttributeGet(gcomp, name='ocean_albedo_scheme', value=cvalue, isPresent=isPresent, isSet=isSet, rc=rc)
238+
if (chkerr(rc,__LINE__,u_FILE_u)) return
239+
if (isPresent .and. isSet) then
240+
read(cvalue,*) ocean_albedo_scheme
238241
else
239-
if (use_min_albedo) then
240-
write(msg,'(A,f8.2)') trim(subname)//': min_albedo setting = ',min_albedo
241-
call ESMF_LogWrite(trim(msg), ESMF_LOGMSG_INFO)
242+
ocean_albedo_scheme = 0
243+
end if
244+
245+
if (maintask) then
246+
if (flux_albav) then
247+
write(logunit,'(2(A,f8.2))') trim(subname)//': mean albedos set: albdif = ',albdif,', albdir = ',albdir
248+
else
249+
if (use_min_albedo) then
250+
write(logunit,'(A,f8.2)') trim(subname)//': min_albedo setting = ',min_albedo
251+
end if
242252
end if
253+
write(logunit,'(A,l1)') trim(subname)//': use_nextswcday setting is ',use_nextswcday
254+
write(logunit,'(A,i1)') trim(subname)//': ocean_albedo_scheme setting is ',ocean_albedo_scheme
255+
end if
256+
if (ocean_albedo_scheme == 0) then
257+
use_briegleb = .true.
258+
elseif (ocean_albedo_scheme == 1 ) then
259+
use_briegleb = .false.
260+
else
261+
call ESMF_LogSetError(ESMF_FAILURE, &
262+
msg=trim(subname)//": ERROR: unknown ocean_albedo_scheme", &
263+
line=__LINE__, file=__FILE__, rcToReturn=rc)
264+
return
243265
end if
244-
write(msg,'(A,l1)') trim(subname)//': use_nextswcday setting is ',use_nextswcday
245-
call ESMF_LogWrite(trim(msg), ESMF_LOGMSG_INFO)
246266

247267
if (dbug_flag > 5) then
248268
call ESMF_LogWrite(trim(subname)//": done", ESMF_LOGMSG_INFO)
@@ -449,9 +469,15 @@ subroutine med_phases_ocnalb_run(gcomp, rc)
449469
rlon = const_deg2rad * ocnalb%lons(n)
450470
cosz = shr_orb_cosz( nextsw_cday, rlat, rlon, delta )
451471
if (cosz > 0.0_r8) then !--- sun hit --
452-
ocnalb%anidr(n) = (.026_r8/(cosz**1.7_r8 + 0.065_r8)) + &
453-
(.150_r8*(cosz - 0.100_r8 ) * &
454-
(cosz - 0.500_r8 ) * (cosz - 1.000_r8 ) )
472+
if (use_briegleb) then
473+
! Briegleb et al. (1986) scheme
474+
ocnalb%anidr(n) = (.026_r8/(cosz**1.7_r8 + 0.065_r8)) + &
475+
(.150_r8*(cosz - 0.100_r8 ) * &
476+
(cosz - 0.500_r8 ) * (cosz - 1.000_r8 ) )
477+
else
478+
! Taylor et al. (1996) scheme
479+
ocnalb%anidr(n) = 0.037_r8/(1.1_r8*cosz**1.4_r8 + 0.15_r8)
480+
endif
455481
if (use_min_albedo) then
456482
ocnalb%anidr(n) = max (ocnalb%anidr(n), min_albedo)
457483
end if

0 commit comments

Comments
 (0)