makefile 14.8 KB
Newer Older
Matthias Langer's avatar
 
Matthias Langer committed
1
SHELL = /bin/bash
2
3
4
5
6
7
################################################################################
#  DESCRIPTION
#    Makefile for FLEXPART. Standard (serial) and parallel (MPI) version
#
#    Dependencies are resolved in this makefile, so parallel make is
#    possible ("make -j")
8
9
10
11
12
#
#    At NILU we have installed gcc-4.9.1 and libraries under user /homevip/flexpart
#    ("ROOT_DIR")
#    To use gfortran version 4.9, add "gcc=4.9" to the make command, e.g.
#       'make -j ecmwf gcc=4.9',
13
#    also set environment variable LD_LIBRARY_PATH to point to compiler libraries
14
15
16
17
18
19
20
21
#
#    Makefile was modified to produce unified executable for both ECMWF and GFS meteo data formats
#    gributils were included to detect format of meteo data
#
#    Cpp directives USE_MPIINPLACE were added to three source files. The effect of these directives 
#    are to enable the MPI_IN_PLACE option only if compiled with a -DUSE_MPIINPLACE directive. 
#    Otherwise, a safer option (which requires the allocation of another array) is used by default. 
#    In makefile added the -x f95-cpp-input flag for compiling of cpp directives.
22
23
# 
#  USAGE
24
25
#    Compile serial FLEXPART 
#      make [-j] serial
26
#
27
28
#    Compile parallel FLEXPART 
#      make [-j] mpi
29
#     
30
31
#    Compile for debugging parallel FLEXPART
#      make [-j] mpi-dbg
32
#
33
34
35
36
#  NETCDF OUTPUT
#    To add support for output in netCDF format, append `ncf=yes` to the
#    `make` command
# 
37
################################################################################
Matthias Langer's avatar
 
Matthias Langer committed
38

Espen Sollum's avatar
Espen Sollum committed
39
40
#FPPFLAGS+=-DUSE_MPIINPLACE

41
## PROGRAMS
42
43
44
45
46
47
48
49
50
51
52
53
# Unified executable names
# The same executable is used for both ECMWF and GFS metdata

# Parallel processing executable
FLEXPART-MPI = FLEXPART_MPI

# Parallel processing executable with debugging info
FLEXPART-MPI-DBG = DBG_FLEXPART_MPI

# Serial processing executable
FLEXPART-SERIAL = FLEXPART

54

55
56


Espen Sollum's avatar
Espen Sollum committed
57

58
ifeq ($(gcc), 4.9)
59
# Compiled libraries under user ~flexpart, gfortran v4.9
60
	ROOT_DIR = /homevip/flexpart/
Espen Sollum's avatar
Espen Sollum committed
61
62
        F90       = gfortran
        MPIF90    = mpif90
63
64
65
	INCPATH1  = ${ROOT_DIR}/gcc-4.9.1/include	
	INCPATH2  = ${ROOT_DIR}/include
	LIBPATH1 = ${ROOT_DIR}/lib
66

67
else
68
	ROOT_DIR = /homevip/flexpart/
Espen Sollum's avatar
Espen Sollum committed
69
70
	F90       = /usr/bin/gfortran
	MPIF90    = /usr/bin/mpif90
71

Espen Sollum's avatar
Espen Sollum committed
72
	INCPATH1  = ${ROOT_DIR}/gcc-5.4.0/include
73
74
	INCPATH2  = /usr/include
	LIBPATH1 = ${ROOT_DIR}/gcc-5.4.0/lib
75
endif
76

77

78
79
80
81
82
### Enable netCDF output?
ifeq ($(ncf), yes)
	NCOPT = -DUSE_NCF -lnetcdff	
else
	NCOPT = -UUSE_NCF
83
endif
84

85

86

87
88
89
90
91
92
93

# INCPATH1 = $(GRIB_API_INCDIR)
# INCPATH2 = ${NETCDF_INCDIR}
# LIBPATH1 = $(GRIB_API_LIBDIR)
# LIBPATH2 = $(NETCDF_LIBDIR)


94
95
96
# path to gributils used to detect meteodata format
VPATH = gributils/

97
98
## OPTIMIZATION LEVEL
O_LEV = 2 # [0,1,2,3,g,s,fast]
99
O_LEV_DBG = g # [0,g]
100
101

## LIBRARIES
102
LIBS = -lgrib_api_f90 -lgrib_api -lm -ljasper $(NCOPT)
103

104
FFLAGS   = -I$(INCPATH1) -I$(INCPATH2) -O$(O_LEV) -g -cpp -m64 -mcmodel=medium -fconvert=little-endian -frecord-marker=4 -fmessage-length=0 -flto=jobserver -O$(O_LEV) $(NCOPT) $(FUSER)  #-Warray-bounds -fcheck=all # -march=native
105

106
DBGFLAGS = -I$(INCPATH1) -I$(INCPATH2) -O$(O_LEV_DBG) -g3 -ggdb3 -cpp -m64 -mcmodel=medium -fconvert=little-endian -frecord-marker=4 -fmessage-length=0 -flto=jobserver -O$(O_LEV_DBG) $(NCOPT) -fbacktrace   -Wall  -fdump-core $(FUSER)  #  -ffpe-trap=invalid,overflow,denormal,underflow,zero  -Warray-bounds -fcheck=all
107

108
109
LDFLAGS  = $(FFLAGS) -L$(LIBPATH1) -Wl,-rpath,$(LIBPATH1) $(LIBS) # -L$(LIBPATH2)
LDDEBUG  = $(DBGFLAGS) -L$(LIBPATH1) $(LIBS) # -L$(LIBPATH2)
Espen Sollum's avatar
Espen Sollum committed
110
111
112
113

# Default behaviour is to NOT use MPI-IN-PLACE.  This may be safer.
# DEFS = -DUSE_MPIINPLACE
DEFS =
114

Matthias Langer's avatar
 
Matthias Langer committed
115
MODOBJS = \
116
par_mod.o    		com_mod.o \
Matthias Langer's avatar
 
Matthias Langer committed
117
118
119
120
conv_mod.o              hanna_mod.o \
interpol_mod.o          cmapf_mod.o \
unc_mod.o               oh_mod.o \
xmass_mod.o             flux_mod.o \
121
point_mod.o             outg_mod.o \
122
mean_mod.o	 	random_mod.o \
Espen Sollum's avatar
Espen Sollum committed
123
class_gribfile_mod.o    class_vtable_mod.o
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139

MPI_MODOBJS = \
mpi_mod.o

## Serial versions (MPI version with same functionality and name '_mpi.f90' exists)
OBJECTS_SERIAL = \
	releaseparticles.o 	partoutput.o \
	conccalc.o \
	init_domainfill.o 	concoutput.o  \
	timemanager.o FLEXPART.o	\
	readpartpositions.o \
	partoutput_short.o		\
	concoutput_nest.o 	\
	boundcond_domainfill.o	\
	redist.o		\
	concoutput_surf.o	concoutput_surf_nest.o	\
140
141
	getfields.o \
        readwind_ecmwf.o
142
143
144
145
146
147
148
149
150
151
152
153

## For MPI version 
OBJECTS_MPI = releaseparticles_mpi.o partoutput_mpi.o \
	conccalc_mpi.o \
	init_domainfill_mpi.o concoutput_mpi.o 	\
	timemanager_mpi.o FLEXPART_MPI.o	\
	readpartpositions_mpi.o		\
	partoutput_short_mpi.o	 	\
	concoutput_nest_mpi.o 		\
	boundcond_domainfill_mpi.o	\
	redist_mpi.o		\
	concoutput_surf_mpi.o	concoutput_surf_nest_mpi.o	\
Espen Sollum's avatar
Espen Sollum committed
154
155
	getfields_mpi.o  \
        readwind_ecmwf.o
Matthias Langer's avatar
 
Matthias Langer committed
156

157
158
OBJECTS_NCF = netcdf_output_mod.o

Matthias Langer's avatar
 
Matthias Langer committed
159
OBJECTS = \
160
161
advance.o		initialize.o		\
writeheader.o		writeheader_txt.o  	\
162
writeprecip.o \
163
164
writeheader_surf.o     	assignland.o\
part0.o 		gethourlyOH.o\
Matthias Langer's avatar
 
Matthias Langer committed
165
166
caldate.o               partdep.o \
coordtrafo.o            psih.o \
167
168
raerod.o 		readcommand.o 	\
drydepokernel.o         readreceptors.o \
Matthias Langer's avatar
 
Matthias Langer committed
169
erf.o                   readavailable.o \
170
ew.o			readreleases.o  \
Sabine's avatar
Sabine committed
171
readdepo.o              get_vdep_prob.o   \
172
get_wetscav.o		readwind_gfs.o \
173
psim.o			outgrid_init.o 	\
174
outgrid_init_nest.o   	calcmatrix.o \
175
photo_O1D.o 		readlanduse.o \
Matthias Langer's avatar
 
Matthias Langer committed
176
177
interpol_wind.o         readoutgrid.o \
interpol_all.o          readpaths.o \
178
179
getrb.o                 obukhov.o \
getrc.o                 convmix.o \
Matthias Langer's avatar
 
Matthias Langer committed
180
getvdep.o               readspecies.o \
181
182
183
184
interpol_misslev.o      richardson.o \
scalev.o                verttransform_ecmwf.o \
pbl_profile.o           readOHfield.o \
juldate.o               verttransform_gfs.o \
Matthias Langer's avatar
 
Matthias Langer committed
185
186
interpol_vdep.o         interpol_rain.o \
hanna.o                 wetdepokernel.o \
187
calcpar.o               wetdepo.o \
Matthias Langer's avatar
 
Matthias Langer committed
188
hanna_short.o           windalign.o \
189
190
hanna1.o                gridcheck_ecmwf.o \
gridcheck_gfs.o         gridcheck_nests.o \
191
readwind_nests.o        calcpar_nests.o \
Matthias Langer's avatar
 
Matthias Langer committed
192
193
194
verttransform_nests.o   interpol_all_nests.o \
interpol_wind_nests.o   interpol_misslev_nests.o \
interpol_vdep_nests.o   interpol_rain_nests.o \
195
readageclasses.o        detectformat.o  \
Matthias Langer's avatar
 
Matthias Langer committed
196
197
calcfluxes.o            fluxoutput.o \
qvsat.o                 skplin.o \
198
convect43c.o            \
Matthias Langer's avatar
 
Matthias Langer committed
199
200
201
202
203
204
sort2.o                 distance.o \
centerofmass.o          plumetraj.o \
openouttraj.o           calcpv.o \
calcpv_nests.o          distance2.o \
clustering.o            interpol_wind_short.o \
interpol_wind_short_nests.o shift_field_0.o \
205
206
207
208
209
shift_field.o             \
openreceptors.o         \
readoutgrid_nest.o \
writeheader_nest.o writeheader_nest_surf.o \
wetdepokernel_nest.o \
Matthias Langer's avatar
 
Matthias Langer committed
210
211
212
drydepokernel_nest.o    zenithangle.o \
ohreaction.o            getvdep_nests.o \
initial_cond_calc.o     initial_cond_output.o \
213
214
dynamic_viscosity.o     get_settling.o	\
initialize_cbl_vel.o	re_initialize_particle.o \
215
216
217
218
219
cbl.o

ifeq ($(ncf), yes)
	OBJECTS	:= $(OBJECTS) $(OBJECTS_NCF)
endif
220
221
222

%.o: %.mod

223
224
225
# serial executable
serial: $(FLEXPART-SERIAL)
serial: FC := $(F90)
226

227
228
229
# parallel processing executable
mpi: $(FLEXPART-MPI)
mpi: FC := $(MPIF90)
230

231
232
233
234
235
# parallel processing with debugging info
mpi-dbg: $(FLEXPART-MPI-DBG)
mpi-dbg: FFLAGS := $(DBGFLAGS)
mpi-dbg: LDFLAGS:= $(LDDEBUG)
mpi-dbg: FC := $(MPIF90)
236

237
238
$(FLEXPART-SERIAL): $(MODOBJS) $(OBJECTS) $(OBJECTS_SERIAL)
	+$(FC) -o $@ $(MODOBJS) $(OBJECTS) $(OBJECTS_SERIAL) $(LDFLAGS)
Matthias Langer's avatar
 
Matthias Langer committed
239

240
$(FLEXPART-MPI): $(MODOBJS) $(MPI_MODOBJS) $(OBJECTS) $(OBJECTS_MPI)
241
	+$(FC) -o $@ $(MODOBJS) $(MPI_MODOBJS) $(OBJECTS) $(OBJECTS_MPI) \
242
	$(LDFLAGS)
243

244
$(FLEXPART-MPI-DBG): $(MODOBJS) $(MPI_MODOBJS) $(OBJECTS) $(OBJECTS_MPI)
245
	+$(FC) -o $@ $(MODOBJS) $(MPI_MODOBJS) $(OBJECTS) $(OBJECTS_MPI) \
246
	$(LDFLAGS)
Matthias Langer's avatar
 
Matthias Langer committed
247
248

%.o: %.f90
249
	+$(FC) -c $(FFLAGS) $<
Matthias Langer's avatar
 
Matthias Langer committed
250
251

clean:
252
	\rm -f *.o *.mod
Matthias Langer's avatar
 
Matthias Langer committed
253

254
cleanall:
255
256
	\rm -f *.o *.mod $(FLEXPART-MPI) $(FLEXPART-MPI-DBG) $(FLEXPART-SERIAL)

257
258
259
260

.SUFFIXES = $(SUFFIXES) .f90

## DEPENDENCIES
Sabine's avatar
Sabine committed
261
get_vdep_prob.o: cmapf_mod.o com_mod.o hanna_mod.o interpol_mod.o par_mod.o \
262
	point_mod.o random_mod.o
263
264
265
266
267
268
269
advance.o: cmapf_mod.o com_mod.o hanna_mod.o interpol_mod.o par_mod.o \
	point_mod.o random_mod.o
assignland.o: com_mod.o par_mod.o
boundcond_domainfill.o: com_mod.o par_mod.o point_mod.o random_mod.o
boundcond_domainfill_mpi.o: com_mod.o mpi_mod.o par_mod.o point_mod.o \
	random_mod.o
calcfluxes.o: com_mod.o flux_mod.o outg_mod.o par_mod.o
270
271
calcmatrix.o: com_mod.o conv_mod.o par_mod.o class_gribfile_mod.o
calcpar.o: com_mod.o par_mod.o class_gribfile_mod.o
272
273
274
275
276
277
278
279
280
281
282
calcpar_nests.o: com_mod.o par_mod.o
calcpv.o: com_mod.o par_mod.o
calcpv_nests.o: com_mod.o par_mod.o
caldate.o: par_mod.o
cbl.o: com_mod.o par_mod.o
centerofmass.o: par_mod.o
clustering.o: par_mod.o
cmapf_mod.o: par_mod.o
com_mod.o: par_mod.o
conccalc.o: com_mod.o outg_mod.o par_mod.o unc_mod.o
conccalc_mpi.o: com_mod.o mpi_mod.o outg_mod.o par_mod.o unc_mod.o
283
concoutput.o: com_mod.o outg_mod.o par_mod.o point_mod.o unc_mod.o mean_mod.o
284
concoutput_mpi.o: com_mod.o mpi_mod.o outg_mod.o par_mod.o point_mod.o \
285
286
	unc_mod.o mean_mod.o
concoutput_nest.o: com_mod.o outg_mod.o par_mod.o point_mod.o unc_mod.o mean_mod.o
287
concoutput_nest_mpi.o: com_mod.o mpi_mod.o outg_mod.o par_mod.o point_mod.o \
288
289
	unc_mod.o mean_mod.o
concoutput_surf.o: com_mod.o outg_mod.o par_mod.o point_mod.o unc_mod.o mean_mod.o
290
concoutput_surf_mpi.o: com_mod.o mpi_mod.o outg_mod.o par_mod.o point_mod.o \
291
292
	unc_mod.o mean_mod.o
concoutput_surf_nest.o: com_mod.o outg_mod.o par_mod.o point_mod.o unc_mod.o mean_mod.o
293
concoutput_surf_nest_mpi.o: com_mod.o mpi_mod.o outg_mod.o par_mod.o \
294
	point_mod.o unc_mod.o mean_mod.o
295
296
conv_mod.o: par_mod.o
convect43c.o: conv_mod.o par_mod.o
297
convmix.o: com_mod.o conv_mod.o flux_mod.o par_mod.o class_gribfile_mod.o
298
coordtrafo.o: com_mod.o par_mod.o point_mod.o
299
detectformat.o: com_mod.o par_mod.o class_gribfile_mod.o
300
301
302
303
304
distance.o: par_mod.o
distance2.o: par_mod.o
drydepokernel.o: com_mod.o par_mod.o unc_mod.o
drydepokernel_nest.o: com_mod.o par_mod.o unc_mod.o
erf.o: par_mod.o
305
FLEXPART.o: com_mod.o conv_mod.o par_mod.o point_mod.o random_mod.o netcdf_output_mod.o class_gribfile_mod.o
306
FLEXPART_MPI.o: com_mod.o conv_mod.o mpi_mod.o par_mod.o point_mod.o \
307
	random_mod.o netcdf_output_mod.o class_gribfile_mod.o
308
309
fluxoutput.o: com_mod.o flux_mod.o outg_mod.o par_mod.o
get_settling.o: com_mod.o par_mod.o
310
311
getfields.o: com_mod.o par_mod.o class_gribfile_mod.o
getfields_mpi.o: com_mod.o par_mod.o mpi_mod.o class_gribfile_mod.o
312
313
314
315
316
gethourlyOH.o: com_mod.o oh_mod.o par_mod.o
getrb.o: par_mod.o
getrc.o: com_mod.o par_mod.o
getvdep.o: com_mod.o par_mod.o
getvdep_nests.o: com_mod.o par_mod.o
Espen Sollum's avatar
Espen Sollum committed
317
318
319
gridcheck_ecmwf.o: cmapf_mod.o com_mod.o conv_mod.o par_mod.o class_vtable_mod.o
gridcheck_gfs.o: cmapf_mod.o com_mod.o conv_mod.o par_mod.o class_vtable_mod.o
gridcheck_nests.o: com_mod.o par_mod.o class_vtable_mod.o
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
gridcheck_orig_ecmwf.o: cmapf_mod.o com_mod.o conv_mod.o par_mod.o
hanna.o: com_mod.o hanna_mod.o par_mod.o
hanna1.o: com_mod.o hanna_mod.o par_mod.o
hanna_short.o: com_mod.o hanna_mod.o par_mod.o
init_domainfill.o: com_mod.o par_mod.o point_mod.o random_mod.o
init_domainfill_mpi.o: com_mod.o mpi_mod.o par_mod.o point_mod.o \
	random_mod.o
initial_cond_calc.o: com_mod.o outg_mod.o par_mod.o unc_mod.o
initial_cond_output.o: com_mod.o outg_mod.o par_mod.o point_mod.o unc_mod.o
initialize.o: com_mod.o hanna_mod.o interpol_mod.o par_mod.o random_mod.o
initialize_cbl_vel.o: com_mod.o par_mod.o random_mod.o
interpol_all.o: com_mod.o hanna_mod.o interpol_mod.o par_mod.o
interpol_all_nests.o: com_mod.o hanna_mod.o interpol_mod.o par_mod.o
interpol_misslev.o: com_mod.o hanna_mod.o interpol_mod.o par_mod.o
interpol_misslev_nests.o: com_mod.o hanna_mod.o interpol_mod.o par_mod.o
interpol_mod.o: par_mod.o
interpol_rain.o: par_mod.o
interpol_rain_nests.o: par_mod.o
interpol_vdep.o: com_mod.o interpol_mod.o par_mod.o
interpol_vdep_nests.o: com_mod.o interpol_mod.o par_mod.o
interpol_wind.o: com_mod.o interpol_mod.o par_mod.o
interpol_wind_nests.o: com_mod.o interpol_mod.o par_mod.o
interpol_wind_short.o: com_mod.o interpol_mod.o par_mod.o
interpol_wind_short_nests.o: com_mod.o interpol_mod.o par_mod.o
juldate.o: par_mod.o
345
mean_mod.o: par_mod.o
346
mpi_mod.o: com_mod.o par_mod.o unc_mod.o
347
netcdf_output_mod.o: com_mod.o outg_mod.o par_mod.o point_mod.o unc_mod.o mean_mod.o
348
obukhov.o: par_mod.o class_gribfile_mod.o
349
350
351
ohreaction.o: com_mod.o oh_mod.o par_mod.o
openouttraj.o: com_mod.o par_mod.o point_mod.o
openreceptors.o: com_mod.o par_mod.o
352
outg_mod.o: par_mod.o
353
354
355
356
357
358
359
360
361
outgrid_init.o: com_mod.o flux_mod.o oh_mod.o outg_mod.o par_mod.o unc_mod.o
outgrid_init_nest.o: com_mod.o outg_mod.o par_mod.o unc_mod.o
part0.o: par_mod.o
partdep.o: par_mod.o
partoutput.o: com_mod.o par_mod.o
partoutput_mpi.o: com_mod.o mpi_mod.o par_mod.o
partoutput_short.o: com_mod.o par_mod.o
partoutput_short_mpi.o: com_mod.o mpi_mod.o par_mod.o
pbl_profile.o: par_mod.o
362
plumetraj.o: com_mod.o par_mod.o point_mod.o mean_mod.o
363
364
365
366
367
368
369
370
371
psih.o: par_mod.o
psim.o: par_mod.o
raerod.o: par_mod.o
re_initialize_particle.o: com_mod.o par_mod.o
readageclasses.o: com_mod.o par_mod.o
readavailable.o: com_mod.o par_mod.o
readcommand.o: com_mod.o par_mod.o
readdepo.o: com_mod.o par_mod.o
readlanduse.o: com_mod.o par_mod.o
372
#readlanduse_int1.o: com_mod.o par_mod.o
373
374
375
376
377
378
379
380
381
readOHfield.o: com_mod.o oh_mod.o par_mod.o
readoutgrid.o: com_mod.o outg_mod.o par_mod.o
readoutgrid_nest.o: com_mod.o outg_mod.o par_mod.o
readpartpositions.o: com_mod.o par_mod.o random_mod.o
readpartpositions_mpi.o: com_mod.o mpi_mod.o par_mod.o random_mod.o
readpaths.o: com_mod.o par_mod.o
readreceptors.o: com_mod.o par_mod.o
readreleases.o: com_mod.o par_mod.o point_mod.o xmass_mod.o
readspecies.o: com_mod.o par_mod.o
Espen Sollum's avatar
Espen Sollum committed
382
383
384
readwind_ecmwf.o: com_mod.o par_mod.o class_vtable_mod.o
readwind_gfs.o: com_mod.o par_mod.o class_vtable_mod.o
readwind_nests.o: com_mod.o par_mod.o class_vtable_mod.o
385
386
387
388
389
390
redist.o: com_mod.o conv_mod.o par_mod.o random_mod.o
redist_mpi.o: com_mod.o conv_mod.o mpi_mod.o par_mod.o random_mod.o
releaseparticles.o: com_mod.o par_mod.o point_mod.o random_mod.o \
	xmass_mod.o
releaseparticles_mpi.o: com_mod.o mpi_mod.o par_mod.o point_mod.o \
	random_mod.o xmass_mod.o
391
richardson.o: par_mod.o class_gribfile_mod.o
392
393
394
395
396
397
scalev.o: par_mod.o
shift_field.o: par_mod.o
shift_field_0.o: par_mod.o
timemanager.o: com_mod.o flux_mod.o netcdf_output_mod.o oh_mod.o outg_mod.o \
	par_mod.o point_mod.o unc_mod.o xmass_mod.o
timemanager_mpi.o: com_mod.o flux_mod.o mpi_mod.o oh_mod.o outg_mod.o \
398
	par_mod.o point_mod.o unc_mod.o xmass_mod.o netcdf_output_mod.o	
399
unc_mod.o: par_mod.o
400
verttransform_ecmwf.o: cmapf_mod.o com_mod.o par_mod.o 
401
402
verttransform_gfs.o: cmapf_mod.o com_mod.o par_mod.o
verttransform_nests.o: com_mod.o par_mod.o
Sabine's avatar
Sabine committed
403
get_wetscav.o: com_mod.o par_mod.o point_mod.o
404
405
406
407
wetdepo.o: com_mod.o par_mod.o point_mod.o
wetdepokernel.o: com_mod.o par_mod.o unc_mod.o
wetdepokernel_nest.o: com_mod.o par_mod.o unc_mod.o
writeheader.o: com_mod.o outg_mod.o par_mod.o point_mod.o
408
writeprecip.o: com_mod.o par_mod.o point_mod.o
409
410
411
412
413
writeheader_nest.o: com_mod.o outg_mod.o par_mod.o point_mod.o
writeheader_nest_surf.o: com_mod.o outg_mod.o par_mod.o point_mod.o
writeheader_surf.o: com_mod.o outg_mod.o par_mod.o point_mod.o
writeheader_txt.o: com_mod.o outg_mod.o par_mod.o point_mod.o
zenithangle.o: par_mod.o