# # Makefile for ESMA components. # # REVISION HISTORY: # # 3mar2004 Zaslavsky Initial imlementation. # 20Oct2004 da Silva Standardization # 16Mar2007 Kokron Remove default optimization; Add LOOP_VECT # 19Aug2009 Jing Guo Add m_rhs.F90 and m_dtime.F90 to support multi-pass observer # # Make sure ESMADIR is defined # ---------------------------- ifndef ESMADIR ESMADIR := $(PWD)/../util endif # Compilation rules, flags, etc # ----------------------------- include $(ESMADIR)/Config/ESMA_base.mk # Generic stuff include $(ESMADIR)/Config/ESMA_arch.mk # System dependencies include $(ESMADIR)/Config/GMAO_base.mk # System dependencies # --------------------- # Standard ESMA Targets # --------------------- THIS = $(shell basename `pwd`) LIB = lib$(THIS).a LIBgsi_util = libGSI_Util.a LIBgsi_solver = libGSI_Solver.a BIN = prepbykx.x test: : test = "$@" : SHELL = $(SHELL) : PWD = `pwd` : THIS = $(THIS) : LIB = $(LIB) : MODD = $(MOD_DIRS) # -------------------------------- # Recurse Make in Sub-directories # -------------------------------- ALLDIRS = mksi SUBDIRS = $(wildcard $(ALLDIRS)) TARGETS = esma_install esma_clean esma_distclean esma_doc \ install clean distclean doc .PHONY: install local_install install_lib install_inc install_bin install_etc export ESMADIR BASEDIR ARCH SITE $(TARGETS): @ t=$@; argv="$(SUBDIRS)" ;\ for d in $$argv; do \ ( cd $$d ;\ echo ""; echo Making $$t in `pwd` ;\ $(MAKE) -e $$t ) \ done $(MAKE) local_$@ # ---------------------- # User Defined Targets # ---------------------- MAPL_MOD = $(wildcard $(LIB_MAPL_BASE)) ifeq ("$(MAPL_MOD)", "") HAVE_ESMF = INC_ESMF = INC_GEOS = GSIGC_SRCS = SRCSX = crtm_cloud.f90 stub_set_crtm_cloud.f90 BIN += #gsi.x LIB_GMAO = else HAVE_ESMF = -DHAVE_ESMF INC_GEOS = $(INC_MAPL_BASE) $(INC_TRANSF) $(INC_GEOS_SHARED) $(INC_MPEU) GSIGC_SRCS = GSI_GridCompMod.F90 SRCSX = LIB_GMAO = $(LIB_GFIO) $(LIB_MPEU) endif # To deactivate GEOS_PERT-related routines # ---------------------------------------- GEOS_PERT = -DGEOS_PERT GEOS_PERT = INC_FVGCM = LIB_FVGCM = RSRC = gmao_airs_bufr.tbl \ gmao_global_aeroinfo.txt \ gmao_global_anavinfo.txt \ gmao_global_blacklist.txt \ gmao_global_coinfo.txt \ gmao_global_convinfo.txt \ gmao_global_insituinfo.txt \ gmao_global_ozinfo.txt \ gmao_global_pcpinfo.txt \ gmao_global_satinfo.txt \ gmao_global_scaninfo.txt \ gsi_fdda_1.rc.tmpl \ gsi_fdda_2.rc.tmpl \ gsi_fgat_1.rc.tmpl \ gsi_fgat_2.rc.tmpl \ gsi.rc.tmpl \ gsi_sens.rc.tmpl \ obs.rc.tmpl local_esma_install local_install: $(MAKE) install_lib $(MAKE) install_inc $(MAKE) install_bin $(MAKE) install_etc install_lib: $(ESMALIB) $(LIB) @ echo "-- $@: $(LIB) --> $(ESMALIB)/ --" $(CP) -p $(LIBgsi_util) $(ESMALIB)/ $(CP) -p $(LIBgsi_solver) $(ESMALIB)/ $(CP) -p $(LIB) $(ESMALIB)/ install_inc: $(ESMAINC)/$(THIS) @ echo "-- $@: *.mod --> $(ESMAINC)/ --" $(CP) -p *.mod $(ESMAINC)/$(THIS) install_bin: $(ESMABIN) $(BIN) analyzer gsidiags @ echo "-- $@: $(BIN) --> $(ESMABIN)/ --" $(CP) -p $(BIN) $(ESMABIN)/ $(SED) -e "s^@DASPERL^$(PERL)^" < analyzer > $(ESMABIN)/analyzer $(SED) -e "s^@DASPERL^$(PERL)^" < gsidiags > $(ESMABIN)/gsidiags chmod 755 $(ESMABIN)/analyzer chmod 755 $(ESMABIN)/gsidiags install_etc: $(ESMAETC) $(RSRC) @ echo "-- $@: $(RSRC) --> $(ESMAETC)/ --" @ for f in $(RSRC); do \ ( case $$f in \ *.sample) F=`basename $$f .sample` ;;\ *.txt) F=`basename $$f .txt`.rc ;;\ *) F=$$f ;;\ esac ;\ echo "$(CP) -p $$f $(ESMAETC)/$$F" ;\ $(CP) -p $$f $(ESMAETC)/$$F )\ done $(ESMALIB) $(ESMABIN) $(ESMAINC)/$(THIS) $(ESMAETC): @ echo "$@: making directory $@ ..." $(MKDIR) $@ local_esma_clean local_clean: $(RM) *~ *.[aox] *.[Mm][Oo][Dd] local_esma_distclean local_distclean: $(RM) *~ *.[aoxd] *.[Mm][Oo][Dd] local_esma_doc local_doc: @echo "Target $@ not implemented yet in `pwd`" esma_help help: @echo "Standard ESMA targets:" @echo "% make esma_install (builds and install under ESMADIR)" @echo "% make esma_clean (removes deliverables: *.[aox], etc)" @echo "% make esma_distclean (leaves in the same state as cvs co)" @echo "% make esma_doc (generates PDF, installs under ESMADIR)" @echo "% make esma_help (this message)" @echo "Environment:" @echo " ESMADIR = $(ESMADIR)" @echo " BASEDIR = $(BASEDIR)" @echo " ARCH = $(ARCH)" @echo " SITE = $(SITE)" @echo " FREAL = $(FREAL)" show_fflags: @echo "FFLAGS = $(FFLAGS)" @echo "F90FLAGS = $(F90FLAGS)" @echo "FFLAGS_OPENBUFR = $(FFLAGS_OPENBUFR)" @echo "FFLAGS_OPENBIG = $(FFLAGS_OPENBIG)" @echo "USER_FFLAGS = $(USER_FFLAGS)" @echo "_D = $(_D)" # ---------------------------------------- # Define What Participates in GSI Util Lib # ---------------------------------------- # Requirement: things depending on gridmod # and below gridmod level with # some reaon (obviously) SRCS_UTIL = $(wildcard \ aniso_ens_util.f90 \ antcorr_application.f90 \ compact_diffs.f90 \ compute_fact10.f90 \ constants.f90 \ control_vectors.f90 \ egrid2agrid_mod.f90 \ ensctl2state.f90 \ fgrid2agrid_mod.f90 \ fill_mass_grid2.f90 \ fill_nmm_grid2.f90 \ fpvsx_ad.f90 \ general_read_gfsatm.f90 \ general_specmod.f90 \ general_spectral_transforms.f90 \ general_sub2grid_mod.f90 \ general_transform.f90 \ gengrid_vars.f90 \ get_derivatives.f90 \ get_derivatives2.f90 \ get_gefs_ensperts_dualres.f90 \ get_gefs_for_regional.f90 \ get_wrf_mass_ensperts_netcdf.F90 \ get_semimp_mats.f90 \ getuv.f90 \ gsi_bundlemod.F90 \ gsi_chemguess_mod.F90 \ gsi_metguess_mod.F90 \ grdcrd.f90 \ grid2sub.f90 \ gridmod.F90 \ gscond_ad.f90 \ gsi_4dcouplermod.f90 \ gsi_io.f90 \ gsi_nemsio_mod.f90 \ half_nmm_grid2.f90 \ hilbert_curve.f90 \ hybrid_ensemble_isotropic.F90 \ hybrid_ensemble_parameters.f90 \ init_commvars.f90 \ insitu_info.f90 \ kinds.F90 \ looplimits.f90 \ m_dgeevx.F90 \ m_rerank.f90 \ m_stats.f90 \ m_tick.F90 \ mpeu_mpif.F90 \ mpeu_util.F90 \ missing_routines.f90 \ mod_nmmb_to_a.f90 \ mod_strong.f90 \ mp_compact_diffs_mod1.f90 \ mp_compact_diffs_support.f90 \ mpimod.F90 \ mpl_allreduce.F90 \ mpl_bcast.f90 \ ncepgfs_ghg.f90 \ ncepnems_io.f90 \ nstio_module.f90 \ nlmsas_ad.f90 \ omegas_ad.f90 \ phil.f90 \ phil1.f90 \ plib8.f90 \ polcarf.f90 \ prad_bias.f90 \ precond.f90 \ precpd_ad.f90 \ psichi2uv_reg.f90 \ psichi2uvt_reg.f90 \ raflib.f90 \ rapidrefresh_cldsurf_mod.f90 \ rdgrbsst.f90 \ rfdpar.f90 \ rsearch.F90 \ rtlnmc_version3.f90 \ set_crtm_aerosolmod.f90 \ set_crtm_cloudmod.f90 \ sfc_model.f90 \ simpin1.f90 \ simpin1_init.f90 \ smoothwwrf.f90 \ state_vectors.f90 \ stop1.f90 \ stub_set_crtm_aerosol.f90 \ stub_pertmod.F90 \ stub_timermod.f90 \ sub2grid.f90 \ tendsmod.f90 \ timermod.f90 \ tintrp2a.f90 \ tintrp3.f90 \ turbl.f90 \ turbl_ad.f90 \ turbl_tl.f90 \ turblmod.f90 \ unfill_mass_grid2.f90 \ unfill_nmm_grid2.f90 \ unhalf_nmm_grid2.f90 \ wind_fft.f90 \ blockIO.c ${SRCSX} ) # -------------------- # User Defined Targets # -------------------- SRCS_SOLVER = $(wildcard \ adjtest.f90 \ aeroinfo.f90 \ anberror.f90 \ anbkerror.f90 \ anisofilter.f90 \ anisofilter_glb.f90 \ antest_maps0.f90 \ antest_maps0_glb.f90 \ atms_spatial_average_mod.f90 \ balmod.f90 \ berror.f90 \ bias_predictors.f90 \ bkerror.f90 \ bkgcov.f90 \ bkgvar.f90 \ bkgvar_rewgt.f90 \ bicg.f90 \ bicglanczos.F90 \ blacklist.f90 \ cal_tztr.f90 \ calc_fov_conical.f90 \ calc_fov_crosstrk.f90 \ calctends.f90 \ calctends_ad.f90 \ calctends_tl.f90 \ calctends_no_ad.f90 \ calctends_no_tl.f90 \ chemmod.f90 \ clw_mod.f90 \ cmaq_routines.f90 \ co_mop_ak.f90 \ coinfo.f90 \ combine_radobs.f90 \ compute_derived.f90 \ compute_qvar3d.f90 \ control2model.f90 \ control2state.f90 \ converr.f90 \ convinfo.f90 \ convthin.f90 \ crtm_interface.f90 \ cvsection.f90 \ dtast.f90 \ deter_nst.f90 \ deter_sfc_mod.f90 \ enorm_state.f90 \ evaljgrad.f90 \ evaljcdfi.f90 \ evaljo.f90 \ evalqlim.f90 \ genqsat.f90 \ genstats_gps.f90 \ gesinfo.f90 \ getprs.f90 \ getsiga.f90 \ getvvel.f90 \ glbsoi.f90 \ grtest.f90 \ gsd_terrain_match_surfTobs.f90 \ gsdcloudanalysis.F90 \ gsi_4dvar.f90 \ gsimod.F90 \ gsisub.F90 \ guess_grids.F90 \ inc2guess.f90 \ init_jcdfi.f90 \ int3dvar.f90 \ intall.f90 \ intco.f90 \ intdw.f90 \ intgps.f90 \ intgust.f90 \ intjcmod.f90 \ intjo.f90 \ intlag.f90 \ intoz.f90 \ intpblh.f90 \ intpcp.f90 \ intpm2_5.f90 \ intps.f90 \ intpw.f90 \ intq.f90 \ intrad.f90 \ intrp2a.f90 \ intrp3oz.f90 \ intrw.f90 \ intspd.f90 \ intsrw.f90 \ intsst.f90 \ intt.f90 \ inttcp.f90 \ intvis.f90 \ intw.f90 \ jcmod.f90 \ jfunc.f90 \ jgrad.f90 \ lag_fields.f90 \ lag_interp.f90 \ lag_traj.f90 \ lagmod.f90 \ lanczos.F90 \ logvis_to_vis.f90 \ m_berror_stats.f90 \ m_berror_stats_reg.f90 \ m_gsiBiases.f90 \ m_dtime.F90 \ m_gpsrhs.F90 \ m_obdiag.F90 \ m_rhs.F90 \ mod_vtrans.f90 \ model_ad.F90 \ model_tl.F90 \ model2control.f90 \ ncepgfs_io.f90 \ normal_rh_to_q.f90 \ obs_ferrscale.F90 \ obs_para.f90 \ obs_sensitivity.f90 \ observer.F90 \ obsmod.F90 \ oneobmod.F90 \ ozinfo.f90 \ patch2grid_mod.f90 \ pcgsoi.f90 \ pcgsqrt.f90 \ pcp_k.f90 \ pcpinfo.f90 \ penal.f90 \ prewgt.f90 \ prewgt_reg.f90 \ projmethod_support.f90 \ prt_guess.f90 \ q_diag.f90 \ qcmod.f90 \ qnewton3.f90 \ radinfo.f90 \ read_aerosol.f90 \ read_airs.f90 \ read_amsre.f90 \ read_anowbufr.f90 \ read_atms.f90 \ read_avhrr.f90 \ read_avhrr_navy.f90 \ read_bufrtovs.f90 \ read_co.f90 \ read_diag.f90 \ read_files.f90 \ read_gfs_ozone_for_regional.f90 \ read_goesimg.f90 \ read_goesndr.f90 \ read_gps.f90 \ read_guess.F90 \ read_iasi.f90 \ read_cris.f90 \ read_l2bufr_mod.f90 \ read_lag.f90 \ read_lidar.f90 \ read_Lightning.f90 \ read_modsbufr.f90 \ read_NASA_LaRC.f90 \ read_obs.F90 \ read_obsdiags.F90 \ read_ozone.f90 \ read_pblh.f90 \ read_pcp.f90 \ read_prepbufr.f90 \ read_radar.f90 \ read_RadarRef_mosaic.f90 \ read_satwnd.f90 \ read_seviri.f90 \ read_ssmi.f90 \ read_ssmis.f90 \ read_superwinds.f90 \ read_tcps.f90 \ read_wrf_mass_files.f90 \ read_wrf_mass_guess.F90 \ read_wrf_nmm_files.f90 \ read_wrf_nmm_guess.F90 \ regional_io.f90 \ reorg_metar_cloud.f90 \ satthin.F90 \ setupbend.f90 \ setupco.f90 \ setupdw.f90 \ setupgust.f90 \ setuplag.f90 \ setupoz.f90 \ setuppblh.f90 \ setuppcp.f90 \ setuppm2_5.f90 \ setupps.f90 \ setuppw.f90 \ setupq.f90 \ setuprad.f90 \ setupref.f90 \ setuprhsall.f90 \ setuprw.f90 \ setupspd.f90 \ setupsrw.f90 \ setupsst.f90 \ setupt.f90 \ setuptcp.f90 \ setupvis.f90 \ setupw.f90 \ setupyobs.f90 \ sfcobsqc.f90 \ skindepth.f90 \ smooth_polcarf.f90 \ smoothrf.f90 \ smoothzrf.f90 \ sqrtmin.f90 \ sst_retrieval.f90 \ state2control.f90 \ state2ensctl.f90 \ statsco.f90 \ statsconv.f90 \ statsoz.f90 \ statspcp.f90 \ statsrad.f90 \ stp3dvar.f90 \ stpcalc.f90 \ stpco.f90 \ stpdw.f90 \ stpgps.f90 \ stpgust.f90 \ stpjo.f90 \ stpjcmod.f90 \ stpoz.f90 \ stppblh.f90 \ stppcp.f90 \ stppm2_5.f90 \ stpps.f90 \ stppw.f90 \ stpq.f90 \ stprad.f90 \ stprw.f90 \ stpspd.f90 \ stpsrw.f90 \ stpsst.f90 \ stpt.f90 \ stptcp.f90 \ stpvis.f90 \ stpw.f90 \ strong_bal_correction.f90 \ strong_baldiag_inc.f90 \ strong_fast_global_mod.f90 \ strong_slow_global_mod.f90 \ sub2fslab_mod.f90 \ support_2dvar.f90 \ test_obsens.f90 \ tcv_mod.f90 \ tpause.f90 \ tpause_t.F90 \ tv_to_tsen.f90 \ update_guess.f90 \ update_geswtend.f90 \ wrf_binary_interface.F90 \ wrf_mass_guess_mod.f90 \ wrf_netcdf_interface.F90 \ write_all.F90 \ write_bkgvars_grid.f90 \ write_obsdiags.F90 \ wrwrfmassa.F90 \ wrwrfnmma.F90 \ xhat_vordivmod.f90 \ zrnmi_mod.f90 ) SRCS = $(SRCS_UTIL) $(SRCS_SOLVER) $(GSIGC_SRCS) ALLSRCS = $(SRCS) gsimain.f90 prepbykx.f OBJS_UTIL := $(addsuffix .o, $(basename $(SRCS_UTIL))) OBJS_SOLVER := $(addsuffix .o, $(basename $(SRCS_SOLVER))) OBJS_GC := $(addsuffix .o, $(basename $(GSIGC_SRCS))) DEPS := $(addsuffix .d, $(basename $(ALLSRCS))) _D = -D_GMAO_FVGSI_ -D_IGNORE_GRIDVERIFY_ $(GEOS_PERT) _D = $(GEOS_PERT) ifeq ("$(FOPT)","-O3") FOPT += $(LOOP_VECT) endif FREAL = $(FREAL4) FOPT_nobig = $(FOPT) $(BYTERECLEN) $(_D) FPE = THIS_BUFR = NCEP_bufr_r8i4 INC_BACIO = # $(ESMADIR)/$(ARCH)/include/$(THIS_BACIO) # move to proper place MOD_DIRS = . $(INC_ESMF) $(INC_CRTM) \ $(INC_SIGIO) $(INC_BACIO) $(INC_NEMSIO) \ $(INC_SFCIO) $(INC_GEOS) $(INC_MPI) USER_FINCS = $(foreach dir,$(MOD_DIRS), $(I)$(dir)) USER_FDEFS = $(_D) $(HAVE_ESMF) USER_FFLAGS = -CB $(BIG_ENDIAN) $(BYTERECLEN) USER_FFLAGS = $(BYTERECLEN) USER_FFLAGS = USER_FFLAGS = $(BIG_ENDIAN) $(BYTERECLEN) -D_REAL8_ USER_CFLAGS = -I . -DLINUX -Dfunder -DFortranByte=char -DFortranInt=int -DFortranLlong='long long' -O3 USER_FMODS = $(foreach dir,$(MOD_DIRS),$(M)$(dir)) vpath % $(MOD_DIRS) $(LIBgsi_util) : $(OBJS_UTIL) $(RM) $(LIBgsi_util) $(AR) $(AR_FLAGS) $(LIBgsi_util) $(OBJS_UTIL) $(LIBgsi_solver) : $(OBJS_SOLVER) $(RM) $(LIBgsi_solver) $(AR) $(AR_FLAGS) $(LIBgsi_solver) $(OBJS_SOLVER) $(LIB) lib : $(LIBgsi_util) $(LIBgsi_solver) $(OBJS_GC) $(RM) $(LIB) $(AR) $(AR_FLAGS) $(LIB) $(OBJS_GC) %.x : $(LIB) %.o $(LD) $(LDFLAGS) -o $@ $*.o $(LIB) $(LIB_SYS) #gsi.x: $(LIBgsi_util) $(LIBgsi_solver) gsimain.o # $(FC) $(LDFLAGS) -o gsi.x gsimain.o $(LIBgsi_solver) $(LIBgsi_util) $(LIB_CRTM) \ # $(LIB_SFCIO) $(LIB_BUFR) $(LIB_NEMSIO) $(LIB_BACIO) $(LIB_SIGIO) \ # $(LIB_SP) $(LIB_W3) \ # $(LIB_MPI) $(LIB_SCI) $(LIB_SYS) ut_gsibundle.x: $(OBJS) $(LIB) ut_gsibundle.o $(FC) $(LDFLAGS) -o ut_gsibundle.x ut_gsibundle.o $(LIBgsi_util) \ $(LIB_MPI) $(LIB_SCI) $(LIB_SYS) fFLAGSx = $(patsubst -convert big_endian,,$(fFLAGS)) prepbykx.o : prepbykx.f $(ESMA_TIMER) $(FC) -c $(fFLAGSx) $< prepbykx.x: prepbykx.o $(LD) $(LDFLAGS) -o prepbykx.x prepbykx.o $(LIB_BUFR) blockIO.o : blockIO.c @echo '---> Special handling of C code $<' $(CC) $(USER_CFLAGS) -c $< blockIO.d : blockIO.c @ touch $@ # OBJS_OPENBUFR lists all i/o (OPEN) objects opened the same way as # NCEP_bufr files (native). OBJS_OPENBUFR = read_airs.o \ read_amsre.o \ read_anowbufr.o \ read_avhrr.o \ read_avhrr_navy.o \ read_bufrtovs.o \ read_cris.o \ read_goesimg.o \ read_goesndr.o \ read_gps.o \ read_iasi.o \ read_l2bufr_mod.o \ read_lidar.o \ read_modsbufr.o \ read_ozone.o \ read_pcp.o \ read_prepbufr.o \ read_radar.o \ read_satwnd.o \ read_seviri.f90 \ read_ssmi.o \ read_ssmis.o \ read_superwinds.o \ oneobmod.o $(OBJS_OPENBUFR) : @echo '---> Special handling of Fortran "native" BUFR-OPEN $<' $(FC) -c $(patsubst $(BIG_ENDIAN),,$(f90FLAGS)) $< ifeq ($(BOPT),g) FOPTx = $(patsubst -O0,-O1,$(FOPT)) f90FLAGSx = $(FDEFS) $(FINCS) $(FMODS) $(FOPTx) $(FREAL) $(FINT) $(XFLAGS) $(USER_FFLAGS) nlmsas_ad.o: nlmsas_ad.f90 $(ESMA_TIMER) $(FC) -c $(f90FLAGSx) $< endif FFLAGS_OPENBUFR = $(patsubst $(BIG_ENDIAN),,$(f90FLAGS)) # OBJS_OPENBIG = m_berror_stats.o \ balmod.o \ prewgt.o $(OBJS_OPENBIG) : @echo '---> Special handling of Fortran "big_endian" OPEN $<' $(FC) -c $(BIG_ENDIAN) $(f90FLAGS) $< FFLAGS_OPENBIG = $(BIG_ENDIAN) $(f90FLAGS) # -------------------- # Documentation # -------------------- #PDF_DOCS = GSI_BundleUserGuide.pdf GSI_ChemGuess_Mod.pdf PDF_DOCS = GSI_ChemGuess_Mod.pdf GSI_MetGuess_Mod.pdf PDF_DOCS = GSI_MetGuess_Mod.pdf esma_doc doc: $(PDF_DOCS) UG_SRCS = gsi_bundlemod.F90 GSI_BundleUserGuide.tex: $(UG_SRCS) $(PROTEX) -g ut_gsibundle.F90 > ut_gsibundle.tex $(PROTEX) -g -b -f $(UG_SRCS) > GSI_BundleUserGuide___.tex $(CAT) ut_gsibundle.tex GSI_BundleUserGuide___.tex > GSI_BundleUserGuide.tex GSI_ChemGuess_Mod.tex: gsi_chemguess_mod.F90 $(PROTEX) -g gsi_chemguess_mod.F90 > GSI_ChemGuess_Mod.tex GSI_MetGuess_Mod.tex: gsi_metguess_mod.F90 $(PROTEX) -g gsi_metguess_mod.F90 > GSI_MetGuess_Mod.tex # Hack to prevent remaking dep files during cleaning # -------------------------------------------------- ifneq ($(findstring clean,$(MAKECMDGOALS)),clean) -include $(DEPS) endif -include $(ESMADIR)/Config/ESMA_post.mk # ESMA additional targets, macros #.