Skip to content

CCPP Framework Meeting Minutes 2019 01 17

goldy edited this page Mar 9, 2020 · 4 revisions

Issues with blocking/no-blocking:

  • blocked data/non-blocked data versus parameterizations that expect blocked data/non-blocked data in the different stages (init, run) of the model
  • need a portable solution that works for all combinations, suggested interface at the end of these minutes works for 3 out of the 4 cases
  • it doesn't work for blocked data and physics expecting the entire field as non-blocked data (for example for computing global sums), in all other cases the easiest solution would be to loop over all blocks and call the scheme
  • getting the FV3 time vary step to work with the suggestion below is something Steve and Dom will try next week, as this would be a good test of the suggested approach

Dom's static build w/o using cdata:

  • parallel work using current prebuild system to avoid using the cdata lookup table
  • how to deal with ccpp_loop_cnt, ccpp_error_message, ccpp_error_flag?
  • Steve's approach is different from Dom's, let's try to compare and consolidate

Action items:

  • Dom to create a testing system for NEMSfv3gfs (and SCM?) on Cheyenne and provide instructions on the wiki; the testing system should work off branches in forks, not off PRs
  • Steve to create a PR of his current work (even though not finished) so that people can start looking at it

Proposal to provide a portable interface for 'blocked' host model data

Current ccpp_capgen host model interface

   subroutine CAM_ccpp_physics_initialize(suite_name)
   
      character(len=*),   intent(in)    :: suite_name

      call ccpp_physics_initialize(suite_name, pcols, pver, pverp, begchunk,   &
           endchunk, pcnst, ix_qv, ix_qc, ix_qr, CPDAIR, RGAS, LATVAP, PSTD,   &
           RHOFW, lblk, state, tend, timestep, errmsg, errflg)
   
   end subroutine CAM_ccpp_physics_initialize

Proposed ccpp_capgen host model interface

   use <module>, only: <thread_block_begin>
   use <module>, only: <thread_block_end>
   private
   type :: ccpp_field_ptr_2d_kind_phys_t
      real(kind_phys), pointer :: field(:,:)
   end type ccpp_field_ptr_2d_kind_phys_t

   type(ccpp_field_ptr_2d_kind_phys_t), allocatable :: ccpp_state_u(:)
   type(ccpp_field_ptr_2d_kind_phys_t), allocatable :: ccpp_state_v(:)
   type(ccpp_field_ptr_2d_kind_phys_t), allocatable :: ccpp_state_t(:)

contains

   subroutine CAM_ccpp_physics_initialize(suite_name)
   
      character(len=*),   intent(in)    :: suite_name

      integer :: ccpp_alloc_loop1

      allocate(ccpp_state_u(<thread_block_begin>:<thread_block_end>))
      allocate(ccpp_state_v(<thread_block_begin>:<thread_block_end>))
      allocate(ccpp_state_t(<thread_block_begin>:<thread_block_end>))
      do ccpp_alloc_loop1 = <thread_block_begin>, <thread_block_end>
         ccpp_state_u(ccpp_alloc_loop1) = state(ccpp_alloc_loop1)%u
         ccpp_state_v(ccpp_alloc_loop1) = state(ccpp_alloc_loop1)%v
         ccpp_state_t(ccpp_alloc_loop1) = state(ccpp_alloc_loop1)%t
      end do

      call ccpp_physics_initialize(suite_name, pcols, pver, pverp, begchunk,   &
           endchunk, pcnst, ix_qv, ix_qc, ix_qr, CPDAIR, RGAS, LATVAP, PSTD,   &
           RHOFW, lblk, ccpp_state_u, ccpp_state_v, ccpp_state_t, tend, timestep, errmsg, errflg)
   
   end subroutine CAM_ccpp_physics_initialize
Clone this wiki locally