diff --git a/documentation/docs/user_guide/installation.md b/documentation/docs/user_guide/installation.md index 99749539d..22bb5b927 100644 --- a/documentation/docs/user_guide/installation.md +++ b/documentation/docs/user_guide/installation.md @@ -13,11 +13,11 @@ graph TD A(Clone CABLE with git):::UserAction -->|Serial?| B(Run `offline/build3.sh`):::UserAction; B --> D[load modules, set compiler flags, create .tmp/ directory]; - D -->|Serial?| E[Run `serial_cable`]; + D -->|Serial?| E[Run `make`]; E --> G[executable `cable`]:::Output; A -->|Parallel?| C(Run `offline/build3.sh mpi`):::UserAction; C --> D; - D -->|Parallel?| F[Run `parallel_cable`]; + D -->|Parallel?| F[Run `make mpi`]; F --> H[executable `cable_mpi`]:::Output; click A "http://cable.readthedocs.io/en/latest/user_guide/installation/#getting-the-cable-source-code" click B "http://cable.readthedocs.io/en/latest/user_guide/installation/#launching-the-build" @@ -101,12 +101,9 @@ The build script: 1. loads modules for the Fortran compiler and the netCDF library 2. sets the compiler flags 3. creates a hidden temporary directory (`.tmp/`) in which it then compiles CABLE. +4. executes `make` in the hidden temporary directory -A [Makefile][makefile] compiles the CABLE code that is common to both serial and parallel CABLE. This includes all the files under the `science/`, `util/`, and `params/` directories. - -A serial compilation then calls `serial_cable` to compile the serial driver and link everything together to produce the executable, `cable`. - -A parallel compilation then calls `parallel_cable` to compile the required MPI driver(s) and link everything together to produce the executable, `cable-mpi`. +The [Makefile][makefile] compiles the serial executable by default (via `make`) and compiles the MPI executable via the `mpi` target (via `make mpi`). The hidden `.tmp/` directory is really only needed for technical reasons and you should never need to go into the `.tmp/` directory. However, if for some reason you want the **.o** object files created by the compiler, they persist in this directory. Alternatively, it is sometimes useful to verify that the files you want to compile are actually making it into this directory. This is particularly relevant if you are adding new files to CABLE. diff --git a/src/offline/Makefile b/src/offline/Makefile index ade897740..22af0b532 100644 --- a/src/offline/Makefile +++ b/src/offline/Makefile @@ -31,128 +31,121 @@ ########################################################################## # these are all the files we are compiling -LSRC = \ -cable_maths_constants_mod.F90 \ -cable_other_constants_mod.F90 \ -cable_photo_constants_mod.F90 \ -cable_phys_constants_mod.F90 \ -grid_constants_cbl.F90 \ -cable_climate_type_mod.F90 \ -cable_common.F90 \ -cable_runtime_opts_mod.F90 \ -masks_cbl.F90 \ -cbl_snow_albedo.F90 \ -cbl_soilColour_albedo.F90 \ -cable_canopy.F90 \ -cbl_dryLeaf.F90 \ -cbl_friction_vel.F90 \ -cbl_fwsoil.F90 \ -cbl_LAI_canopy_height.F90 \ -cbl_latent_heat.F90 \ -cbl_photosynthesis.F90 \ -cbl_pot_evap_snow.F90 \ -cbl_qsat.F90 \ -cbl_SurfaceWetness.F90 \ -cbl_wetleaf.F90 \ -cbl_within_canopy.F90 \ -cbl_zetar.F90 \ -bgcdriver.F90 \ -biogeochem_casa.F90 \ -casa_cnp.F90 \ -casa_dimension.F90 \ -casa_feedback.F90 \ -casa_inout.F90 \ -casa_param.F90 \ -casa_phenology.F90 \ -casa_sumcflux.F90 \ -casa_variable.F90 \ -cable_gw_hydro.F90 \ -cable_psm.F90 \ -cbl_GW.F90 \ -landuse3.F90 \ -landuse_constant.F90 \ -cable_air.F90 \ -cable_carbon.F90 \ -cable_climate.F90 \ -pop_constants.F90 \ -pop_def.F90 \ -POPdriver.F90 \ -POP.F90 \ -pop_io.F90 \ -POPLUC.F90 \ -pop_types.F90 \ -cbl_init_radiation.F90 \ -cbl_radiation.F90 \ -cbl_rhoch.F90 \ -cbl_sinbet.F90 \ -cbl_spitter.F90 \ -cable_roughness.F90 \ -roughnessHGT_effLAI_cbl.F90 \ -cable_sli_main.F90 \ -cable_sli_numbers.F90 \ -cable_sli_roots.F90 \ -cable_sli_solve.F90 \ -cable_sli_utils.F90 \ -cbl_conductivity.F90 \ -cbl_GW.F90 \ -cbl_hyd_redistrib.F90 \ -cbl_Oldconductivity.F90 \ -cbl_remove_trans.F90 \ -cbl_smoisturev.F90 \ -cbl_snowAccum.F90 \ -cbl_snow_aging.F90 \ -cbl_snowCheck.F90 \ -cbl_snowDensity.F90 \ -cbl_snowl_adjust.F90 \ -cbl_snowMelt.F90 \ -cbl_soilfreeze.F90 \ -cbl_soilsnow_data.F90 \ -cbl_soilsnow_init_special.F90 \ -cbl_soilsnow_main.F90 \ -cbl_stempv.F90 \ -cbl_surfbv.F90 \ -cbl_thermal.F90 \ -cbl_trimb.F90 \ -cable_abort.F90 \ -cable_checks.F90 \ -cable_cru_TRENDY.F90 \ -cable_define_types.F90 \ -cable_initialise.F90 \ -cable_input.F90 \ -cable_iovars.F90 \ -cable_LUC_EXPT.F90 \ -cable_metutils.F90 \ -cable_namelist_input.F90 \ -cable_output.F90 \ -cable_parameters.F90 \ -cable_pft_params.F90 \ -cable_phenology.F90 \ -cable_plume_mip.F90 \ -cable_read.F90 \ -cable_site.F90 \ -cable_soil_params.F90 \ -cable_weathergenerator.F90 \ -cable_write.F90 \ -casa_cable.F90 \ -casa_ncdf.F90 \ -CASAONLY_LUC.F90 \ -cbl_model_driver_offline.F90 \ -landuse_inout.F90 \ -spincasacnp.F90 \ -bgcdriver.F90 \ -biogeochem_casa.F90 \ -casa_feedback.F90 \ -casa_readbiome.F90 \ -casa_rplant.F90 \ -casa_offline_inout.F90 \ -casa_sumcflux.F90 - +LSRC := bgcdriver.F90 \ + biogeochem_casa.F90 \ + cable_abort.F90 \ + cable_air.F90 \ + cable_canopy.F90 \ + cable_carbon.F90 \ + cable_checks.F90 \ + cable_climate.F90 \ + cable_climate_type_mod.F90 \ + cable_common.F90 \ + cable_cru_TRENDY.F90 \ + cable_define_types.F90 \ + cable_gw_hydro.F90 \ + cable_initialise.F90 \ + cable_input.F90 \ + cable_iovars.F90 \ + cable_LUC_EXPT.F90 \ + cable_maths_constants_mod.F90 \ + cable_metutils.F90 \ + cable_namelist_input.F90 \ + cable_other_constants_mod.F90 \ + cable_output.F90 \ + cable_parameters.F90 \ + cable_pft_params.F90 \ + cable_phenology.F90 \ + cable_photo_constants_mod.F90 \ + cable_phys_constants_mod.F90 \ + cable_plume_mip.F90 \ + cable_psm.F90 \ + cable_read.F90 \ + cable_roughness.F90 \ + cable_runtime_opts_mod.F90 \ + cable_site.F90 \ + cable_sli_main.F90 \ + cable_sli_numbers.F90 \ + cable_sli_roots.F90 \ + cable_sli_solve.F90 \ + cable_sli_utils.F90 \ + cable_soil_params.F90 \ + cable_weathergenerator.F90 \ + cable_write.F90 \ + casa_cable.F90 \ + casa_cnp.F90 \ + casa_dimension.F90 \ + casa_feedback.F90 \ + casa_inout.F90 \ + casa_ncdf.F90 \ + casa_offline_inout.F90 \ + CASAONLY_LUC.F90 \ + casa_param.F90 \ + casa_phenology.F90 \ + casa_readbiome.F90 \ + casa_rplant.F90 \ + casa_sumcflux.F90 \ + casa_variable.F90 \ + cbl_albedo.F90 \ + cbl_conductivity.F90 \ + cbl_dryLeaf.F90 \ + cbl_friction_vel.F90 \ + cbl_fwsoil.F90 \ + cbl_GW.F90 \ + cbl_hyd_redistrib.F90 \ + cbl_init_radiation.F90 \ + cbl_latent_heat.F90 \ + cbl_model_driver_offline.F90 \ + cbl_Oldconductivity.F90 \ + cbl_photosynthesis.F90 \ + cbl_pot_evap_snow.F90 \ + cbl_qsat.F90 \ + cbl_radiation.F90 \ + cbl_remove_trans.F90 \ + cbl_rhoch.F90 \ + cbl_sinbet.F90 \ + cbl_smoisturev.F90 \ + cbl_snowAccum.F90 \ + cbl_snow_aging.F90 \ + cbl_snow_albedo.F90 \ + cbl_snowCheck.F90 \ + cbl_snowDensity.F90 \ + cbl_snowl_adjust.F90 \ + cbl_snowMelt.F90 \ + cbl_soilColour_albedo.F90 \ + cbl_soilfreeze.F90 \ + cbl_soilsnow_data.F90 \ + cbl_soilsnow_init_special.F90 \ + cbl_soilsnow_main.F90 \ + cbl_spitter.F90 \ + cbl_stempv.F90 \ + cbl_SurfaceWetness.F90 \ + cbl_surfbv.F90 \ + cbl_thermal.F90 \ + cbl_trimb.F90 \ + cbl_wetleaf.F90 \ + cbl_within_canopy.F90 \ + cbl_zetar.F90 \ + grid_constants_cbl.F90 \ + landuse3.F90 \ + landuse_constant.F90 \ + landuse_inout.F90 \ + masks_cbl.F90 \ + pop_constants.F90 \ + pop_def.F90 \ + pop_io.F90 \ + POPLUC.F90 \ + POP.F90 \ + pop_types.F90 \ + roughnessHGT_effLAI_cbl.F90 \ + spincasacnp.F90 # this is the executable we are building -PROG = cable +PROG_SERIAL = cable +PROG_MPI = cable-mpi # from the compiled object files -OBJS = ${LSRC:.F90=.o} +OBJS := ${LSRC:.F90=.o} #compiler switches and flags CINC = -I$(NCMOD) @@ -164,8 +157,29 @@ CINC = -I$(NCMOD) .F90.o: $(FC) $(CFLAGS) $(CINC) -c $< -# default target by convention is ``all'' -all : +SUPPRESS_FLAGS := -warn nostderrors -diag-disable 10145 + +# the first target is the default target +.PHONY: serial +serial: cable_driver.F90 $(OBJS) + $(FC) $(SUPPRESS_FLAGS) $(CFLAGS) $(LDFLAGS) $(LD) -o $(PROG_SERIAL) $^ $(CINC) + +.PHONY: mpi +mpi: cable_mpidrv.F90 cable_mpicommon.o cable_mpimaster.o cable_mpiworker.o pop_mpi.o $(OBJS) + $(FC) $(SUPPRESS_FLAGS) $(CFLAGS) $(LDFLAGS) -o $(PROG_MPI) $^ $(CINC) $(LD) + +# TODO(Sean): passing LDFLAGS to the compiler ensures bitwise reproducibility +# for this PR (#193). This is because LDFLAGS contains the -O0 flag (see +# build3.sh). Ideally, LDFLAGS should not contain -O0 and this should be set in +# CFLAGS as this would let us use the default suffix rule for *.o files. +cable_mpicommon.o: cable_mpicommon.F90 $(OBJS) + $(FC) $(CFLAGS) $(CINC) $(LDFLAGS) -c $< +pop_mpi.o: pop_mpi.F90 cable_mpicommon.o $(OBJS) + $(FC) $(CFLAGS) $(CINC) $(LDFLAGS) -c $< +cable_mpiworker.o: cable_mpiworker.F90 cable_mpicommon.o pop_mpi.o $(OBJS) + $(FC) $(CFLAGS) $(CINC) $(LDFLAGS) -c $< +cable_mpimaster.o: cable_mpimaster.F90 cable_mpicommon.o cable_mpiworker.o pop_mpi.o $(OBJS) + $(FC) $(CFLAGS) $(CINC) $(LDFLAGS) -c $< # dependencies, compilation rules for ALL files needed for "all" (LSRC) #================================================================ @@ -176,13 +190,13 @@ cable_phys_constants_mod.o: cable_phys_constants_mod.F90 cable_other_constants_mod.o: cable_other_constants_mod.F90 grid_constants_cbl.o cable_photo_constants_mod.o: cable_photo_constants_mod.F90 cable_runtime_opts_mod.o: cable_runtime_opts_mod.F90 -cable_pft_params.o: cable_pft_params.F90 cable_define_types.o +cable_pft_params.o: cable_pft_params.F90 cable_define_types.o grid_constants_cbl.o cable_soil_params.o: cable_soil_params.F90 cable_define_types.o casa_param.o: casa_param.F90 ##│   ├── casa-cnp -bgcdriver.o: bgcdriver.F90 biogeochem_casa.o pop_types.o POP.o -biogeochem_casa.o: biogeochem_casa.F90 casa_rplant.o pop_types.o +bgcdriver.o: bgcdriver.F90 biogeochem_casa.o pop_types.o POP.o cable_phenology.o +biogeochem_casa.o: biogeochem_casa.F90 casa_rplant.o pop_types.o casa_inout.o casa_feedback.o: casa_feedback.F90 casa_readbiome.o: casa_readbiome.F90 casa_variable.o casa_rplant.o: casa_rplant.F90 casa_cnp.o @@ -226,7 +240,7 @@ cbl_hyd_redistrib.o: cbl_hyd_redistrib.F90 cbl_soilsnow_data.o cable_define_type cbl_conductivity.o: cbl_conductivity.F90 cbl_soilsnow_data.o cable_define_types.o cbl_Oldconductivity.o: cbl_Oldconductivity.F90 cbl_soilsnow_data.o cable_define_types.o cbl_GW.o: cbl_GW.F90 cbl_soilsnow_data.o cbl_trimb.o cbl_Oldconductivity.o cbl_conductivity.o cable_define_types.o cable_common.o -cbl_thermal.o: cbl_thermal.F90 cbl_soilsnow_data.o cbl_snowCheck.o cbl_snowDensity.o cbl_snowAccum.o cbl_snowMelt.o cbl_snowl_adjust.o +cbl_thermal.o: cbl_thermal.F90 cbl_soilsnow_data.o cbl_snowCheck.o cbl_snowDensity.o cbl_snowAccum.o cbl_snowMelt.o cbl_snowl_adjust.o cbl_GW.o cbl_surfbv.o: cbl_surfbv.F90 cbl_soilsnow_data.o cable_define_types.o cable_common.o cbl_smoisturev.o cbl_stempv.o: cbl_stempv.F90 cbl_trimb.o cbl_soilsnow_data.o cbl_conductivity.o cbl_Oldconductivity.o cbl_smoisturev.o: cbl_smoisturev.F90 cbl_trimb.o cbl_soilsnow_data.o cable_define_types.o cable_common.o @@ -236,7 +250,7 @@ cbl_soilsnow_main.o: cbl_soilsnow_main.F90 cbl_soilsnow_data.o cbl_soilfreeze.o #science subrs casa_phenology.o: casa_phenology.F90 -cable_air.o: cable_air.F90 cable_define_types.o cable_common.o +cable_air.o: cable_air.F90 cable_define_types.o cable_common.o cable_phys_constants_mod.o cable_canopy.o: cable_canopy.F90 cbl_friction_vel.o cbl_pot_evap_snow.o cbl_qsat.o cbl_zetar.o cbl_latent_heat.o cbl_wetleaf.o cbl_within_canopy.o cbl_SurfaceWetness.o cbl_dryLeaf.o cbl_fwsoil.o cbl_photosynthesis.o cable_maths_constants_mod.o cable_phys_constants_mod.o cable_other_constants_mod.o cable_photo_constants_mod.o cable_define_types.o cbl_radiation.o cable_roughness.o cable_air.o cable_common.o cable_sli_utils.o cable_sli_main.o cable_gw_hydro.o cable_iovars.o cable_psm.o cable_gw_hydro.o cable_climate_type_mod.o @@ -292,7 +306,7 @@ casa_cable.o: casa_cable.F90 pop_types.o POP.o cable_define_types.o cable_carbo landuse_constant.o: landuse_constant.F90 cable_define_types.o casa_dimension.o -casa_cnp.o: casa_cnp.F90 cable_define_types.o casa_variable.o landuse_constant.o +casa_cnp.o: casa_cnp.F90 cable_define_types.o casa_variable.o landuse_constant.o casa_phenology.o cable_common.o casa_inout.o: casa_inout.F90 POP.o cable_define_types.o cable_iovars.o casa_variable.o casa_cnp.o casa_ncdf.o casa_offline_inout.o casa_offline_inout.o: casa_offline_inout.F90 POP.o cable_define_types.o cable_iovars.o casa_variable.o casa_cnp.o casa_ncdf.o @@ -350,105 +364,6 @@ landuse3.o: landuse3.F90 cable_define_types.o casa_dimension.o landuse_constant. landuse_inout.o: landuse_inout.F90 cable_define_types.o landuse_constant.o landuse3.o cable_common.o cable_iovars.o cable_abort.o -# these are all the files we are compiling -all : grid_constants_cbl.o \ - cable_maths_constants_mod.o \ - cable_phys_constants_mod.o \ - cable_other_constants_mod.o \ - cable_photo_constants_mod.o \ - cable_runtime_opts_mod.o \ - cable_pft_params.o \ - cable_soil_params.o \ - masks_cbl.o \ - cable_iovars.o \ - casa_ncdf.o \ - cbl_albedo.o \ - cbl_snow_albedo.o \ - cbl_soilColour_albedo.o \ - cbl_rhoch.o \ - cbl_spitter.o \ - cbl_sinbet.o \ - cbl_radiation.o \ - cbl_init_radiation.o \ - cable_abort.o \ - cable_parameters.o \ - cable_read.o \ - cable_initialise.o \ - cable_input.o \ - cable_write.o \ - cable_output.o \ - cable_checks.o \ - cable_define_types.o \ - cable_common.o \ - cbl_soilsnow_main.o \ - cbl_soilsnow_init_special.o \ - cbl_soilsnow_init_special.o \ - cbl_soilfreeze.o \ - cbl_snowMelt.o \ - cbl_snowl_adjust.o \ - cbl_snowDensity.o \ - cbl_snowCheck.o \ - cbl_snowAccum.o \ - cbl_smoisturev.o \ - cbl_remove_trans.o \ - cbl_hyd_redistrib.o \ - cbl_conductivity.o \ - cbl_Oldconductivity.o \ - cbl_GW.o \ - cbl_thermal.o \ - cbl_soilsnow_data.o \ - cbl_trimb.o \ - cbl_stempv.o \ - cbl_surfbv.o \ - cbl_snow_aging.o \ - cable_air.o \ - cable_roughness.o \ - roughnessHGT_effLAI_cbl.o \ - cable_carbon.o \ - cable_canopy.o \ - cable_sli_main.o \ - cable_sli_numbers.o \ - cable_sli_roots.o \ - cable_sli_solve.o \ - cable_sli_utils.o \ - POP.o \ - pop_io.o \ - POPLUC.o \ - pop_constants.o \ - pop_def.o \ - pop_types.o \ - cable_plume_mip.o \ - cable_weathergenerator.o \ - cable_climate.o \ - cable_climate_type_mod.o \ - cable_phenology.o \ - cable_cru_TRENDY.o \ - cable_LUC_EXPT.o \ - cable_gw_hydro.o \ - cable_psm.o \ - cable_namelist_input.o \ - cable_site.o \ - casa_variable.o \ - casa_param.o \ - casa_dimension.o \ - casa_phenology.o \ - casa_cnp.o \ - casa_cable.o \ - spincasacnp.o \ - CASAONLY_LUC.o \ - cbl_model_driver_offline.o \ - casa_inout.o \ - casa_offline_inout.o \ - landuse_constant.o \ - landuse3.o \ - landuse_inout.o \ - bgcdriver.o \ - biogeochem_casa.o \ - casa_feedback.o \ - casa_readbiome.o \ - casa_rplant.o \ - casa_sumcflux.o - # make clean option clean: rm -fr .tmp diff --git a/src/offline/build3.sh b/src/offline/build3.sh index 047a1a63a..3ac1c5838 100755 --- a/src/offline/build3.sh +++ b/src/offline/build3.sh @@ -104,8 +104,6 @@ build_build() /bin/cp -p $UTI/*90 ./.tmp /bin/cp -p $PAR/*90 ./.tmp -/bin/cp -p serial_cable ./.tmp -/bin/cp -p parallel_cable ./.tmp /bin/cp -p Makefile ./.tmp cd .tmp/ @@ -122,11 +120,10 @@ echo '' echo 'Building drivers for either serial or MPI application' echo '' -make -f Makefile #this makes elements of CABLE that are common to all apps if [[ $1 = 'mpi' ]]; then - ./parallel_cable "$FC" "$CFLAGS" "$LDFLAGS" "$LD" "$NCMOD" + make mpi else - ./serial_cable "$FC" "$CFLAGS" "$LDFLAGS" "$LD" "$NCMOD" + make fi } diff --git a/src/offline/parallel_cable b/src/offline/parallel_cable deleted file mode 100755 index 874f6f01c..000000000 --- a/src/offline/parallel_cable +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash - -# Name the arguments to increase readability -FC=$1 -CFLAGS=$2 -LDFLAGS=$3 -LD=$4 -NCMOD=$5 - -export CINC="-I$NCMOD" -export supr=' -warn nostderrors -diag-disable 10145 ' -mkdir -p tmpo -rm -f cable-mpi -rm -f cable_mpi*.o -rm -f pop_mpi.o - -cp *.o tmpo/ -export FOBJS=`ls tmpo/` - -# this is the executable we are building -PROG=cable-mpi - -$FC $supr $CFLAGS $LDFLAGS -c cable_mpicommon.F90 $FOBJS $CINC -$FC $supr $CFLAGS $LDFLAGS -c pop_mpi.F90 cable_mpicommon.o $FOBJS $CINC -$FC $supr $CFLAGS $LDFLAGS -c cable_mpiworker.F90 cable_mpicommon.o pop_mpi.o $FOBJS $CINC -$FC $supr $CFLAGS $LDFLAGS -c cable_mpimaster.F90 cable_mpicommon.o cable_mpiworker.o pop_mpi.o $FOBJS $CINC -$FC $supr $CFLAGS $LDFLAGS -o $PROG cable_mpidrv.F90 cable_mpicommon.o cable_mpimaster.o cable_mpiworker.o pop_mpi.o $FOBJS $CINC $LD - -rm -fr tmpo/ diff --git a/src/offline/serial_cable b/src/offline/serial_cable deleted file mode 100755 index 424a50d91..000000000 --- a/src/offline/serial_cable +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -# Name the arguments to increase readability -FC=$1 -CFLAGS=$2 -LDFLAGS=$3 -LD=$4 -NCMOD=$5 - -export CINC="-I$NCMOD" -export supr=' -warn nostderrors -diag-disable 10145 ' -mkdir -p tmpo -rm -f cable_driver.o - -cp *.o tmpo/ -export FOBJS=`ls tmpo/` - -# this is the executable we are building -PROG=cable - -$FC $supr $CFLAGS $LDFLAGS $LD -o $PROG cable_driver.F90 $FOBJS $CINC - -rm -fr tmpo/