#-*-makefile-*-

include		Makefile.hdr

LDFLAGS =       $(NETCDFLIBS)
PLDFLAGS =	$(PNETCDFLIBS)

RM_LIST =	*.a *.o *.e *.mod core


all:		chimere prep chemprep domains

chimere:	pncvar libiso libtools libmodel main
		$(MPIFC) -o chimere.e $(FFLAGS_PNETCDF) $(OBJSmain)	\
		$(OBJSiso) $(OBJStools) $(OBJSmodel) $(OBJSpncvar)	\
		$(LDFLAGS) $(PLDFLAGS)

.PHONY:		chimere all main libiso libtools libmodel prep


#------------------------------------------------------------------------------
# specific format of isoropia files		
OBJSiso =	isocom.o isofwd.o isorev.o 

libiso: 	$(OBJSiso)

#------------------------------------------------------------------------------

OBJStools =	calendar.o io.o subs.o layave.o

SRCtools =      calendar io subs layave

libtools:
		for fic in ${SRCtools} ; do \
		echo $$fic ; \
			$(REALFC) -I. -o $$fic.o $(FFLAGS) -I. -c $$fic.F90 ; \
		done

#------------------------------------------------------------------------------

OBJSmodel =  chimere_consts.o chimere_params.o chimere_common.o interp_tools.o ncvar.o	\
	    	fjx_cmn_mod.o fjx_sub_mod.o atmphys.o 		\
	    	fjx_init_mod.o worker_message_subs.o absor.o integer_chemistry.o		\
	    	chemistry.o chem.o kern.o coagu.o depaero.o humidaero.o		\
	    	deposition.o depvel.o depwet.o emissions.o		\
	    	equilibrium.o searchinterv.o evaporation.o	\
	    	write_depo.o outprint.o worker_bc.o	prep_aemis.o prep_femis.o \
	    	renewhour.o readmetro.o readhour.o	\
	    	checkcfl.o calc_deepconv.o calc_tiedke.o calc_winw.o	\
	    	calc_turb.o met2chim.o worker_dust.o write_bemis.o write_semis.o write_demis.o	\
	    	diagbio_megan.o diagsalt_science.o worker_bio.o	worker_salt.o	\
	    	prep_temis.o meteo-prepwrf.o iniworker.o \
	    	interlin_N.o intermin.o interval.o	\
	    	locvalues.o inter_aeroorg.o nuclea.o		\
	    	nucleation.o photorates_fastj.o	resuspension.o	\
	    	physics.o phys_aerodiam.o iniconc.o calcqt.o phys_ph.o ppm.o		\
	    	rates.o sedim.o surfcalc.o twostep_mod.o splitting.o vanleer.o thermo.o		\
	    	thermow.o transmix.o prodloss.o prodloss_trans.o prodloss_aero.o 		\
	    	lidar.o vertav.o vtransport.o 	\
	    	wdeposition.o zenith.o worker.o  inichimere.o	\
	    	inicdf.o iniaero.o 		\
	    	inicoef.o  coagulation_kernel.o \
	    	profile.o inigeom.o inichem.o	\
	    	findspec.o inifastj.o inidepo.o iniemis.o ini_demis.o	\
	    	ini_bemis.o ini_semis.o iniout.o iniend.o 	\
	    	ini_norm.o inidepout.o inidoms.o geometry.o		\
	    	meteo-prep_bilin.o

libmodel:	pncvar ${OBJSmodel}

# specific rules of libmodel


# pgf90 preprocessor does not understand the "##" operator
ifeq	($(COMPILO),BROKEN_CPP)
worker_message_subs.o:		worker_message_subs.F90 chimere_params.o chimere_common.o
				$(CPP) worker_message_subs.F90 worker_message_subs.f 
				$(MPIFC) -o worker_message_subs.o $(FFLAGS_PNETCDF) -I.  -c worker_message_subs.f
				$(RM) worker_message_subs.f
endif

#------------------------------------------------------------------------------
OBJSmain =      chimere.o

main:		libmodel ${OBJSmain}
#------------------------------------------------------------------------------

OBJSprep =      chimere_consts.o chimere_params.o geometry.o interp_tools.o \
		chimere_common.o params_bc.o ncvar.o

prep:		${OBJStools} pncvar_common.o chimere_consts.o chimere_common.o geometry.o chimere_params.o chimere_consts.o interp_tools.o prep_bc.e prep_chimere.e prep_mie.e

pncvar_common.o:		chimere_params.o
pncvar.o:		chimere_consts.o chimere_params.o
interp_tools.o:		chimere_params.o

params_bc.o:		ncvar.o
prep_bc.o:		params_bc.o

prep_mie.o:		prep_mie.F90
			$(REALFC) -o prep_mie.o $(FFLAGS) -I. -c prep_mie.F90

prep_mie.e:		prep_mie.o spher.o
			$(REALFC) -o prep_mie.e prep_mie.o spher.o $(FFLAGS) ${OBJStools} $(NETCDFLIBS)

prep_bc.o:		prep_bc.F90
			$(REALFC) -o prep_bc.o $(FFLAGS) $(NORANGECHK) -c prep_bc.F90

spher.o:		spher.f
			$(REALFC) -o spher.o $(F77FLAGS) -c spher.f

# this .e rule only for the prep executable files to create
%.e:			%.o
			$(REALFC) -o $@ $<  $(FFLAGS) $(OBJSprep) $(LDFLAGS) $(OBJStools)
#------------------------------------------------------------------------------
OBJSmeteo-MM5 = 	meteo-prepmm5.o meteo-prep_bilin.o meteo-mm5_consts.o interp_tools.o geometry.o pncvar_common.o ncvar.o

meteo-MM5:	libtools prepmm5.e

prepmm5.e:	$(OBJSmeteo-MM5)
		$(REALFC) -o $@ $(OBJSmeteo-MM5) $(FFLAGS_BIG) $(LDFLAGS) ${OBJStools} $(NETCDFLIBS)

subs.o:		calendar.o

meteo-prepmm5.o:	meteo-prepmm5.F90 meteo-mm5_consts.o interp_tools.o geometry.o ncvar.o

meteo-prep_bilin.o:	interp_tools.o geometry.o
#------------------------------------------------------------------------------
OBJSmeteo-ECM = 	meteo-prepecm.o meteo-ecm_par.o meteo-ecm_consts.o meteo-prep_bilin.o interp_tools.o geometry.o pncvar_common.o ncvar.o

meteo-ecm:	prepecm.e

prepecm.e:	${OBJSmeteo-ECM}
		$(REALFC) -o $@ ${OBJSmeteo-ECM} $(LDFLAGS) $(FFLAGS) ${OBJStools} $(NETCDFLIBS) -L${GRIBLIB} -lgrib_api_f90 -lgrib_api

meteo-prepecm.o:	meteo-ecm_par.o meteo-ecm_consts.o calendar.o interp_tools.o pncvar_common.o ncvar.o

meteo-prep_bilin.o:	interp_tools.o
#------------------------------------------------------------------------------
chemprep:	libtools chemprep-families.e chemprep-distrib.e

chemprep-families.e:	chemprep-families.F90
			$(REALFC) -o $@ $(FFLAGS) $< ${OBJStools} $(NETCDFLIBS)
chemprep-distrib.e:	chemprep-distrib.F90
			$(REALFC) -o $@ $(FFLAGS) $< ${OBJStools} $(NETCDFLIBS)
#------------------------------------------------------------------------------
OBJSdomains = 	interp_tools.o pncvar_common.o ncvar.o geometry.o chimere_consts.o chimere_params.o
 
domains:	libtools domains-extract_landuse.e domains-remap_ef.e domains-extract_geog.e \
                domains-extract_z0.e domains-extract_mineral.e domains-extract_erod.e calcnxx.e

domains-extract_landuse.e:      domains-extract_landuse.o $(OBJSdomains)
		$(REALFC) -o $@ $<  $(OBJSdomains) $(LDFLAGS) $(FFLAGS) ${OBJStools} $(NETCDFLIBS)

domains-extract_landuse.o:      $(OBJSdomains)

subs.o:         calendar.mod

domains-extract_z0.e:     domains-extract_z0.o $(OBJSdomains)
		$(REALFC) -o $@ $<  $(OBJSdomains) $(FFLAGS) $(LDFLAGS) ${OBJStools} $(NETCDFLIBS)

domains-extract_z0.o:     $(OBJSdomains)

domains-remap_ef.e:	domains-remap_ef.o $(OBJSdomains)
		$(REALFC) -o $@ $<  $(OBJSdomains) $(FFLAGS) $(LDFLAGS) ${OBJStools} $(NETCDFLIBS)

domains-remap_ef.o:	$(OBJSdomains)

domains-extract_geog.e:		domains-extract_geog.o $(OBJSdomains)
		$(REALFC) -o $@ $<  $(OBJSdomains) $(LDFLAGS) $(FFLAGS) ${OBJStools} $(NETCDFLIBS)

domains-extract_geog.o:		$(OBJSdomains)

domains-extract_mineral.e:	       domains-extract_mineral.o $(OBJSdomains)
	       $(REALFC) -o $@ $<  $(OBJSdomains) $(LDFLAGS) $(FFLAGS) ${OBJStools} $(NETCDFLIBS)

domains-extract_mineral.o:	       $(OBJSdomains)

domains-extract_erod.e:	       domains-extract_erod.o $(OBJSdomains)
	       $(REALFC) -o $@ $<  $(OBJSdomains) $(LDFLAGS) $(FFLAGS) ${OBJStools} $(NETCDFLIBS)

domains-extract_erod.o:	       $(OBJSdomains)

%.o:		%.F90
		$(REALFC) -o $@  -c $< $(FFLAGS)

%.mod:          %.F90
		$(REALFC) -o $*.o $(FFLAGS) -c $<
#------------------------------------------------------------------------------
OBJSpncvar = 	pncvar_common.o pncvar.o

pncvar:		pncvar_common.o pncvar.o

pncvar.o:	pncvar.F90
		$(MPIFC) -o pncvar.o $(FFLAGS_PNETCDF) -c pncvar.F90
#------------------------------------------------------------------------------
# General rules

%.o:		%.F90
		$(MPIFC) -I. -o $@ $(FFLAGS) -c $< 

%.o:		%.f
		$(REALFC)  -o $@ $(F77FLAGS) -c $<

clean:
		$(RM) $(RM_LIST)
