Skip to content

Commit

Permalink
update mom cap from NEMS
Browse files Browse the repository at this point in the history
  • Loading branch information
apcraig committed Feb 16, 2018
1 parent 7bf531b commit 5374582
Show file tree
Hide file tree
Showing 2 changed files with 199 additions and 0 deletions.
38 changes: 38 additions & 0 deletions config_src/coupled_driver/ocean_model_MOM.F90
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ module ocean_model_mod
implicit none ; private

public ocean_model_init, ocean_model_end, update_ocean_model
public get_ocean_grid ! add by Jiande
public ocean_model_save_restart, Ocean_stock_pe
public ice_ocean_boundary_type
public ocean_model_init_sfc, ocean_model_flux_init
Expand Down Expand Up @@ -1162,6 +1163,26 @@ subroutine ocean_model_data2D_get(OS,Ocean, name, array2D,isc,jsc)
array2D(isc:,jsc:) = Ocean%t_surf(isc:,jsc:)-CELSIUS_KELVIN_OFFSET
case('btfHeat')
array2D(isc:,jsc:) = 0
case('tlat')
array2D(isc:,jsc:) = OS%grid%geoLatT(g_isc:g_iec,g_jsc:g_jec)
case('tlon')
array2D(isc:,jsc:) = OS%grid%geoLonT(g_isc:g_iec,g_jsc:g_jec)
case('ulat')
array2D(isc:,jsc:) = OS%grid%geoLatCu(g_isc:g_iec,g_jsc:g_jec)
case('ulon')
array2D(isc:,jsc:) = OS%grid%geoLonCu(g_isc:g_iec,g_jsc:g_jec)
case('vlat')
array2D(isc:,jsc:) = OS%grid%geoLatCv(g_isc:g_iec,g_jsc:g_jec)
case('vlon')
array2D(isc:,jsc:) = OS%grid%geoLonCv(g_isc:g_iec,g_jsc:g_jec)
case('geoLatBu')
array2D(isc:,jsc:) = OS%grid%geoLatBu(g_isc:g_iec,g_jsc:g_jec)
case('geoLonBu')
array2D(isc:,jsc:) = OS%grid%geoLonBu(g_isc:g_iec,g_jsc:g_jec)
case('cos_rot')
array2D(isc:,jsc:) = OS%grid%cos_rot(g_isc:g_iec,g_jsc:g_jec) ! =1
case('sin_rot')
array2D(isc:,jsc:) = OS%grid%sin_rot(g_isc:g_iec,g_jsc:g_jec) ! =0
case default
call MOM_error(FATAL,'get_ocean_grid_data2D: unknown argument name='//name)
end select
Expand Down Expand Up @@ -1210,4 +1231,21 @@ subroutine ocean_public_type_chksum(id, timestep, ocn)

end subroutine ocean_public_type_chksum

!#######################################################################
! <SUBROUTINE NAME="get_ocean_grid">
!
! <DESCRIPTION>
! Obtain the ocean grid.
! </DESCRIPTION>
!
subroutine get_ocean_grid(OS, Gridp)
type(ocean_state_type) :: OS
type(ocean_grid_type) , pointer :: Gridp

Gridp => OS%grid
return

end subroutine get_ocean_grid
! </SUBROUTINE> NAME="get_ocean_grid"

end module ocean_model_mod
161 changes: 161 additions & 0 deletions config_src/nuopc_driver/time_utils.F90
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
module time_utils_mod

use fms_mod, only: uppercase
use mpp_mod, only: mpp_error, FATAL
use time_manager_mod, only: time_type, set_time, set_date, get_date
use time_manager_mod, only: GREGORIAN, JULIAN, NOLEAP, THIRTY_DAY_MONTHS, NO_CALENDAR
use time_manager_mod, only: fms_get_calendar_type => get_calendar_type
use ESMF

implicit none
private

!-------------------- interface blocks ---------------------
interface fms2esmf_cal
module procedure fms2esmf_cal_c
module procedure fms2esmf_cal_i
end interface fms2esmf_cal
interface esmf2fms_time
module procedure esmf2fms_time_t
module procedure esmf2fms_timestep
end interface esmf2fms_time

public fms2esmf_cal
public esmf2fms_time
public fms2esmf_time
public string_to_date

contains

!-------------------- module code ---------------------

function fms2esmf_cal_c(calendar)
! ! Return Value:
type(ESMF_CALKIND_FLAG) :: fms2esmf_cal_c
! ! Arguments:
character(len=*), intent(in) :: calendar

select case( uppercase(trim(calendar)) )
case( 'GREGORIAN' )
fms2esmf_cal_c = ESMF_CALKIND_GREGORIAN
case( 'JULIAN' )
fms2esmf_cal_c = ESMF_CALKIND_JULIAN
case( 'NOLEAP' )
fms2esmf_cal_c = ESMF_CALKIND_NOLEAP
case( 'THIRTY_DAY' )
fms2esmf_cal_c = ESMF_CALKIND_360DAY
case( 'NO_CALENDAR' )
fms2esmf_cal_c = ESMF_CALKIND_NOCALENDAR
case default
call mpp_error(FATAL, &
'ocean_solo: ocean_solo_nml entry calendar must be one of GREGORIAN|JULIAN|NOLEAP|THIRTY_DAY|NO_CALENDAR.' )
end select
end function fms2esmf_cal_c

function fms2esmf_cal_i(calendar)
! ! Return Value:
type(ESMF_CALKIND_FLAG) :: fms2esmf_cal_i
! ! Arguments:
integer, intent(in) :: calendar

select case(calendar)
case(THIRTY_DAY_MONTHS)
fms2esmf_cal_i = ESMF_CALKIND_360DAY
case(GREGORIAN)
fms2esmf_cal_i = ESMF_CALKIND_GREGORIAN
case(JULIAN)
fms2esmf_cal_i = ESMF_CALKIND_JULIAN
case(NOLEAP)
fms2esmf_cal_i = ESMF_CALKIND_NOLEAP
case(NO_CALENDAR)
fms2esmf_cal_i = ESMF_CALKIND_NOCALENDAR
end select
end function fms2esmf_cal_i

function esmf2fms_time_t(time)
! Return Value
type(Time_type) :: esmf2fms_time_t
! Input Arguments
type(ESMF_Time), intent(in) :: time
! Local Variables
integer :: yy, mm, dd, h, m, s
type(ESMF_CALKIND_FLAG) :: calkind

integer :: rc

call ESMF_TimeGet(time, yy=yy, mm=mm, dd=dd, h=h, m=m, s=s, &
calkindflag=calkind, rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, &
file=__FILE__)) &
return ! bail out

esmf2fms_time_t = Set_date(yy, mm, dd, h, m, s)

end function esmf2fms_time_t

function esmf2fms_timestep(timestep)
! Return Value
type(Time_type) :: esmf2fms_timestep
! Input Arguments
type(ESMF_TimeInterval), intent(in):: timestep
! Local Variables
integer :: s
type(ESMF_CALKIND_FLAG) :: calkind

integer :: rc

call ESMF_TimeIntervalGet(timestep, s=s, calkindflag=calkind, rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, &
file=__FILE__)) &
return ! bail out

esmf2fms_timestep = set_time(s, 0)

end function esmf2fms_timestep

function fms2esmf_time(time, calkind)
! Return Value
type(ESMF_Time) :: fms2esmf_time
! Input Arguments
type(Time_type), intent(in) :: time
type(ESMF_CALKIND_FLAG), intent(in), optional :: calkind
! Local Variables
integer :: yy, mm, d, h, m, s
type(ESMF_CALKIND_FLAG) :: l_calkind

integer :: rc

if(present(calkind)) then
l_calkind = calkind
else
l_calkind = fms2esmf_cal(fms_get_calendar_type())
endif

call get_date(time, yy, mm, d, h, m, s)

call ESMF_TimeSet(fms2esmf_time, yy=yy, mm=mm, d=d, h=h, m=m, s=s, &
calkindflag=l_calkind, rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, &
file=__FILE__)) &
return ! bail out

end function fms2esmf_time

function string_to_date(string, rc)
character(len=15), intent(in) :: string
integer, intent(out), optional :: rc
type(time_type) :: string_to_date

integer :: yr,mon,day,hr,min,sec

if(present(rc)) rc = ESMF_SUCCESS

read(string, '(I4.4,I2.2,I2.2,".",I2.2,I2.2,I2.2)') yr, mon, day, hr, min, sec
string_to_date = set_date(yr, mon, day, hr, min, sec)

end function string_to_date

end module time_utils_mod

0 comments on commit 5374582

Please sign in to comment.