Skip to content

Commit

Permalink
CMake updates for AQM to allow build in UFSWM.
Browse files Browse the repository at this point in the history
  • Loading branch information
BrianCurtis-NOAA authored Apr 4, 2022
2 parents 91c87e8 + 5bd2e8f commit 79ff7a9
Show file tree
Hide file tree
Showing 3 changed files with 362 additions and 26 deletions.
151 changes: 127 additions & 24 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,30 +16,133 @@ if (isSubproject)
endif ()
endif ()

# Run configure/make as external project
include (ExternalProject)
if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU")
set(CMAKE_Fortran_FLAGS "-ffree-line-length-none -ffixed-line-length-none")
elseif(CMAKE_Fortran_COMPILER_ID MATCHES "Intel")
set(CMAKE_Fortran_FLAGS "-extend-source 132")
else()
message(WARNING "Fortran compiler with ID ${CMAKE_Fortran_COMPILER_ID} will be used with CMake default options")
endif()

# set install directory
set (aqm_dir ${CMAKE_CURRENT_BINARY_DIR}/aqm)
include("aqm_files.cmake")

# add configure flag for debug build type
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
set (configure_options "--enable-debug")
endif ()
# src/shr
add_library(shr OBJECT ${aqm_shr_files})
#add_dependencies(shr drv aqmio ioapi CCTM)
set_target_properties(shr PROPERTIES Fortran_MODULE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/mod)
target_include_directories(shr PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/mod>)
target_include_directories(shr PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/model/CMAQ/CCTM/src/ICL/fixed/filenames>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/model/CMAQ/CCTM/src/ICL/fixed/const>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/src/io/ioapi>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/src/io/aqmio>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/src/model>)
target_compile_definitions(shr PUBLIC SUBST_CONST="CONST.EXT"
SUBST_FILES_ID="FILES_CTM.EXT")
#target_link_libraries(shr PRIVATE drv aqmio ioapi CCTM)
target_link_libraries(shr PRIVATE esmf)

# src/drv
add_library(drv OBJECT ${aqm_drv_files})
#add_dependencies(drv shr CCTM aqmio ioapi)
add_dependencies(drv shr)
set_target_properties(drv PROPERTIES Fortran_MODULE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/mod)
target_include_directories(drv PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/mod>)
target_include_directories(drv PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/src/shr>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/src/io/ioapi>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/src/io/aqmio>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/src/model>)
target_compile_definitions(drv PUBLIC verbose_driver)
target_link_libraries(drv PRIVATE shr, CCTM)
target_link_libraries(drv PRIVATE esmf)

# src/io/aqmio
add_library(aqmio OBJECT ${aqm_aqmio_files})
set_target_properties(aqmio PROPERTIES Fortran_MODULE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/mod)
target_include_directories(aqmio PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/mod>)
target_link_libraries(aqmio PRIVATE esmf)

# src/io/ioapi
add_library(ioapi OBJECT ${aqm_ioapi_files})
set_target_properties(ioapi PROPERTIES Fortran_MODULE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/mod)
target_include_directories(ioapi PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/mod>)
target_include_directories(ioapi PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/model/CMAQ/CCTM/src/ICL/fixed/filenames>)
target_compile_definitions(ioapi PUBLIC SUBST_FILES_ID="FILES_CTM.EXT")
target_link_libraries(ioapi PRIVATE esmf)

# src/model
add_library(CCTM OBJECT ${aqm_CCTM_files})
#add_dependencies(CCTM shr aqmio ioapi)
set_target_properties(CCTM PROPERTIES Fortran_MODULE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/mod)
target_include_directories(CCTM PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/mod>)
target_include_directories(CCTM PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/model/CMAQ/CCTM/src/ICL/fixed/filenames>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/model/CMAQ/CCTM/src/ICL/fixed/const>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/model/CMAQ/CCTM/src/ICL/fixed/emctrl>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/model/CMAQ/CCTM/src/ICL/fixed/mpi>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/src/shr>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/src/io/ioapi>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/src/io/aqmio>)
target_compile_definitions(CCTM PUBLIC SUBST_FILES_ID="FILES_CTM.EXT"
SUBST_CONST="CONST.EXT"
SUBST_EMISPRM="EMISPRM.EXT"
SUBST_PE_COMM="PE_COMM.EXT"
SUBST_COMM=NOOP_COMM
SUBST_BARRIER=NOOP_BARRIER
SUBST_SUBGRID_INDEX=NOOP_SUBGRID_INDEX
MOSAIC_MOD=MOSAIC_MODULE
Mosaic_Mod=Mosaic_Module
EDDYX=DUMMY_EDDYX
OPCONC=DUMMY_OPCONC
OPACONC=DUMMY_OPACONC
OPWDEP=DUMMY_OPWDEP
WR_INIT=DUMMY_WR_INIT
verbose_aero
verbose_gas
mpas
_AQM_)
#target_link_libraries(CCTM PRIVATE shr aqmio ioapi)
ADD_CUSTOM_TARGET(link_target ALL
COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CURRENT_BINARY_DIR}/mod/mosaic_module.mod
${CMAKE_CURRENT_BINARY_DIR}/mod/mosaic_mod.mod)
target_link_libraries(CCTM PRIVATE esmf)

# AQM
add_library(aqm STATIC ${aqm_files} $<TARGET_OBJECTS:shr>
$<TARGET_OBJECTS:drv>
$<TARGET_OBJECTS:aqmio>
$<TARGET_OBJECTS:ioapi>
$<TARGET_OBJECTS:CCTM>)
set_target_properties(aqm PROPERTIES Fortran_MODULE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/mod)
add_library(aqm::aqm ALIAS aqm)
target_include_directories(aqm PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/mod>
$<INSTALL_INTERFACE:mod>)
target_link_libraries(aqm PUBLIC esmf NetCDF::NetCDF_Fortran)
list(APPEND LIB_TARGETS aqm)

###############################################################################
### Install
###############################################################################

install(
TARGETS ${LIB_TARGETS}
EXPORT AQMExports
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
COMPONENT Library)

export(EXPORT AQMExports
NAMESPACE aqm::
FILE aqm-targets.cmake)

install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/mod DESTINATION ${CMAKE_INSTALL_PREFIX}/AQM)

install(EXPORT AQMExports
NAMESPACE aqm::
FILE aqm-targets.cmake
DESTINATION lib/cmake)

ExternalProject_Add (aqm_gnu
PREFIX aqm
DOWNLOAD_COMMAND ""
CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/configure
--prefix=${aqm_dir} --libdir=${aqm_dir} --includedir=${aqm_dir}
FC=${CMAKE_Fortran_COMPILER} F77=${CMAKE_Fortran_COMPILER} CC=${CMAKE_C_COMPILER}
${configure_options}
BUILD_ALWAYS True
)

# create target
add_library(aqm STATIC IMPORTED GLOBAL)
set_property(TARGET aqm PROPERTY IMPORTED_LOCATION ${aqm_dir}/libaqm.a)
add_dependencies(aqm aqm_gnu)
target_include_directories(aqm INTERFACE ${aqm_dir})
target_link_libraries(aqm INTERFACE esmf NetCDF::NetCDF_Fortran)
# # create target
# add_library(aqm OBJECT ${aqm_files})
# set_property(TARGET aqm PROPERTY IMPORTED_LOCATION ${aqm_dir}/libaqm.a)
# add_dependencies(aqm aqm_gnu)
# target_include_directories(aqm INTERFACE ${aqm_dir})
# target_link_libraries(aqm INTERFACE esmf NetCDF::NetCDF_Fortran)
234 changes: 234 additions & 0 deletions aqm_files.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,234 @@
# Author: Brian Curtis
# This list was taken from the file Makefile.am found in subdirectories

list(APPEND aqm_files
src/aqm_cap.F90
src/aqm_comp_mod.F90
)

list(APPEND aqm_shr_files
src/shr/aqm_config_mod.F90
src/shr/aqm_const_mod.F90
src/shr/aqm_domain_mod.F90
src/shr/aqm_emis_mod.F90
src/shr/aqm_fires_mod.F90
src/shr/aqm_internal_mod.F90
src/shr/aqm_model_mod.F90
src/shr/aqm_rc_mod.F90
src/shr/aqm_methods.F90
src/shr/aqm_species_mod.F90
src/shr/aqm_state_mod.F90
src/shr/aqm_tools_mod.F90
src/shr/aqm_types_mod.F90
)

list(APPEND aqm_drv_files
src/drv/cmaq_model_mod.F90
src/drv/cmaq_mod.F90
)

list(APPEND aqm_aqmio_files
src/io/aqmio/aqmio.F90
)

list(APPEND aqm_ioapi_files
src/io/ioapi/FDESC3.EXT
src/io/ioapi/PARMS3.EXT
src/io/ioapi/crlf.F
src/io/ioapi/currec.f
src/io/ioapi/currstep.f
src/io/ioapi/dt2str.f
src/io/ioapi/findc.f
src/io/ioapi/getefile.F
src/io/ioapi/index1.f
src/io/ioapi/julian.F
src/io/ioapi/junit.F
src/io/ioapi/hhmmss.f
src/io/ioapi/mmddyy.F
src/io/ioapi/nextime.F
src/io/ioapi/poly.f
src/io/ioapi/promptmfile.f
src/io/ioapi/sec2time.f
src/io/ioapi/secsdiff.F
src/io/ioapi/setlam.f
src/io/ioapi/sortic.f
src/io/ioapi/str2real.f
src/io/ioapi/time2sec.f
src/io/ioapi/upcase.f
src/io/ioapi/wkday.F
src/io/ioapi/yr2day.F
src/io/ioapi/m3exit.F90
src/io/ioapi/m3mesg.F90
src/io/ioapi/m3msg2.F90
src/io/ioapi/m3warn.F90
src/io/ioapi/m3utilio.F90
)

set(CCTM_ROOT "src/model/CMAQ/CCTM/src")
set(AERO "${CCTM_ROOT}/aero/aero6")
set(BIOG "${CCTM_ROOT}/biog/beis3")
set(CLOUD "${CCTM_ROOT}/cloud/acm_ae6")
set(DEPV "${CCTM_ROOT}/depv/m3dry")
set(EMIS "${CCTM_ROOT}/emis/emis")
set(GAS "${CCTM_ROOT}/gas/ebi_cb6r3_ae6_aq")
set(GRID "${CCTM_ROOT}/grid/cartesian")
set(ICL "${CCTM_ROOT}/ICL/fixed")
set(INIT "${CCTM_ROOT}/init/yamo")
set(MECHS "${CCTM_ROOT}/MECHS/cb6r3_ae6_aq")
set(PA "${CCTM_ROOT}/procan/pa")
set(PHOT "${CCTM_ROOT}/phot/inline")
set(PLRISE "${CCTM_ROOT}/plrise/smoke")
set(SPCS "${CCTM_ROOT}/spcs/cgrid_spcs_nml")
set(STENEX "${CCTM_ROOT}/STENEX/noop")
set(UTIL "${CCTM_ROOT}/util/util")
set(VDIFF "${CCTM_ROOT}/vdiff/acm2")
set(localCCTM "src/model/src")
list(APPEND aqm_CCTM_files
${AERO}/AERO_DATA.F
${AERO}/aero_depv.F
${AERO}/aero_driver.F
${AERO}/AERO_EMIS.F
${AERO}/AEROMET_DATA.F
${AERO}/AEROSOL_CHEMISTRY.F
${AERO}/aero_subs.F
${AERO}/AOD_DEFN.F
${AERO}/coags.f
${AERO}/getpar.f
${AERO}/isocom.f
${AERO}/isofwd.f
${AERO}/isorev.f
${AERO}/isrpia.inc
${AERO}/opvis.F
${AERO}/opavis.F
${AERO}/oppmdiag.F
${AERO}/opapmdiag.F
${AERO}/PRECURSOR_DATA.F
${AERO}/PMDIAG_DATA.F
${AERO}/SOA_DEFN.F
${BIOG}/beis3.F
${BIOG}/checkmem.f
${BIOG}/czangle.F
${BIOG}/getparb.f
${BIOG}/hrno.F
${BIOG}/parsline.f
${BIOG}/tmpbeis.F
${BIOG}/wrdaymsg.f
${CLOUD}/hlconst.F
${DEPV}/ABFLUX_MOD.F
${DEPV}/BIDI_MOD.F
${DEPV}/cgrid_depv.F
${DEPV}/DEPV_DEFN.F
${DEPV}/DEPVVARS.F
${DEPV}/gas_depv_map.F
${DEPV}/HGSIM.F
${DEPV}/LSM_MOD.F
${DEPV}/MOSAIC_MOD.F
${DEPV}/opdepv_diag.F
${DEPV}/opdepv_mos.F
${DEPV}/opdepv_fst.F
${DEPV}/m3dry.F
${EMIS}/BEIS_DEFN.F
${EMIS}/BIOG_EMIS.F
${EMIS}/cropcal.F
${EMIS}/DUST_EMIS.F
${EMIS}/EMIS_DEFN.F
${EMIS}/LTNG_DEFN.F
${EMIS}/LUS_DEFN.F
${EMIS}/MGEMIS.F
${EMIS}/opemis.F
${EMIS}/PTBILIN.F
${EMIS}/SSEMIS.F
${EMIS}/STK_EMIS.F
${EMIS}/STK_PRMS.F
${EMIS}/tfabove.F
${EMIS}/tfbelow.F
${EMIS}/UDTYPES.F
${GAS}/degrade_data.F
${GAS}/degrade.F
${GAS}/DEGRADE_SETUP_TOX.F
${GAS}/final_degrade.F
${GAS}/find_degraded.F
${GAS}/hrdata_mod.F
${GAS}/hrdriver.F
${GAS}/hrg1.F
${GAS}/hrg2.F
${GAS}/hrg3.F
${GAS}/hrg4.F
${GAS}/hrinit.F
${GAS}/hrprodloss.F
${GAS}/hrrates.F
${GAS}/hrsolver.F
${GAS}/init_degrade.F
${GRID}/GRID_CONF.F
${GRID}/HGRD_DEFN.F
${GRID}/VGRD_DEFN.F
${GRID}/PAGRD_DEFN.F
${GRID}/PCGRID_DEFN.F
${ICL}/const/CONST.EXT
${ICL}/emctrl/EMISPRM.EXT
${ICL}/filenames/FILES_CTM.EXT
${ICL}/mpi/PE_COMM.EXT
${INIT}/initscen.F
${INIT}/load_cgrid.F
${MECHS}/RXNS_DATA_MODULE.F90
${MECHS}/RXNS_FUNC_MODULE.F90
${PA}/PA_DEFN.F
${PA}/pa_update.F
${PHOT}/AERO_PHOTDATA.F
${PHOT}/CLOUD_OPTICS.F
${PHOT}/complex_number_module.F90
${PHOT}/CSQY_DATA.F
${PHOT}/OMI_1979_to_2015.dat
${PHOT}/opphot.F
${PHOT}/phot.F
${PHOT}/PHOT_MET_DATA.F
${PHOT}/PHOT_MOD.F
${PHOT}/PHOTOLYSIS_ALBEDO.F
${PHOT}/PHOT_OPTICS.dat
${PHOT}/SEAS_STRAT_O3_MIN.F
${PHOT}/twoway_rrtmg_aero_optics.F90
${PLRISE}/delta_zs.f
${PLRISE}/fire_plmris.F
${PLRISE}/openlayout.F
${PLRISE}/oppt3d_diag.F
${PLRISE}/plmris.F
${PLRISE}/plsprd.f
${PLRISE}/preplm.f
${PLRISE}/ungridb2.f
${PLRISE}/write3_distr.f
${SPCS}/CGRID_SPCS.F
${STENEX}/noop_comm_module.f
${STENEX}/noop_data_copy_module.f
${STENEX}/noop_gather_module.f
${STENEX}/noop_global_max_module.f
${STENEX}/noop_global_min_module.f
${STENEX}/noop_global_sum_module.f
${STENEX}/noop_init_module.f
${STENEX}/noop_modules.f
${STENEX}/noop_slice_module.f
${STENEX}/noop_term_module.f
${STENEX}/noop_util_module.f
${UTIL}/bmatvec.F
${UTIL}/findex.f
${UTIL}/get_envlist.f
${UTIL}/setup_logdev.F
${UTIL}/subhdomain.F
${UTIL}/UTILIO_DEFN.F
${VDIFF}/aero_sedv.F
${VDIFF}/ASX_DATA_MOD.F
${VDIFF}/conv_cgrid.F
${VDIFF}/matrix1.F
${VDIFF}/opddep.F
${VDIFF}/opddep_fst.F
${VDIFF}/opddep_mos.F
${VDIFF}/rddepv.F
${VDIFF}/SEDIMENTATION.F
${VDIFF}/tri.F
${VDIFF}/VDIFF_DIAG.F
${VDIFF}/VDIFF_MAP.F
${VDIFF}/vdiffproc.F
${localCCTM}/o3totcol.f
${localCCTM}/vdiffacmx.F
${localCCTM}/PTMAP.F
${localCCTM}/PT3D_DEFN.F
)
Loading

0 comments on commit 79ff7a9

Please sign in to comment.