Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion .github/workflows/test.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
name: build

on: [pull_request,workflow_dispatch]
on:
push:
branches:
- main
- development
workflow_dispatch:
pull_request:

jobs:
test_musica_api:
Expand Down
6 changes: 6 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
[submodule "mmm-physics"]
path = schemes/mmm/mmm_physics
url = https://github.com/NCAR/MMM-physics.git
fxtag = 20240626-MPASv8.2
fxrequired = AlwaysRequired
fxDONOTUSEurl = https://github.com/NCAR/MMM-physics.git
635 changes: 622 additions & 13 deletions doc/NamesNotInDictionary.txt

Large diffs are not rendered by default.

33 changes: 33 additions & 0 deletions phys_utils/atmos_phys_rad_utils.F90
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
module atmos_phys_rad_utils
! Radiation utility functions

implicit none
private

public :: is_visible

contains

pure logical function is_visible(wavenumber)
! Returns true if the provided wavenumber is above the visible threshold
use ccpp_kinds, only: kind_phys

! Wavenumber is in the visible if it is above the visible threshold
! wavenumber, and in the infrared if it is below the threshold
! This function doesn't distinquish between visible and UV.

! wavenumber in inverse cm (cm^-1)
real(kind_phys), intent(in) :: wavenumber

! Set threshold between visible and infrared to 0.7 micron, or 14286 cm^-1
real(kind_phys), parameter :: visible_wavenumber_threshold = 14286._kind_phys ! cm^-1

if (wavenumber > visible_wavenumber_threshold) then
is_visible = .true.
else
is_visible = .false.
end if

end function is_visible

end module atmos_phys_rad_utils
60 changes: 60 additions & 0 deletions phys_utils/atmos_phys_string_utils.F90
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
module atmos_phys_string_utils
! String utils

implicit none
private

public :: to_lower
public :: to_upper

contains

pure function to_lower(input_string) result(lowercase_string)
! Return 'input_string' in all lower case
character(len=*), intent(in) :: input_string
character(len=len(input_string)) :: lowercase_string
! Local variables

integer :: i ! Index
integer :: aseq ! ascii collating sequence
integer :: upper_to_lower ! integer to convert case
character(len=1) :: ctmp ! Character temporary
!-----------------------------------------------------------------------
upper_to_lower = iachar("a") - iachar("A")

do i = 1, len(input_string)
ctmp = input_string(i:i)
aseq = iachar(ctmp)
if ( aseq >= iachar("A") .and. aseq <= iachar("Z") ) &
ctmp = achar(aseq + upper_to_lower)
lowercase_string(i:i) = ctmp
end do

end function to_lower

!---------------------------------------------------------------------------
!---------------------------------------------------------------------------

pure function to_upper(input_string) result(uppercase_string)
! Return 'input_string' in all upper case
character(len=*), intent(in) :: input_string
character(len=len(input_string)) :: uppercase_string

integer :: i ! Index
integer :: aseq ! ascii collating sequence
integer :: lower_to_upper ! integer to convert case
character(len=1) :: ctmp ! Character temporary
!-----------------------------------------------------------------------
lower_to_upper = iachar("A") - iachar("a")

do i = 1, len(input_string)
ctmp = input_string(i:i)
aseq = iachar(ctmp)
if ( aseq >= iachar("a") .and. aseq <= iachar("z") ) &
ctmp = achar(aseq + lower_to_upper)
uppercase_string(i:i) = ctmp
end do

end function to_upper

end module atmos_phys_string_utils
258 changes: 258 additions & 0 deletions phys_utils/ccpp_io_reader.F90
Original file line number Diff line number Diff line change
@@ -0,0 +1,258 @@
module ccpp_io_reader
implicit none
private

public :: abstract_netcdf_reader_t
public :: create_netcdf_reader_t

type, abstract :: abstract_netcdf_reader_t
contains
procedure(open_file), deferred :: open_file
procedure(close_file), deferred :: close_file
procedure(get_var_int_0d), deferred :: get_var_int_0d
procedure(get_var_int_1d), deferred :: get_var_int_1d
procedure(get_var_int_2d), deferred :: get_var_int_2d
procedure(get_var_int_3d), deferred :: get_var_int_3d
procedure(get_var_int_4d), deferred :: get_var_int_4d
procedure(get_var_int_5d), deferred :: get_var_int_5d
procedure(get_var_real_0d), deferred :: get_var_real_0d
procedure(get_var_real_1d), deferred :: get_var_real_1d
procedure(get_var_real_2d), deferred :: get_var_real_2d
procedure(get_var_real_3d), deferred :: get_var_real_3d
procedure(get_var_real_4d), deferred :: get_var_real_4d
procedure(get_var_real_5d), deferred :: get_var_real_5d
procedure(get_var_char_0d), deferred :: get_var_char_0d
procedure(get_var_char_1d), deferred :: get_var_char_1d
procedure(get_var_char_2d), deferred :: get_var_char_2d
procedure(get_var_char_3d), deferred :: get_var_char_3d
procedure(get_var_char_4d), deferred :: get_var_char_4d
procedure(get_var_char_5d), deferred :: get_var_char_5d

generic :: get_var => get_var_int_0d, get_var_int_1d, get_var_int_2d, get_var_int_3d, get_var_int_4d, get_var_int_5d, &
get_var_real_0d, get_var_real_1d, get_var_real_2d, get_var_real_3d, get_var_real_4d, get_var_real_5d, &
get_var_char_0d, get_var_char_1d, get_var_char_2d, get_var_char_3d, get_var_char_4d, get_var_char_5d
end type abstract_netcdf_reader_t

interface
module function create_netcdf_reader_t() result(r)
class(abstract_netcdf_reader_t), allocatable :: r
end function create_netcdf_reader_t

subroutine open_file(this, file_path, errmsg, errcode)
import abstract_netcdf_reader_t

class(abstract_netcdf_reader_t), intent(inout) :: this
character(len=*), intent(in) :: file_path
character(len=*), intent(out) :: errmsg
integer, intent(out) :: errcode !Error code
end subroutine open_file

subroutine close_file(this, errmsg, errcode)
import abstract_netcdf_reader_t

class(abstract_netcdf_reader_t), intent(inout) :: this
character(len=*), intent(out) :: errmsg
integer, intent(out) :: errcode !Error code
end subroutine close_file

! ------------------------------------------------------------------
! Integer interfaces
! ------------------------------------------------------------------

subroutine get_var_int_0d(this, varname, var, errmsg, errcode)
import abstract_netcdf_reader_t

class(abstract_netcdf_reader_t), intent(in) :: this
character(len=*), intent(in) :: varname
integer, pointer, intent(out) :: var !Integer variable that file data will be read to.
character(len=*), intent(out) :: errmsg !Error message
integer, intent(out) :: errcode !Error code
end subroutine get_var_int_0d

subroutine get_var_int_1d(this, varname, var, errmsg, errcode)
import abstract_netcdf_reader_t

class(abstract_netcdf_reader_t), intent(in) :: this
character(len=*), intent(in) :: varname
integer, pointer, intent(out) :: var(:) !Integer variable that file data will be read to.
character(len=*), intent(out) :: errmsg !Error message
integer, intent(out) :: errcode !Error code
end subroutine get_var_int_1d

subroutine get_var_int_2d(this, varname, var, errmsg, errcode)
import abstract_netcdf_reader_t

class(abstract_netcdf_reader_t), intent(in) :: this
character(len=*), intent(in) :: varname
integer, pointer, intent(out) :: var(:,:)!Integer variable that file data will be read to.
character(len=*), intent(out) :: errmsg !Error message
integer, intent(out) :: errcode !Error code
end subroutine get_var_int_2d

subroutine get_var_int_3d(this, varname, var, errmsg, errcode)
import abstract_netcdf_reader_t

class(abstract_netcdf_reader_t), intent(in) :: this
character(len=*), intent(in) :: varname
integer, pointer, intent(out) :: var(:,:,:) !Integer variable that file data will be read to.
character(len=*), intent(out) :: errmsg !Error message
integer, intent(out) :: errcode !Error code
end subroutine get_var_int_3d

subroutine get_var_int_4d(this, varname, var, errmsg, errcode)
import abstract_netcdf_reader_t

class(abstract_netcdf_reader_t), intent(in) :: this
character(len=*), intent(in) :: varname
integer, pointer, intent(out) :: var(:,:,:,:) !Integer variable that file data will be read to.
character(len=*), intent(out) :: errmsg !Error message
integer, intent(out) :: errcode !Error code
end subroutine get_var_int_4d

subroutine get_var_int_5d(this, varname, var, errmsg, errcode)
import abstract_netcdf_reader_t

class(abstract_netcdf_reader_t), intent(in) :: this
character(len=*), intent(in) :: varname
integer, pointer, intent(out) :: var(:,:,:,:,:) !Integer variable that file data will be read to.
character(len=*), intent(out) :: errmsg !Error message
integer, intent(out) :: errcode !Error code
end subroutine get_var_int_5d

! ------------------------------------------------------------------
! Real interfaces
! ------------------------------------------------------------------

subroutine get_var_real_0d(this, varname, var, errmsg, errcode)
use ccpp_kinds, only: kind_phys
import abstract_netcdf_reader_t

class(abstract_netcdf_reader_t), intent(in) :: this
character(len=*), intent(in) :: varname
real(kind_phys), pointer, intent(out) :: var !Floating-point variable that file data will be read to.
character(len=*), intent(out) :: errmsg !Error message
integer, intent(out) :: errcode !Error code
end subroutine get_var_real_0d

subroutine get_var_real_1d(this, varname, var, errmsg, errcode)
use ccpp_kinds, only: kind_phys
import abstract_netcdf_reader_t

class(abstract_netcdf_reader_t), intent(in) :: this
character(len=*), intent(in) :: varname
real(kind_phys), pointer, intent(out) :: var(:) !Floating-point variable that file data will be read to.
character(len=*), intent(out) :: errmsg !Error message
integer, intent(out) :: errcode !Error code
end subroutine get_var_real_1d

subroutine get_var_real_2d(this, varname, var, errmsg, errcode)
use ccpp_kinds, only: kind_phys
import abstract_netcdf_reader_t

class(abstract_netcdf_reader_t), intent(in) :: this
character(len=*), intent(in) :: varname
real(kind_phys), pointer, intent(out) :: var(:,:)!Floating-point variable that file data will be read to.
character(len=*), intent(out) :: errmsg !Error message
integer, intent(out) :: errcode !Error code
end subroutine get_var_real_2d

subroutine get_var_real_3d(this, varname, var, errmsg, errcode)
use ccpp_kinds, only: kind_phys
import abstract_netcdf_reader_t

class(abstract_netcdf_reader_t), intent(in) :: this
character(len=*), intent(in) :: varname
real(kind_phys), pointer, intent(out) :: var(:,:,:) !Floating-point variable that file data will be read to.
character(len=*), intent(out) :: errmsg !Error message
integer, intent(out) :: errcode !Error code
end subroutine get_var_real_3d

subroutine get_var_real_4d(this, varname, var, errmsg, errcode)
use ccpp_kinds, only: kind_phys
import abstract_netcdf_reader_t

class(abstract_netcdf_reader_t), intent(in) :: this
character(len=*), intent(in) :: varname
real(kind_phys), pointer, intent(out) :: var(:,:,:,:) !Floating-point variable that file data will be read to.
character(len=*), intent(out) :: errmsg !Error message
integer, intent(out) :: errcode !Error code
end subroutine get_var_real_4d

subroutine get_var_real_5d(this, varname, var, errmsg, errcode)
use ccpp_kinds, only: kind_phys
import abstract_netcdf_reader_t

class(abstract_netcdf_reader_t), intent(in) :: this
character(len=*), intent(in) :: varname
real(kind_phys), pointer, intent(out) :: var(:,:,:,:,:) !Floating-point variable that file data will be read to.
character(len=*), intent(out) :: errmsg !Error message
integer, intent(out) :: errcode !Error code
end subroutine get_var_real_5d

! ------------------------------------------------------------------
! Character interfaces
! ------------------------------------------------------------------

subroutine get_var_char_0d(this, varname, var, errmsg, errcode)
import abstract_netcdf_reader_t

class(abstract_netcdf_reader_t), intent(in) :: this
character(len=*), intent(in) :: varname
character(len=:), pointer, intent(out) :: var !Character variable that file data will be read to.
character(len=*), intent(out) :: errmsg !Error message
integer, intent(out) :: errcode !Error code
end subroutine get_var_char_0d

subroutine get_var_char_1d(this, varname, var, errmsg, errcode)
import abstract_netcdf_reader_t

class(abstract_netcdf_reader_t), intent(in) :: this
character(len=*), intent(in) :: varname
character(len=:), pointer, intent(out) :: var(:) !Character variable that file data will be read to.
character(len=*), intent(out) :: errmsg !Error message
integer, intent(out) :: errcode !Error code
end subroutine get_var_char_1d

subroutine get_var_char_2d(this, varname, var, errmsg, errcode)
import abstract_netcdf_reader_t

class(abstract_netcdf_reader_t), intent(in) :: this
character(len=*), intent(in) :: varname
character(len=:), pointer, intent(out) :: var(:,:)!Character variable that file data will be read to.
character(len=*), intent(out) :: errmsg !Error message
integer, intent(out) :: errcode !Error code
end subroutine get_var_char_2d

subroutine get_var_char_3d(this, varname, var, errmsg, errcode)
import abstract_netcdf_reader_t

class(abstract_netcdf_reader_t), intent(in) :: this
character(len=*), intent(in) :: varname
character(len=:), pointer, intent(out) :: var(:,:,:) !Character variable that file data will be read to.
character(len=*), intent(out) :: errmsg !Error message
integer, intent(out) :: errcode !Error code
end subroutine get_var_char_3d

subroutine get_var_char_4d(this, varname, var, errmsg, errcode)
import abstract_netcdf_reader_t

class(abstract_netcdf_reader_t), intent(in) :: this
character(len=*), intent(in) :: varname
character(len=:), pointer, intent(out) :: var(:,:,:,:) !Character variable that file data will be read to.
character(len=*), intent(out) :: errmsg !Error message
integer, intent(out) :: errcode !Error code
end subroutine get_var_char_4d

subroutine get_var_char_5d(this, varname, var, errmsg, errcode)
import abstract_netcdf_reader_t

class(abstract_netcdf_reader_t), intent(in) :: this
character(len=*), intent(in) :: varname
character(len=:), pointer, intent(out) :: var(:,:,:,:,:) !Character variable that file data will be read to.
character(len=*), intent(out) :: errmsg !Error message
integer, intent(out) :: errcode !Error code
end subroutine get_var_char_5d

end interface

end module ccpp_io_reader
Loading