#########################################################################################################
#                                     Makefile for KOHONEN MAP
#########################################################################################################
Inc = "/work/apps/intel_2016/netcdf/4.3.3.1/"

#.SUFFIXES: .f90 .o

#.f90.o:

#hw: HW.f90 
#       $(FC) -o hw.exe HW.f90 -L ${Inc}lib/ -lnetcdff -I ${Inc}include/
#
#       hie: Hierachical_Clustering.f90
#               $(FC) -o h.exe Hierachical_Clustering.f90 -L ${Inc}lib/ -lnetcdff -I ${Inc}include/
#
#               #
# Comments
# - documentation requires robodoc and latex (pdflatex)
# - option -pg is to create info for gprof program
#
#########################################################################################################
FF = ifort # gfortran
FFLAGS= #-c -g -pg -std=f2003 -Wall -fall-intrinsics -fbounds-check 
OFLAGS= #-g -pg -std=f2003 -Wall -fall-intrinsics -fbounds-check  -o
RD = robodoc.exe 
RDFLAGS1 = #--src
RDFLAGS2 = #--doc 
RDFLAGS3 = #--singlefile --latex --sections --altlatex
PDF = pdflatex
########################################################################################################
#        Base classes
########################################################################################################

general_utilities.o: general_utilities.f90
	$(FF) $(FFLAGS) -L ${Inc}lib/ -lnetcdff -I ${Inc}include/ $<
#
kohonen_layer_parameters_utilities.o: kohonen_layer_parameters_utilities.f90
	$(FF) $(FFLAGS) -L ${Inc}lib/ -lnetcdff -I ${Inc}include/ $^
#
kohonen_prototype_utilities.o: kohonen_prototype_utilities.f90 distance_base_utilities.o
	$(FF) $(FFLAGS) -L ${Inc}lib/ -lnetcdff -I ${Inc}include/ $<
#
kohonen_pattern_utilities.o: kohonen_pattern_utilities.f90 kohonen_prototype_utilities.o
	$(FF) $(FFLAGS) -L ${Inc}lib/ -lnetcdff -I ${Inc}include/ $<
#
kohonen_map_base_utilities.o: kohonen_map_base_utilities.f90 kohonen_layer_parameters_utilities.o kohonen_pattern_utilities.o
	$(FF) $(FFLAGS) $<
#
self_organized_map_utilities.o: self_organized_map_utilities.f90 kohonen_layer_parameters_utilities.o kohonen_map_base_utilities.o kohonen_prototype_utilities.o distance_base_utilities.o factory_distance_utilities.o mtmod.o euclidean_distance_utilities.o influence_function_utilities.o quicksort_utilities.o sort_base_utilities.o general_utilities.o 
	$(FF) $(FFLAGS) -L ${Inc}lib/ -lnetcdff -I ${Inc}include/ $<
#
distance_base_utilities.o: distance_base_utilities.f90
	$(FF) $(FFLAGS) -L ${Inc}lib/ -lnetcdff -I ${Inc}include/ $<
#
euclidean_distance_utilities.o: euclidean_distance_utilities.f90 distance_base_utilities.o
	$(FF) $(FFLAGS) -L ${Inc}lib/ -lnetcdff -I ${Inc}include/ $<
#
factory_distance_utilities.o: factory_distance_utilities.f90 euclidean_distance_utilities.o 
	$(FF) $(FFLAGS) -L ${Inc}lib/ -lnetcdff -I ${Inc}include/ $<	
#
influence_function_utilities.o: influence_function_utilities.f90 
	$(FF) $(FFLAGS) -L ${Inc}lib/ -lnetcdff -I ${Inc}include/ $<	
#
two_level_self_organized_map_utilities.o: two_level_self_organized_map_utilities.f90 kohonen_layer_parameters_utilities.o \
kohonen_map_base_utilities.o kohonen_prototype_utilities.o distance_base_utilities.o factory_distance_utilities.o mtmod.o
	$(FF) $(FFLAGS) -L ${Inc}lib/ -lnetcdff -I ${Inc}include/ $<

som_train_variables.o: som_train_variables.f90 kohonen_layer_parameters_utilities.o kohonen_map_base_utilities.o \
kohonen_prototype_utilities.o kohonen_pattern_utilities.o self_organized_map_utilities.o
	$(FF) $(FFLAGS) -L ${Inc}lib/ -lnetcdff -I ${Inc}include/ $<

som_predict_variables.o: som_predict_variables.f90 kohonen_layer_parameters_utilities.o kohonen_map_base_utilities.o \
kohonen_prototype_utilities.o kohonen_pattern_utilities.o self_organized_map_utilities.o
	$(FF) $(FFLAGS) -L ${Inc}lib/ -lnetcdff -I ${Inc}include/ $<

two_level_som_train_variables.o: two_level_som_train_variables.f90 kohonen_layer_parameters_utilities.o kohonen_map_base_utilities.o \
kohonen_prototype_utilities.o kohonen_pattern_utilities.o two_level_self_organized_map_utilities.o
	$(FF) $(FFLAGS) -L ${Inc}lib/ -lnetcdff -I ${Inc}include/ $^

mtmod.o: mtmod.f90
	$(FF) $(FFLAGS) -L ${Inc}lib/ -lnetcdff -I ${Inc}include/ $^

two_level_som_estimate_variables.o: two_level_som_estimate_variables.f90 kohonen_layer_parameters_utilities.o \
kohonen_map_base_utilities.o kohonen_prototype_utilities.o kohonen_pattern_utilities.o two_level_self_organized_map_utilities.o \
mtmod.o
	$(FF) $(FFLAGS) -L ${Inc}lib/ -lnetcdff -I ${Inc}include/ $^
#
sort_base_utilities.o: sort_base_utilities.f90
	$(FF) $(FFLAGS) -L ${Inc}lib/ -lnetcdff -I ${Inc}include/ $^
#
quicksort_utilities.o: quicksort_utilities.f90 sort_base_utilities.o
	$(FF) $(FFLAGS) -L ${Inc}lib/ -lnetcdff -I ${Inc}include/ $^  
########################################################################################################
#                                  Executable Files
########################################################################################################

all: som_train som_predict two_level_som_train two_level_som_estimate rsomlib

som_train: som_train.f90 som_train_variables.o self_organized_map_utilities.o kohonen_layer_parameters_utilities.o \
kohonen_map_base_utilities.o kohonen_prototype_utilities.o kohonen_pattern_utilities.o mtmod.o distance_base_utilities.o \
factory_distance_utilities.o euclidean_distance_utilities.o influence_function_utilities.o quicksort_utilities.o \
sort_base_utilities.o general_utilities.o 
	$(FF) $^ $(OFLAGS) -L ${Inc}lib/ -lnetcdff -I ${Inc}include/ $@

som_predict: som_predict.f90 som_predict_variables.o self_organized_map_utilities.o kohonen_layer_parameters_utilities.o \
kohonen_map_base_utilities.o kohonen_prototype_utilities.o kohonen_pattern_utilities.o distance_base_utilities.o \
factory_distance_utilities.o euclidean_distance_utilities.o  mtmod.o quicksort_utilities.o sort_base_utilities.o
	$(FF) $^  $(OFLAGS) -L ${Inc}lib/ -lnetcdff -I ${Inc}include/ $@

two_level_som_train: two_level_som_train.f90 two_level_som_train_variables.o two_level_self_organized_map_utilities.o \
kohonen_layer_parameters_utilities.o kohonen_map_base_utilities.o kohonen_prototype_utilities.o kohonen_pattern_utilities.o \
distance_base_utilities.o factory_distance_utilities.o euclidean_distance_utilities.o  mtmod.o
	$(FF) $^ $(OFLAGS) -L ${Inc}lib/ -lnetcdff -I ${Inc}include/ $@

two_level_som_estimate: two_level_som_estimate.f90 two_level_som_estimate_variables.o two_level_self_organized_map_utilities.o \
kohonen_layer_parameters_utilities.o kohonen_map_base_utilities.o kohonen_prototype_utilities.o kohonen_pattern_utilities.o \
distance_base_utilities.o factory_distance_utilities.o euclidean_distance_utilities.o  mtmod.o
	$(FF) $^  $(OFLAGS) -L ${Inc}lib/ -lnetcdff -I ${Inc}include/ $@
	
rsomlib: self_organized_map_utilities.f90 kohonen_layer_parameters_utilities.f90 kohonen_map_base_utilities.f90 \
kohonen_prototype_utilities.f90 kohonen_pattern_utilities.f90 mtmod.f90 distance_base_utilities.f90 factory_distance_utilities.f90 \
euclidean_distance_utilities.f90 influence_function_utilities.f90 quicksort_utilities.f90 sort_base_utilities.f90  \
general_utilities.f90
	rm *.o
	R CMD SHLIB self_organized_map_utilities.f90 kohonen_layer_parameters_utilities.f90 kohonen_map_base_utilities.f90 kohonen_prototype_utilities.f90 kohonen_pattern_utilities.f90 mtmod.f90 distance_base_utilities.f90 factory_distance_utilities.f90 euclidean_distance_utilities.f90 influence_function_utilities.f90 quicksort_utilities.f90 sort_base_utilities.f90  general_utilities.f90 -fPIC 
	rm *.o
#
libkohonen: self_organized_map_utilities.f90 kohonen_layer_parameters_utilities.f90 kohonen_map_base_utilities.f90 \
kohonen_prototype_utilities.f90 kohonen_pattern_utilities.f90 mtmod.f90 distance_base_utilities.f90 factory_distance_utilities.f90 \
euclidean_distance_utilities.f90  general_utilities.f90
	$(FF) -shared -s -static-libgcc -o self_organized_map_utilities1.dll $^ 

###################################################################################################
####
###################################################################################################
clean:
	rm *.o
	rm *.mod
	rm *.pdf 
	rm *.tex
	rm kohonen_doc.*

###################################################################################################
####                                     Documentation
###################################################################################################
.PHONY: kohonen_doc
KohonenF03_doc:
	$(RD) --src C:\\GITProjects\\KohonenF03 --doc $@ --singledoc --latex --sections --rc robodoc.rc --altlatex  
	$(PDF) $@.tex
#
.PHONY:docs
docs:
	$(RD) --src C:\\GITProjects\\KohonenF03 --doc $@ --multidoc --index --html

