Skip to content
Open
Show file tree
Hide file tree
Changes from 3 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
29 changes: 11 additions & 18 deletions .github/workflows/fortran-formatting.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ on:
types: [opened, synchronize, labeled, unlabeled]

env:
CODEE_VERSION: 2025.4.5
CODEE_VERSION: 2025.4.8

# Only needed when fixing formatting automatically, but this only
# works for pull requests from the same repo, not from a fork
Expand All @@ -16,7 +16,7 @@ env:

jobs:
format:
name: Check and fix Fortran formatting
name: Check Fortran formatting
runs-on: ubuntu-22.04

steps:
Expand All @@ -25,32 +25,25 @@ jobs:
with:
fetch-depth: 0

- name: Get modified Fortran files
- name: Check formatting of modified Fortran files
run: |
git remote -v show
git fetch origin ${{ github.base_ref }}
MODIFIED_FILES=$(git diff --name-only --diff-filter=d origin/${{ github.base_ref }}...HEAD -- '*.f90' '*.F90' '*.f' '*.F')
echo "MODIFIED_FILES=${MODIFIED_FILES}" >> ${GITHUB_ENV}

- name: Install Codee
if: env.MODIFIED_FILES != ''
run: |
if [[ "${MODIFIED_FILES}" == "" ]]; then
exit 0
fi
#
echo "Installing Codee ${CODEE_VERSION} ..."
wget https://codee.com/release/codee-${CODEE_VERSION}-linux-x86_64.tar.gz
tar -xf codee-${CODEE_VERSION}-linux-x86_64.tar.gz

- name: Run `codee format` on modified files
if: env.MODIFIED_FILES != ''
run: |
export PATH="${PWD}/codee-${CODEE_VERSION}-linux-x86_64/bin:${PATH}"
#
codee format --accept-eula --verbose ${MODIFIED_FILES}
REFORMATTED_FILES=$(git diff --name-only --diff-filter=d)
echo "REFORMATTED_FILES=${REFORMATTED_FILES}" >> ${GITHUB_ENV}

- name: Fail if there are uncommitted changes
if: ${{ env.REFORMATTED_FILES != '' }}
run: |
if [[ "${REFORMATTED_FILES}" == "" ]]; then
exit 0
fi
echo "Formatting issues detected. Run 'codee format' locally or apply the following diff manually:"
git diff
exit 1

19 changes: 18 additions & 1 deletion test/capgen_test/CMakeLists.txt
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is slick!

Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,25 @@ add_library(CAPGEN_TESTLIB OBJECT ${SCHEME_FORTRAN_FILES}

# Setup test executable with needed dependencies
add_executable(capgen_host_integration test_capgen_host_integration.F90 ${HOST}.F90)
if(OPENMP)
target_link_libraries(capgen_host_integration PRIVATE OpenMP::OpenMP_Fortran)
endif()
target_link_libraries(capgen_host_integration PRIVATE CAPGEN_TESTLIB test_utils)
target_include_directories(capgen_host_integration PRIVATE "$<TARGET_PROPERTY:test_utils,BINARY_DIR>")

# Add executable to be called with ctest
add_test(NAME ctest_capgen_host_integration COMMAND capgen_host_integration)
add_test(NAME ctest_capgen_host_integration_omp1
COMMAND capgen_host_integration)

add_test(NAME ctest_capgen_host_integration_omp2
COMMAND capgen_host_integration)

set_tests_properties(ctest_capgen_host_integration_omp1
PROPERTIES
ENVIRONMENT "OMP_NUM_THREADS=1"
)

set_tests_properties(ctest_capgen_host_integration_omp2
PROPERTIES
ENVIRONMENT "OMP_NUM_THREADS=2"
)
12 changes: 6 additions & 6 deletions test/capgen_test/ddt2.F90
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
module ddt2

USE ccpp_kinds, ONLY: kind_phys
use ccpp_kinds, only: kind_phys

implicit none
implicit none

type ty_ddt2
integer :: foo
real(kind_phys) :: bar
end type ty_ddt2
type ty_ddt2
integer :: foo
real(kind=kind_phys) :: bar
end type ty_ddt2

end module ddt2
279 changes: 139 additions & 140 deletions test/capgen_test/make_ddt.F90
Original file line number Diff line number Diff line change
@@ -1,143 +1,142 @@
!Hello demonstration parameterization
!

MODULE make_ddt

USE ccpp_kinds, ONLY: kind_phys
USE ddt2, only: ty_ddt2

IMPLICIT NONE
PRIVATE

PUBLIC :: make_ddt_init
PUBLIC :: make_ddt_run
PUBLIC :: make_ddt_timestep_final
PUBLIC :: vmr_type

type ty_ddt3
integer :: dont_lose
integer :: your_head
integer :: to_gain_a_minute
integer :: you_need_your_head
integer :: your_brains_are_in_it
end type ty_ddt3

!> \section arg_table_vmr_type Argument Table
!! \htmlinclude arg_table_vmr_type.html
!!
type vmr_type
integer :: nvmr
real(kind_phys), allocatable :: vmr_array(:,:)
type(ty_ddt2) :: error_maybe
type(ty_ddt3) :: burma_shave
end type vmr_type


CONTAINS

!> \section arg_table_make_ddt_run Argument Table
!! \htmlinclude arg_table_make_ddt_run.html
!!
SUBROUTINE make_ddt_run(cols, cole, O3, HNO3, vmr, errmsg, errflg)
!----------------------------------------------------------------
IMPLICIT NONE
!----------------------------------------------------------------

! Dummy arguments
integer, intent(in) :: cols
integer, intent(in) :: cole
REAL(kind_phys), intent(in) :: O3(:)
REAL(kind_phys), intent(in) :: HNO3(:)
type(vmr_type), intent(inout) :: vmr
character(len=512), intent(out) :: errmsg
integer, intent(out) :: errflg
! Local variable
integer :: nbox
!----------------------------------------------------------------

errmsg = ''
errflg = 0

! Check for correct threading behavior
nbox = cole - cols + 1
if (SIZE(O3) /= nbox) then
errflg = 1
write(errmsg, '(2(a,i0))') 'SIZE(O3) = ', SIZE(O3), ', should be ', nbox
else if (SIZE(HNO3) /= nbox) then
errflg = 1
write(errmsg, '(2(a,i0))') 'SIZE(HNO3) = ', SIZE(HNO3), &
', should be ', nbox
else
! NOTE -- This is prototyping one approach to passing a large number of
! chemical VMR values and is the predecssor for adding in methods and
! maybe nesting DDTs (especially for aerosols)
vmr%vmr_array(cols:cole, 1) = O3(:)
vmr%vmr_array(cols:cole, 2) = HNO3(:)
end if

END SUBROUTINE make_ddt_run

!> \section arg_table_make_ddt_init Argument Table
!! \htmlinclude arg_table_make_ddt_init.html
!!
subroutine make_ddt_init(nbox, vmr, errmsg, errflg)

! Dummy arguments
integer, intent(in) :: nbox
type(vmr_type), intent(out) :: vmr
character(len=512), intent(out) :: errmsg
integer, intent(out) :: errflg

! This routine initializes the vmr array
vmr%nvmr = 2
allocate(vmr%vmr_array(nbox, vmr%nvmr))

errmsg = ''
errflg = 0

end subroutine make_ddt_init

!> \section arg_table_make_ddt_timestep_final Argument Table
!! \htmlinclude arg_table_make_ddt_timestep_final.html
!!
subroutine make_ddt_timestep_final (ncols, vmr, errmsg, errflg)

! Dummy arguments
integer, intent(in) :: ncols
type(vmr_type), intent(in) :: vmr
character(len=512), intent(out) :: errmsg
integer, intent(out) :: errflg
! Local variables
integer :: index
real(kind_phys) :: rind

errmsg = ''
errflg = 0

! This routine checks the array values in vmr
if (SIZE(vmr%vmr_array, 1) /= ncols) then
errflg = 1
write(errmsg, '(2(a,i0))') 'VMR%VMR_ARRAY first dimension size is, ', &
SIZE(vmr%vmr_array, 1), ', should be, ', ncols
else
do index = 1, ncols
rind = real(index, kind_phys)
if (vmr%vmr_array(index, 1) /= rind * 1.e-6_kind_phys) then
errflg = 1
write(errmsg, '(a,i0,2(a,e12.4))') 'O3(', index, ') = ', &
vmr%vmr_array(index, 1), ', should be, ', &
rind * 1.e-6_kind_phys
exit
else if (vmr%vmr_array(index, 2) /= rind * 1.e-9_kind_phys) then
errflg = 1
write(errmsg, '(a,i0,2(a,e12.4))') 'HNO3(', index, ') = ', &
vmr%vmr_array(index, 2), ', should be, ', &
rind * 1.e-9_kind_phys
exit
end if
end do
end if

end subroutine make_ddt_timestep_final

END MODULE make_ddt
module make_ddt

use ccpp_kinds, only: kind_phys
use ddt2, only: ty_ddt2

implicit none
private

public :: make_ddt_init
public :: make_ddt_run
public :: make_ddt_timestep_final
public :: vmr_type

type ty_ddt3
integer :: dont_lose
integer :: your_head
integer :: to_gain_a_minute
integer :: you_need_your_head
integer :: your_brains_are_in_it
end type ty_ddt3

!> \section arg_table_vmr_type Argument Table
!! \htmlinclude arg_table_vmr_type.html
!!
type vmr_type
integer :: nvmr
real(kind=kind_phys), allocatable :: vmr_array(:, :)
type(ty_ddt2) :: error_maybe
type(ty_ddt3) :: burma_shave
end type vmr_type

contains

!> \section arg_table_make_ddt_run Argument Table
!! \htmlinclude arg_table_make_ddt_run.html
!!
subroutine make_ddt_run(cols, cole, o3, hno3, vmr, errmsg, errflg)
!----------------------------------------------------------------
implicit none
!----------------------------------------------------------------

! Dummy arguments
integer, intent(in) :: cols
integer, intent(in) :: cole
real(kind=kind_phys), intent(in) :: o3(:)
real(kind=kind_phys), intent(in) :: hno3(:)
type(vmr_type), intent(inout) :: vmr
character(len=512), intent(out) :: errmsg
integer, intent(out) :: errflg
! Local variable
integer :: nbox
!----------------------------------------------------------------

errmsg = ''
errflg = 0

! Check for correct threading behavior
nbox = cole - cols + 1
if (size(o3) /= nbox) then
errflg = 1
write(errmsg, '(2(a,i0))') 'SIZE(O3) = ', size(o3), ', should be ', nbox
else if (size(hno3) /= nbox) then
errflg = 1
write(errmsg, '(2(a,i0))') 'SIZE(HNO3) = ', size(hno3), &
', should be ', nbox
else
! NOTE -- This is prototyping one approach to passing a large number of
! chemical VMR values and is the predecssor for adding in methods and
! maybe nesting DDTs (especially for aerosols)
vmr%vmr_array(cols:cole, 1) = o3(:)
vmr%vmr_array(cols:cole, 2) = hno3(:)
end if

end subroutine make_ddt_run

!> \section arg_table_make_ddt_init Argument Table
!! \htmlinclude arg_table_make_ddt_init.html
!!
subroutine make_ddt_init(nbox, vmr, errmsg, errflg)

! Dummy arguments
integer, intent(in) :: nbox
type(vmr_type), intent(out) :: vmr
character(len=512), intent(out) :: errmsg
integer, intent(out) :: errflg

! This routine initializes the vmr array
vmr%nvmr = 2
allocate(vmr%vmr_array(nbox, vmr%nvmr))

errmsg = ''
errflg = 0

end subroutine make_ddt_init

!> \section arg_table_make_ddt_timestep_final Argument Table
!! \htmlinclude arg_table_make_ddt_timestep_final.html
!!
subroutine make_ddt_timestep_final(ncols, vmr, errmsg, errflg)

! Dummy arguments
integer, intent(in) :: ncols
type(vmr_type), intent(in) :: vmr
character(len=512), intent(out) :: errmsg
integer, intent(out) :: errflg
! Local variables
integer :: index
real(kind=kind_phys) :: rind

errmsg = ''
errflg = 0

! This routine checks the array values in vmr
if (size(vmr%vmr_array, 1) /= ncols) then
errflg = 1
write(errmsg, '(2(a,i0))') 'VMR%VMR_ARRAY first dimension size is, ', &
size(vmr%vmr_array, 1), ', should be, ', ncols
else
do index = 1, ncols
rind = real(index, kind_phys)
if (vmr%vmr_array(index, 1) /= rind * 1.e-6_kind_phys) then
errflg = 1
write(errmsg, '(a,i0,2(a,e12.4))') 'O3(', index, ') = ', &
vmr%vmr_array(index, 1), ', should be, ', &
rind * 1.e-6_kind_phys
exit
else if (vmr%vmr_array(index, 2) /= rind * 1.e-9_kind_phys) then
errflg = 1
write(errmsg, '(a,i0,2(a,e12.4))') 'HNO3(', index, ') = ', &
vmr%vmr_array(index, 2), ', should be, ', &
rind * 1.e-9_kind_phys
exit
end if
end do
end if

end subroutine make_ddt_timestep_final

end module make_ddt
Loading