CC?=gcc
FC = mpif90
LD?=ld
PYTHON?=python3

BLOCKSIZE?=16

TERMSPEC?=code_gen/terms.input

ifdef CHECK
flags += -fcheck=all
endif

ifdef DEBUG
flags += -g
else
flags += -O3
endif

flags += -cpp -DBLOCKSIZE=$(BLOCKSIZE) -Wall -ffree-line-length-0 -fdefault-integer-8 -fdefault-double-8 -fdefault-real-8 -march=native -fallow-argument-mismatch


# Modules
MODULES += \
    m_openmpi.o\
    Compact.o\
    m_parameters.o\
    m_calculate.o\
    m_arrays.o\
    m_terms.o\
    m_build_info.o\
    post.o

# Objects
OBJ     = post_dns.o

Post_Cbar_FSD_Incomp : x-edge-cold-bc-uPrime-hybrid

x-edge-cold-bc-uPrime-hybrid : ${MODULES} ${OBJ}
	${FC} -o x-edge-cold-bc-uPrime-hybrid ${flags} ${MODULES} ${OBJ}

${OBJ} : ${MODULES}

m_terms.f90 : code_gen/code_gen.py ${TERMSPEC} code_gen/resources/m_template.py
	${PYTHON} code_gen/code_gen.py ${TERMSPEC} > $@

%.o: %.f90
	${FC} -c ${flags} $<

cleanAll: clean
	rm -f m_terms.f90 m_build_info.f90

clean:
	rm -f *.o *.odata *.mod x-edge-cold-bc-uPrime-hybrid test_calculate test_compact benchmark_transpose build_info.txt latex_equations.txt

test : test_calculate
	./test_calculate

test_field : test_field.o m_openmpi.o m_parameters.o Compact.o m_calculate.o m_arrays.o 
	${FC} -o test_field ${flags} m_openmpi.o m_parameters.o Compact.o m_calculate.o m_arrays.o test_field.o

test_calculate : test_calculate.o
	${FC} -o test_calculate ${flags} m_openmpi.o m_parameters.o Compact.o m_calculate.o test_calculate.o

test_calculate.o : m_openmpi.o m_parameters.o Compact.o m_calculate.o

benchmark_transpose : benchmark_transpose.o
	${FC} -o benchmark_transpose ${flags} m_openmpi.o m_parameters.o Compact.o m_calculate.o benchmark_transpose.o

benchmark_transpose.o : m_openmpi.o m_parameters.o Compact.o m_calculate.o

test_compact : Compact.o test_compact.o
	${FC} -o test_compact ${flags} Compact.o test_compact.o

test_compact.o : Compact.o

m_build_info.f90 : ${TERMSPEC} code_gen/code_gen.py code_gen/post.py
	${PYTHON} code_gen/code_gen.py -m ${TERMSPEC} > $@
