Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/misc/netcdf/Makefile
3196 views
################################################
### Compiles the libraries, by Vili Forsell
################################################

##### MACROS

# Paths:
MODULE_PATH =./src/GridDataMapper/
GEN_PATH =./src/Generators/
POST_PATH =./src/Postprocess/

TMP_PATH =./tmp/
BACKUP_PATH =./Backup/
BIN_PATH =./bin/
SRC_PATH =./src/
TEST_PATH =./tests/
DOC_PATH =./doc/

VPATH = $(MODULE_PATH)

# Work directory; chosen to be called "data" and assumed to contain mesh files, ELMER_STARTINFO, case.sif, etc.
WORK_DIRECTORY = ./data/

ROOT_FILES = Makefile README

# The modules used by the main program
SOLVER_SRC = NetCDFGeneralUtils.f90 NetCDFGridUtils.f90 NetCDFInterpolate.f90 CustomTimeInterpolation.f90 MapperUtils.f90
SOLVER_OBJS =  $(SOLVER_SRC:.f90=.o)
SOLVER_MAIN = GridDataMapper.f90 cs2cs_interface.c
SOLVER_OUTFILE = GridLib.so

GEN_SRC = $(wildcard $(GEN_PATH)*.f90) $(wildcard $(GEN_PATH)*.cc)
GEN_OBJS = $(addsuffix .o, $(basename $(shell find $(GEN_PATH) -name *.cc )) $(basename $(shell find $(GEN_PATH) -name *.f90)) $(basename $(shell find $(GEN_PATH) -name *.c)) )
GEN_MAIN = $(addsuffix .o, $(basename $(GEN_SRC)))
# outputs to the file names themselves

POST_SRC = $(wildcard $(POST_PATH)*.f90) $(wildcard $(POST_PATH)*.cc)
POST_OBJS = $(addsuffix .o, $(basename $(shell find $(POST_PATH) -name *.cc )) $(basename $(shell find $(POST_PATH) -name *.f90)) $(basename $(shell find $(POST_PATH) -name *.c)) )
POST_MAIN = $(addsuffix .o, $(basename $(POST_SRC)))
# outputs to the file names of the root themselves

ALL_HEADERS = $(shell find $(SRC_PATH) -name *.hh) $(shell find $(SRC_PATH) -name *.h)
HEADER_PATHS = $(sort $(dir $(ALL_HEADERS))) # sort removes duplicates

# Compilers
COMPILER_F90 = elmerf90
COMPILER_F90_2 = gfortran
COMPILER_CXX = g++
COMPILER_C = gcc

# Includes NetCDF and such from the include directory
INCLUDE_FLAGS = -I/usr/include $(foreach hdr, $(HEADER_PATHS), -I$(hdr))
# NetCDF library path and flags to catch the necessary headers
LIBRARY_FLAGS = -L/usr/lib -lnetcdff -lnetcdf -lproj $(addprefix -L, $(TMP_PATH))
# The shared library (.so) for using in Elmer via a Solver Input File

# Packaging macros for easily transporting latest backups elsewhere
PACKET = GridMap.tar
TEST_PACKET = Tests
TAR_FLAGS = cf

##### RULES

# Builds the shared library for Elmer
solver: $(SOLVER_OBJS)
	@echo COMPILES THE GRID_DATA_MAPPER
	@$(COMPILER_F90) $(INCLUDE_FLAGS) $(LIBRARY_FLAGS) -J$(TMP_PATH) $(addprefix $(TMP_PATH), $^) $(addprefix $(MODULE_PATH), $(SOLVER_MAIN)) -o $(addprefix $(BIN_PATH), $(SOLVER_OUTFILE))

generator: $(GEN_OBJS)
	@echo COMPILES THE DATA/TEST GENERATORS
	@$(foreach file, $(notdir $(wildcard $(GEN_PATH)*.f90)), $(if $(file),$(COMPILER_F90_2) $(INCLUDE_FLAGS) $(LIBRARY_FLAGS) $(addprefix $(TMP_PATH), $(addsuffix .o, $(basename $(file)))) -o $(addprefix $(BIN_PATH), $(basename $(file)));))
	@$(foreach file, $(notdir $(wildcard $(GEN_PATH)*.cc)), $(if $(file), $(COMPILER_CXX) $(addprefix $(TMP_PATH), $(addsuffix .o, $(basename $(file)))) -o $(addprefix $(BIN_PATH), $(basename $(file)));))
	@$(foreach file, $(notdir $(wildcard $(GEN_PATH)*.c)), $(if $(file), $(COMPILER_C) $(addprefix $(TMP_PATH), $(addsuffix .o, $(basename $(file)))) -o $(addprefix $(BIN_PATH), $(basename $(file)));))

postprocessor: $(POST_OBJS) 
	@echo COMPILES THE POSTPROCESSOR
	@$(foreach file, $(notdir $(POST_MAIN)), $(COMPILER_CXX) $(addprefix $(TMP_PATH), $(notdir $(POST_OBJS))) -o $(addprefix $(BIN_PATH), $(basename $(file)));)

%.o: %.f90
	@$(COMPILER_F90) -c $(INCLUDE_FLAGS) $(LIBRARY_FLAGS) $? -J$(TMP_PATH) -o $(addprefix $(TMP_PATH), $(notdir $@))

%.o: %.cc
	@$(COMPILER_CXX) -c $(INCLUDE_FLAGS) $(LIBRARY_FLAGS) $? -J$(TMP_PATH) -o $(addprefix $(TMP_PATH), $(notdir $@))

%.o: %.c
	@$(COMPILER_C) -c $(INCLUDE_FLAGS) $(LIBRARY_FLAGS) $? -J$(TMP_PATH) -o $(addprefix $(TMP_PATH), $(notdir $@))

# Cleans extra stuff
clean:
	@rm $(TMP_PATH)* $(BIN_PATH)*

# Saves the work in a backup location
save:	pack
	@echo Saving files
	@- @cp -r $(DOC_PATH) $(SRC_PATH) $(ROOT_FILES) $(BACKUP_PATH)

# Too large to copy just as files; so they're compressed first
save_tests:
	@echo Packing all tests
	$(foreach folder, $(wildcard $(TEST_PATH)*), tar $(TAR_FLAGS) $(addprefix $(BACKUP_PATH), $(TEST_PACKET)_$(notdir $(folder)).tar) $(folder);)

# Packs the work for transportation
pack:
	@echo Packing development files
	@tar $(TAR_FLAGS) $(addprefix $(BACKUP_PATH), $(PACKET)) $(SRC_PATH) $(DOC_PATH) $(ROOT_FILES)