Skip to content

Commit

Permalink
Merge pull request #1770 from GEOS-ESM/develop
Browse files Browse the repository at this point in the history
GitFlow: Merge Develop into Main for 2.29 Release
  • Loading branch information
mathomp4 authored Oct 28, 2022
2 parents ee50e8c + 8cf90e1 commit 6135a39
Show file tree
Hide file tree
Showing 15 changed files with 274 additions and 78 deletions.
16 changes: 16 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,22 @@ workflows:
baselibs_version: *baselibs_version
bcs_version: *bcs_version

# Run Coupled GCM (1 hour, no ExtData)
- ci/run_gcm:
name: run-coupled-GCM-on-<< matrix.compiler >>
context:
- docker-hub-creds
matrix:
parameters:
compiler: [ifort]
requires:
- build-GEOSgcm-on-<< matrix.compiler >>
repo: GEOSgcm
baselibs_version: *baselibs_version
bcs_version: *bcs_version
gcm_ocean_type: MOM6
change_layout: false

# Run MAPL Tutorials
- ci/run_mapl_tutorial:
name: run-<< matrix.tutorial_name >>-Tutorial-with-<< matrix.compiler >>
Expand Down
23 changes: 22 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,33 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added

### Changed
- Error codes in `shared/MAPL_Error_Handling.F90` are now consistent with `_FAILURE = 1` in `include/MAPL_ErrLog.h`

### Removed

### Deprecated

## [2.29.0] - 2022-10-28

### Fixed

- Add define for `-Dsys${CMAKE_SYSTEM_NAME}` to fix build issue with macOS and Intel (#1695)
- Fix handling of return macros for programs and subroutines (#1194)

### Added

- Add Coupled MOM6 GCM run to CI (ifort only)
- Added ability to pass in extra options to FLAP CLI arguments
- Added option to pass vertical metadata to FieldBundleWriter class for output file
- Expose FileMetaUtilities class MAPL_VerticalDataMod via "use MAPL"

### Changed

- Change argument arrdes of MAPL_Read and Write NC Var 3d to optional
- Error codes in `shared/MAPL_Error_Handling.F90` are now consistent with `_FAILURE = 1` in `include/MAPL_ErrLog.h`
- Updated `components.yaml
- ESMA_env v4.4.0 → v4.5.0 (Update for GMI builds)
- ESMA_cmake v3.18.0 → v3.19.0 (Add `-save-temps` to GNU debug, check if install prefix is writable)

## [2.28.0] - 2022-10-17

### Fixed
Expand Down
4 changes: 3 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ cmake_policy (SET CMP0054 NEW)

project (
MAPL
VERSION 2.28.0
VERSION 2.29.0
LANGUAGES Fortran CXX C) # Note - CXX is required for ESMF

# Set the default build type to release
Expand Down Expand Up @@ -158,6 +158,8 @@ else ()
add_subdirectory (pflogger_stub)
endif ()

add_definitions(-Dsys${CMAKE_SYSTEM_NAME})

# Special case - MAPL_cfio is built twice with two different precisions.
add_subdirectory (MAPL_cfio MAPL_cfio_r4)
add_subdirectory (MAPL_cfio MAPL_cfio_r8)
Expand Down
2 changes: 2 additions & 0 deletions base/Base.F90
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ module MAPLBase_Mod
use MAPL_EtaHybridVerticalCoordinateMod
use MAPL_ApplicationSupport
use MAPL_ServerManager
use MAPL_FileMetadataUtilsMod
use MAPL_VerticalDataMod
logical, save, private :: mapl_is_initialized = .false.

end module MAPLBase_Mod
52 changes: 50 additions & 2 deletions base/FileMetadataUtilities.F90
Original file line number Diff line number Diff line change
Expand Up @@ -490,11 +490,14 @@ function get_variable_attribute(this,var_name,attr_name,rc) result(units)

end function get_variable_attribute

subroutine get_coordinate_info(this,coordinate_name,coordSize,coordUnits,coords,rc)
subroutine get_coordinate_info(this,coordinate_name,coordSize,coordUnits,long_name,standard_name,coords,coordinate_attr,rc)
class (FileMetadataUtils), intent(inout) :: this
character(len=*), intent(in) :: coordinate_name
integer, optional, intent(out) :: coordSize
character(len=*), optional, intent(out) :: coordUnits
character(len=*), optional, intent(out) :: long_name
character(len=*), optional, intent(out) :: standard_name
character(len=*), optional, intent(out) :: coordinate_attr
real, allocatable, optional, intent(inout) :: coords(:)
integer, optional, intent(out) :: rc

Expand Down Expand Up @@ -522,10 +525,55 @@ subroutine get_coordinate_info(this,coordinate_name,coordSize,coordUnits,coords,
type is (character(*))
coordUnits = trim(coordUnitPtr)
class default
_FAIL('coordinate units must be string in '//fname)
_FAIL(trim(coordinate_name)//' units must be string in '//fname)
end select
end if

if (present(long_name)) then
if (this%var_has_attr(coordinate_name,"long_name")) then
attr => var%get_attribute('long_name')
coordUnitPtr => attr%get_value()
select type(coordUnitPtr)
type is (character(*))
long_name = trim(coordUnitPtr)
class default
_FAIL(trim(coordinate_name)//' long_name must be string in '//fname)
end select
else
long_name = 'not found'
endif
end if

if (present(standard_name)) then
if (this%var_has_attr(coordinate_name,"standard_name")) then
attr => var%get_attribute('standard_name')
coordUnitPtr => attr%get_value()
select type(coordUnitPtr)
type is (character(*))
standard_name = trim(coordUnitPtr)
class default
_FAIL(trim(coordinate_name)//' standard_name must be string in '//fname)
end select
else
standard_name = 'not found'
endif
end if

if (present(coordinate_attr)) then
if (this%var_has_attr(coordinate_name,"coordinate")) then
attr => var%get_attribute('coordinate')
coordUnitPtr => attr%get_value()
select type(coordUnitPtr)
type is (character(*))
coordinate_attr = trim(coordUnitPtr)
class default
_FAIL(trim(coordinate_name)//' name must be string in '//fname)
end select
else
coordinate_attr = 'not found'
endif
end if

if (present(coords)) then
ptr => var%get_coordinate_data()
_ASSERT(associated(ptr),"coord variable coordinate data not found in "//fname)
Expand Down
105 changes: 71 additions & 34 deletions base/MAPL_VerticalMethods.F90
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ module MAPL_VerticalDataMod
character(len=:), allocatable :: func
character(len=:), allocatable :: vvar
character(len=:), allocatable :: positive
character(len=:), allocatable :: long_name
character(len=:), allocatable :: standard_name
character(len=:), allocatable :: vcoord
real :: vscale
real :: pow=0.0
real, allocatable :: levs(:)
Expand Down Expand Up @@ -57,15 +60,19 @@ module MAPL_VerticalDataMod

contains

function newVerticalData(levels,vcoord,vscale,vunit,positive,rc) result(vdata)
function newVerticalData(levels,vcoord,vscale,vunit,positive,long_name,standard_name,force_no_regrid,rc) result(vdata)
type(VerticalData) :: vData
real, pointer, intent(in), optional :: levels(:)
real, intent(in), optional :: vscale
character(len=*), optional, intent(in) :: vcoord
character(len=*), optional, intent(in) :: vunit
character(len=*), optional, intent(in) :: positive
character(len=*), optional, intent(in) :: long_name
character(len=*), optional, intent(in) :: standard_name
logical, optional, intent(in) :: force_no_regrid
integer, optional, intent(Out) :: rc

logical :: local_force_no_regrid

if (present(positive)) then
_ASSERT(trim(positive)=='up'.or.trim(positive)=='down',trim(positive)//" not allowed for positive argument")
Expand All @@ -74,43 +81,73 @@ function newVerticalData(levels,vcoord,vscale,vunit,positive,rc) result(vdata)
vdata%positive='down'
end if

if (.not.present(levels)) then
if (trim(vdata%positive)=='down') then
vdata%regrid_type = VERTICAL_METHOD_NONE
else
vdata%regrid_type = VERTICAL_METHOD_FLIP
end if
_RETURN(ESMF_SUCCESS)
if (present(long_name)) then
vdata%long_name = long_name
else
vdata%long_name = 'vertical level'
end if
if (present(standard_name)) then
vdata%standard_name = standard_name
else
vdata%standard_name = 'model_layers'
end if
if (present(vcoord)) then
vdata%vcoord = vcoord
else
vdata%vcoord = 'eta'
endif

allocate(vData%levs,source=levels)
allocate(vData%scaled_levels,source=levels)
if (present(vunit)) then
vdata%vunit=vunit
else
vdata%vunit=""
vdata%vunit="layer"
end if
if (present(vscale)) then
vdata%vscale=vscale
vData%scaled_levels = vData%scaled_levels*vdata%vscale
end if
if (present(vcoord)) then
allocate(vData%interp_levels(size(vData%levs)))
vdata%regrid_type = VERTICAL_METHOD_ETA2LEV
vdata%VVAR = adjustl(vcoord)
vdata%Func = vdata%Vvar(1:3)
if (vdata%Func=='log') then
vdata%Vvar = adjustl(vdata%Vvar(index(vdata%Vvar,'(')+1:index(vdata%Vvar,')')-1))
vdata%interp_levels = log(vdata%scaled_levels)
elseif(vdata%Func=='pow') then
read( vdata%Vvar(index(vdata%Vvar,',')+1:index(vdata%Vvar,')')-1) , *) vdata%pow
vdata%Vvar = adjustl(vdata%Vvar(index(vdata%Vvar,'(')+1:index(vdata%Vvar,',')-1))
vdata%interp_levels = (vdata%levs*vdata%scaled_levels)**vdata%pow

if (present(force_no_regrid)) then
local_force_no_regrid = force_no_regrid
else
local_force_no_regrid = .false.
end if

if (.not.present(levels)) then
if (trim(vdata%positive)=='down') then
vdata%regrid_type = VERTICAL_METHOD_NONE
else
vdata%interp_levels = vdata%scaled_levels
endif
vdata%regrid_type = VERTICAL_METHOD_FLIP
end if
else
vdata%regrid_type = VERTICAL_METHOD_SELECT
allocate(vData%levs,source=levels)
if (local_force_no_regrid) then
if (trim(vdata%positive)=='down') then
vdata%regrid_type = VERTICAL_METHOD_NONE
else
vdata%regrid_type = VERTICAL_METHOD_FLIP
end if
_RETURN(_SUCCESS)
end if
allocate(vData%scaled_levels,source=levels)
if (present(vscale)) then
vdata%vscale=vscale
vData%scaled_levels = vData%scaled_levels*vdata%vscale
end if
if (present(vcoord)) then
allocate(vData%interp_levels(size(vData%levs)))
vdata%regrid_type = VERTICAL_METHOD_ETA2LEV
vdata%VVAR = adjustl(vcoord)
vdata%Func = vdata%Vvar(1:3)
if (vdata%Func=='log') then
vdata%Vvar = adjustl(vdata%Vvar(index(vdata%Vvar,'(')+1:index(vdata%Vvar,')')-1))
vdata%interp_levels = log(vdata%scaled_levels)
elseif(vdata%Func=='pow') then
read( vdata%Vvar(index(vdata%Vvar,',')+1:index(vdata%Vvar,')')-1) , *) vdata%pow
vdata%Vvar = adjustl(vdata%Vvar(index(vdata%Vvar,'(')+1:index(vdata%Vvar,',')-1))
vdata%interp_levels = (vdata%levs*vdata%scaled_levels)**vdata%pow
else
vdata%interp_levels = vdata%scaled_levels
endif
else
vdata%regrid_type = VERTICAL_METHOD_SELECT
end if
end if
end function newVerticalData

Expand Down Expand Up @@ -470,11 +507,11 @@ subroutine append_vertical_metadata(this,metadata,bundle,rc)
else
call metadata%add_dimension('lev', lm, rc=status)
v = Variable(type=PFIO_REAL64, dimensions='lev')
call v%add_attribute('long_name','vertical level')
call v%add_attribute('units','layer')
call v%add_attribute('long_name',this%long_name)
call v%add_attribute('units',this%vunit)
call v%add_attribute('positive',trim(this%positive))
call v%add_attribute('coordinate','eta')
call v%add_attribute('standard_name','model_layers')
call v%add_attribute('coordinate',this%vcoord)
call v%add_attribute('standard_name',this%standard_name)
call v%add_const_value(UnlimitedEntity(this%levs))
call metadata%add_variable('lev',v,rc=status)
_VERIFY(status)
Expand Down
34 changes: 18 additions & 16 deletions base/NCIO.F90
Original file line number Diff line number Diff line change
Expand Up @@ -664,7 +664,7 @@ subroutine MAPL_VarWriteNCpar_R4_3d(formatter, name, A, ARRDES, oClients, RC)
type(Netcdf4_Fileformatter) , intent(IN ) :: formatter
character(len=*) , intent(IN ) :: name
real(kind=ESMF_KIND_R4) , intent(IN ) :: A(:,:,:)
type(ArrDescr) , intent(INOUT) :: ARRDES
type(ArrDescr), optional , intent(INOUT) :: ARRDES
type (ClientManager), optional, intent(inout) :: oClients
integer, optional , intent( OUT) :: RC

Expand All @@ -673,24 +673,26 @@ subroutine MAPL_VarWriteNCpar_R4_3d(formatter, name, A, ARRDES, oClients, RC)
integer :: i1, j1, in, jn, global_dim(3)
type(ArrayReference) :: ref

if (arrdes%write_restart_by_oserver) then
_ASSERT(present(oClients), "output server is needed")
call MAPL_GridGet(arrdes%grid,globalCellCountPerDim=global_dim,rc=status)
_VERIFY(status)
call MAPL_Grid_interior(arrdes%grid,i1,in,j1,jn)
_ASSERT( i1 == arrdes%I1(arrdes%NX0), "interior starting i not match")
_ASSERT( j1 == arrdes%j1(arrdes%NY0), "interior starting j not match")
ref = ArrayReference(A)
_ASSERT( size(a,1) == in-i1+1, "size not match")
_ASSERT( size(a,2) == jn-j1+1, "size not match")
call oClients%collective_stage_data(arrdes%collection_id,trim(arrdes%filename),trim(name), &
if (present(arrdes)) then
if (arrdes%write_restart_by_oserver) then
_ASSERT(present(oClients), "output server is needed")
call MAPL_GridGet(arrdes%grid,globalCellCountPerDim=global_dim,rc=status)
_VERIFY(status)
call MAPL_Grid_interior(arrdes%grid,i1,in,j1,jn)
_ASSERT( i1 == arrdes%I1(arrdes%NX0), "interior starting i not match")
_ASSERT( j1 == arrdes%j1(arrdes%NY0), "interior starting j not match")
ref = ArrayReference(A)
_ASSERT( size(a,1) == in-i1+1, "size not match")
_ASSERT( size(a,2) == jn-j1+1, "size not match")
call oClients%collective_stage_data(arrdes%collection_id,trim(arrdes%filename),trim(name), &
ref,start=[i1,j1,1], &
global_start=[1,1,1], global_count=[global_dim(1),global_dim(2),size(a,3)])
_RETURN(_SUCCESS)
_RETURN(_SUCCESS)
endif
endif

do l=1,size(a,3)
call MAPL_VarWrite(formatter,name,A(:,:,l),arrdes,lev=l, rc=status)
call MAPL_VarWrite(formatter,name,A(:,:,l), arrdes=arrdes,lev=l, rc=status)
_VERIFY(status)
enddo

Expand All @@ -704,14 +706,14 @@ subroutine MAPL_VarReadNCpar_R4_3d(formatter, name, A, ARRDES, RC)
type (Netcdf4_Fileformatter) , intent(IN ) :: formatter
character(len=*) , intent(IN ) :: name
real(kind=ESMF_KIND_R4) , intent(INOUT) :: A(:,:,:)
type(ArrDescr) , intent(INOUT) :: ARRDES
type(ArrDescr), optional , intent(INOUT) :: ARRDES
integer, optional , intent( OUT) :: RC

integer :: status
integer :: l

do l=1,size(a,3)
call MAPL_VarRead(formatter,name,A(:,:,l),arrdes,lev=l, rc=status)
call MAPL_VarRead(formatter,name,A(:,:,l), arrdes=arrdes, lev=l, rc=status)
_VERIFY(status)
enddo

Expand Down
3 changes: 2 additions & 1 deletion base/cub2latlon_regridder.F90
Original file line number Diff line number Diff line change
Expand Up @@ -1186,7 +1186,6 @@ end module SupportMod
! throw an exception and RETURN.

! The main program. Misleadingly simple.
#undef MAPL_ErrLog_DONE
#define I_AM_MAIN
#include "MAPL_Generic.h"
program main
Expand Down Expand Up @@ -1253,6 +1252,8 @@ program main
contains


#undef I_AM_MAIN
#include "MAPL_Generic.h"

subroutine check_resources(rc)
use SupportMod
Expand Down
1 change: 0 additions & 1 deletion base/tests/mapl_bundleio_test.F90
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,6 @@ end module BundleTestSupport
! This is how you can "reset" the MAPL_Generic.h verify bits for a program.
! Program must be at the end of the file to do this and everything else in a module

#undef MAPL_ErrLog_DONE
#define I_AM_MAIN
#include "MAPL_Generic.h"

Expand Down
Loading

0 comments on commit 6135a39

Please sign in to comment.