@@ -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! ===============================================================================
6769contains
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