HCJung-jbnu / Autocoding

0 stars 0 forks source link

인라인 적용을 위한 UM 소스 코드 수정 사항 #1

Closed HyunChaeJung closed 1 year ago

HyunChaeJung commented 1 year ago

atmos_physics1.F90 인라인 버전 코드 수정 사항

  1. 
    # 수정 전
    MODULE atmos_physics1_mod

수정 후

MODULE final_inlined_atmos_physics1_mod

---
2. 
```fortran
# 수정 전
USE !$ omp_lib

# 수정 후
!$ USE omp_lib

# 수정을 적용한 서브루틴
SUBROUTINE gw_ussp
SUBROUTINE microphys_ctl
SUBROUTINE rad_ctl

3.

# 수정 전
USE autotune_mod, ONLY:

# 수정 후
#if !defined(LFRIC)
USE autotune_mod, ONLY:        &
    autotune_type,             &
    autotune_init,             &
    autotune_entry,            &
    autotune_return,           &
    autotune_start_region,     &
    autotune_end_region

# 수정을 적용한 서브루틴
SUBROUTINE gw_ussp

4.

# 수정 전
                             real_shear, rhcpt_horiz_var, i_cld_pc2

# 수정 후
USE pc2_constants_mod, ONLY: real_shear, rhcpt_horiz_var, i_cld_pc2

# 수정을 적용한 서브루틴
SUBROUTINE atmos_physics1

5.

# 수정 전
                            model_type, mt_global, mt_single_column

# 수정 후
USE model_domain_mod, ONLY: model_type, mt_global, mt_single_column

# 수정을 적용한 서브루틴
SUBROUTINE open_cloud_gen
SUBROUTINE rad_ctl

6.

# 해당 서브루틴이 2번 삽입되는 문제
SUBROUTINE uv_p_pnts_halo 

7.

# 수정 전
                    init_diag_logic, allocate_diag, deallocate_diag

# 수정 후
USE def_diag, ONLY: init_diag_logic, allocate_diag, deallocate_diag

# 수정을 적용한 서브루틴
SUBROUTINE rad_ctl

8.

# 수정 전
!    SUBROUTINE FLUX_DIAG----------------------------------------------
!
!    PURPOSE : PART OF ENERGY CORRECTION SUITE OF ROUTINES
!              TO SUM FLUXES INTO THE ATMOSPHERE
!              Note global summation now done elsewhere at end of
!              energy correction period to save CPU.
!
USE !    NOT SUITABLE FOR SINGLE COLUMN MODEL
USE planet_constants_mod, ONLY: planet_radius
USE yomhook, ONLY: lhook, dr_hook
USE parkind1, ONLY: jprb, jpim

# 수정 후
USE planet_constants_mod, ONLY: planet_radius
USE yomhook, ONLY: lhook, dr_hook
USE parkind1, ONLY: jprb, jpim

# 수정을 적용한 서브루틴
SUBROUTINE flux_diag

9.

# 수정 전
                                l_planet_g, g, cp, r, rv, c_virtual

# 수정 후
USE planet_constants_mod, ONLY: l_planet_g, g, cp, r, rv, c_virtual

# 수정을 적용한 서브루틴
SUBROUTINE set_thermodynamic

10.

# 수정 전
USE level_heights_mod, ONLY: r_theta_levels,

# 수정 후
USE level_heights_mod, ONLY: r_theta_levels, r_rho_levels

# 수정을 적용한 서브루틴
SUBROUTINE g_wave_4a
SUBROUTINE g_wave_5a
SUBROUTINE check_dmoist_inc
SUBROUTINE NI_gwd_ctl

11.

# 수정 전
USE astro_constants_mod, ONLY: a, b, c, d, date_ve_dflt, e_dflt, f,            &
                               g, gn_prcs_cnst, h, lin_rate_gn_prcs,           &
                               lph_dflt, m, n_term_ecn_lph,                    &
                               n_term_gn_prcs, n_term_obq, oblq_cnst, oblq_dflt, &
                               r, tau0_dflt, year_ref, year_ref_ve,            &
IMPLICIT NONE

# 수정 후
USE astro_constants_mod, ONLY: a, b, c, d, date_ve_dflt, e_dflt, f,            &
                               g, gn_prcs_cnst, h, lin_rate_gn_prcs,           &
                               lph_dflt, m, n_term_ecn_lph,                    &
                               n_term_gn_prcs, n_term_obq, oblq_cnst, oblq_dflt, &
                               r, tau0_dflt, year_ref, year_ref_ve,            &
                               tropyearlength
IMPLICIT NONE

# 수정을 적용한 서브루틴
SUBROUTINE orbprm

12.

# 수정 전
USE parkind1, ONLY: jprb, jpim
IMPLICIT NONE

# 수정 후
USE parkind1, ONLY: jprb, jpim
USE yomhook, ONLY: lhook, dr_hook
IMPLICIT NONE

# 수정을 적용한 서브루틴
SUBROUTINE solang_sph

  1. 
    # 수정 전
    END MODULE atmos_physics1_mod

수정 후

END MODULE final_inlined_atmos_physics1_mod

HyunChaeJung commented 1 year ago

디버깅 해야 할 사항 (USE, ONLY 문을 컨트롤 하는 코드 - delete_use.py)

  1. USE문 사이에 #if defined() 가 존재할 경우, 해당 지시문을 제거하는 버그
  2. '!$ USE omp_lib' 이 'USE !$ omp_lib' 으로 삽입되는 버그
  3. USE, ONLY 문 중 USE 부분이 삽입되지 않는 버그
  4. USE, ONLY 문 중 ONLY 의 마지막 인자가 삽입되지 않는 버그
  5. 주석에 USE 라는 단어가 포함되어 있을 경우, USE 문으로 인식하는 버그
  6. USE, ONLY 문 전체가 삽입되지 않는 버그
HyunChaeJung commented 1 year ago

eg_sl_full_wind.F90 인라인 버전 코드 수정 사항

  1. 
    # 수정 전
    MODULE eg_sl_full_wind_mod

수정 후

MODULE final_inlined_eg_sl_full_wind_mod

---
2.
```fortran
# 수정 전
END MODULE eg_sl_full_wind_mod

# 수정 후
END MODULE final_inlined_eg_sl_full_wind_mod
HyunChaeJung commented 1 year ago

eg_v_at_poles.F90 수정 사항

if !defined(RECON)

USE global_2d_sums_mod, ONLY: & global_2d_sums

IMPLICIT NONE CHARACTER(LEN=*), PARAMETER, PRIVATE :: ModuleName = 'EG_V_AT_POLES_MOD'

CONTAINS SUBROUTINE eg_v_at_poles(u,v, pole_sgn_flip, & jj_u_pole, jj_v_pole, udim_in,vdim_in,u_pole_v,u_pole_u, & v_pole_out,xi1_pole_out)

USE parkind1, ONLY: jpim, jprb !DrHook USE yomhook, ONLY: lhook, dr_hook !DrHook

...

IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle) RETURN END SUBROUTINE eg_v_at_poles

SUBROUTINE eg_uv_at_poles_Bgrid & (u, row_length, rows, n_rows, & offx, offy, pole_consts, pole_sgn_flip, & j_pole_src, j_pole_dest, v)

...

END SUBROUTINE eg_uv_at_poles_Bgrid

else

IMPLICIT NONE

TYPE array_dims INTEGER :: i_start =-HUGE(INT(1)) INTEGER :: i_end = HUGE(INT(1)) INTEGER :: j_start =-HUGE(INT(1)) INTEGER :: j_end = HUGE(INT(1)) INTEGER :: k_start =-HUGE(INT(1)) INTEGER :: k_end = HUGE(INT(1)) INTEGER :: halo_i = HUGE(INT(1)) INTEGER :: halo_j = HUGE(INT(1)) END TYPE array_dims

CONTAINS SUBROUTINE eg_v_at_poles(u,v,xi1_u, xi1_p, xi2_p, pole_sgn_flip, & jj_u_pole, jj_v_pole, udim_in,vdim_in) USE conversions_mod, ONLY: pi

...

END SUBROUTINE eg_v_at_poles

endif

END MODULE eg_v_at_poles_mod

---
- 수정 후
```fortran
MODULE eg_v_at_poles_mod

IMPLICIT NONE
CHARACTER(LEN=*), PARAMETER, PRIVATE :: ModuleName = 'EG_V_AT_POLES_MOD'

CONTAINS
SUBROUTINE eg_v_at_poles &
#if !defined(RECON)
                        (u,v, pole_sgn_flip,                                 &
                   jj_u_pole, jj_v_pole, udim_in,vdim_in,u_pole_v,u_pole_u,  &
                   v_pole_out,xi1_pole_out)

USE global_2d_sums_mod, ONLY: global_2d_sums
USE parkind1, ONLY: jpim, jprb       !DrHook
USE yomhook,  ONLY: lhook, dr_hook   !DrHook

...

END DO
!$OMP END PARALLEL DO

#else
                             (u,v,xi1_u, xi1_p, xi2_p, pole_sgn_flip,      &
                             jj_u_pole, jj_v_pole, udim_in,vdim_in)

TYPE array_dims
  INTEGER :: i_start =-HUGE(INT(1))
  INTEGER :: i_end   = HUGE(INT(1))
  INTEGER :: j_start =-HUGE(INT(1))
  INTEGER :: j_end   = HUGE(INT(1))
  INTEGER :: k_start =-HUGE(INT(1))
  INTEGER :: k_end   = HUGE(INT(1))
  INTEGER :: halo_i  = HUGE(INT(1))
  INTEGER :: halo_j  = HUGE(INT(1))
END TYPE array_dims

...

END DO
#endif

IF (lhook) CALL dr_hook('EG_V_AT_POLES_MOD_inline'//':'//RoutineName,zhook_out,zhook_handle)
RETURN
END SUBROUTINE eg_v_at_poles

#if !defined(RECON)
SUBROUTINE eg_uv_at_poles_Bgrid &
...
END SUBROUTINE eg_uv_at_poles_Bgrid
#endif

END MODULE eg_v_at_poles_mod