makefile 14.9 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

39
## PROGRAMS
40
41
42
43
44
45
46
47
48
49
50
51
# 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

52

53
ifeq ($(gcc), 4.9)
54
# Compiled libraries under user ~flexpart, gfortran v4.9
55
56
57
58
59
60
61
62
	ROOT_DIR = /homevip/flexpart/

	F90	  = ${ROOT_DIR}/gcc-4.9.1/bin/gfortran
	MPIF90    = ${ROOT_DIR}/bin/mpifort

	INCPATH1  = ${ROOT_DIR}/gcc-4.9.1/include	
	INCPATH2  = ${ROOT_DIR}/include
	LIBPATH1 = ${ROOT_DIR}/lib
63
else 
64
65
66
67
68
69
70
71
72
# Compiled libraries under user ~flexpart, gfortran v5.4
	ROOT_DIR = /homevip/flexpart/

	F90	  = /usr/bin/gfortran
	MPIF90    = /usr/bin/mpifort

	INCPATH1  = ${ROOT_DIR}/gcc-5.4.0/include	
	INCPATH2  = /usr/include
	LIBPATH1 = ${ROOT_DIR}/gcc-5.4.0/lib
73
endif
74

75

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

83

84

85
86
87
88
# path to gributils used to detect meteodata format
VPATH = gributils/


89
90
## OPTIMIZATION LEVEL
O_LEV = 2 # [0,1,2,3,g,s,fast]
91
O_LEV_DBG = g # [0,g]
92
93

## LIBRARIES
94
95
#LIBS = -lgrib_api_f90 -lgrib_api -lm -ljasper -lnetcdff
LIBS = -lgrib_api_f90 -lgrib_api -lm -ljasper $(NCOPT)
96

97
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
98

99
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
100

Espen Sollum's avatar
Espen Sollum committed
101
LDFLAGS  = $(FFLAGS) -L$(LIBPATH1) -Wl,-rpath,$(LIBPATH1) $(LIBS) #-L$(LIBPATH2)
102
LDDEBUG  = $(DBGFLAGS) -L$(LIBPATH1) $(LIBS) #-L$(LIBPATH2)
103

Matthias Langer's avatar
 
Matthias Langer committed
104
MODOBJS = \
105
par_mod.o    		com_mod.o \
Matthias Langer's avatar
 
Matthias Langer committed
106
107
108
109
conv_mod.o              hanna_mod.o \
interpol_mod.o          cmapf_mod.o \
unc_mod.o               oh_mod.o \
xmass_mod.o             flux_mod.o \
110
point_mod.o             outg_mod.o \
111
112
mean_mod.o	 	random_mod.o \
class_gribfile_mod.o
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128

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	\
129
130
	getfields.o \
        readwind_ecmwf.o
131
132
133
134
135
136
137
138
139
140
141
142

## 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	\
143
144
	getfields_mpi.o \
        readwind_ecmwf_mpi.o 
Matthias Langer's avatar
 
Matthias Langer committed
145

146
147
OBJECTS_NCF = netcdf_output_mod.o

Matthias Langer's avatar
 
Matthias Langer committed
148
OBJECTS = \
149
150
advance.o		initialize.o		\
writeheader.o		writeheader_txt.o  	\
151
writeprecip.o \
152
153
writeheader_surf.o     	assignland.o\
part0.o 		gethourlyOH.o\
Matthias Langer's avatar
 
Matthias Langer committed
154
155
caldate.o               partdep.o \
coordtrafo.o            psih.o \
156
157
raerod.o 		readcommand.o 	\
drydepokernel.o         readreceptors.o \
Matthias Langer's avatar
 
Matthias Langer committed
158
erf.o                   readavailable.o \
159
ew.o			readreleases.o  \
Sabine's avatar
Sabine committed
160
readdepo.o              get_vdep_prob.o   \
161
get_wetscav.o		readwind_gfs.o \
162
psim.o			outgrid_init.o 	\
163
outgrid_init_nest.o   	calcmatrix.o \
164
photo_O1D.o 		readlanduse.o \
Matthias Langer's avatar
 
Matthias Langer committed
165
166
interpol_wind.o         readoutgrid.o \
interpol_all.o          readpaths.o \
167
168
getrb.o                 obukhov.o \
getrc.o                 convmix.o \
Matthias Langer's avatar
 
Matthias Langer committed
169
getvdep.o               readspecies.o \
170
171
172
173
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
174
175
interpol_vdep.o         interpol_rain.o \
hanna.o                 wetdepokernel.o \
176
calcpar.o               wetdepo.o \
Matthias Langer's avatar
 
Matthias Langer committed
177
hanna_short.o           windalign.o \
178
179
hanna1.o                gridcheck_ecmwf.o \
gridcheck_gfs.o         gridcheck_nests.o \
180
readwind_nests.o        calcpar_nests.o \
Matthias Langer's avatar
 
Matthias Langer committed
181
182
183
verttransform_nests.o   interpol_all_nests.o \
interpol_wind_nests.o   interpol_misslev_nests.o \
interpol_vdep_nests.o   interpol_rain_nests.o \
184
readageclasses.o        detectformat.o  \
Matthias Langer's avatar
 
Matthias Langer committed
185
186
calcfluxes.o            fluxoutput.o \
qvsat.o                 skplin.o \
187
convect43c.o            \
Matthias Langer's avatar
 
Matthias Langer committed
188
189
190
191
192
193
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 \
194
195
196
197
198
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
199
200
201
drydepokernel_nest.o    zenithangle.o \
ohreaction.o            getvdep_nests.o \
initial_cond_calc.o     initial_cond_output.o \
202
203
dynamic_viscosity.o     get_settling.o	\
initialize_cbl_vel.o	re_initialize_particle.o \
204
205
206
207
208
cbl.o

ifeq ($(ncf), yes)
	OBJECTS	:= $(OBJECTS) $(OBJECTS_NCF)
endif
209
210
211

%.o: %.mod

212
213
214
# serial executable
serial: $(FLEXPART-SERIAL)
serial: FC := $(F90)
215

216
217
218
# parallel processing executable
mpi: $(FLEXPART-MPI)
mpi: FC := $(MPIF90)
219

220
221
222
223
224
# parallel processing with debugging info
mpi-dbg: $(FLEXPART-MPI-DBG)
mpi-dbg: FFLAGS := $(DBGFLAGS)
mpi-dbg: LDFLAGS:= $(LDDEBUG)
mpi-dbg: FC := $(MPIF90)
225

226
227
$(FLEXPART-SERIAL): $(MODOBJS) $(OBJECTS) $(OBJECTS_SERIAL)
	+$(FC) -o $@ $(MODOBJS) $(OBJECTS) $(OBJECTS_SERIAL) $(LDFLAGS)
Matthias Langer's avatar
 
Matthias Langer committed
228

229
$(FLEXPART-MPI): $(MODOBJS) $(MPI_MODOBJS) $(OBJECTS) $(OBJECTS_MPI)
230
	+$(FC) -o $@ $(MODOBJS) $(MPI_MODOBJS) $(OBJECTS) $(OBJECTS_MPI) \
231
	$(LDFLAGS)
232

233
$(FLEXPART-MPI-DBG): $(MODOBJS) $(MPI_MODOBJS) $(OBJECTS) $(OBJECTS_MPI)
234
	+$(FC) -o $@ $(MODOBJS) $(MPI_MODOBJS) $(OBJECTS) $(OBJECTS_MPI) \
235
	$(LDFLAGS)
Matthias Langer's avatar
 
Matthias Langer committed
236
237

%.o: %.f90
238
	+$(FC) -c $(FFLAGS) $<
Matthias Langer's avatar
 
Matthias Langer committed
239
240

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

243
cleanall:
244
245
	\rm -f *.o *.mod $(FLEXPART-MPI) $(FLEXPART-MPI-DBG) $(FLEXPART-SERIAL)

246
247
248
249

.SUFFIXES = $(SUFFIXES) .f90

## DEPENDENCIES
Sabine's avatar
Sabine committed
250
get_vdep_prob.o: cmapf_mod.o com_mod.o hanna_mod.o interpol_mod.o par_mod.o \
251
	point_mod.o random_mod.o
252
253
254
255
256
257
258
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
259
260
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
261
262
263
264
265
266
267
268
269
270
271
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
272
concoutput.o: com_mod.o outg_mod.o par_mod.o point_mod.o unc_mod.o mean_mod.o
273
concoutput_mpi.o: com_mod.o mpi_mod.o outg_mod.o par_mod.o point_mod.o \
274
275
	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
276
concoutput_nest_mpi.o: com_mod.o mpi_mod.o outg_mod.o par_mod.o point_mod.o \
277
278
	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
279
concoutput_surf_mpi.o: com_mod.o mpi_mod.o outg_mod.o par_mod.o point_mod.o \
280
281
	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
282
concoutput_surf_nest_mpi.o: com_mod.o mpi_mod.o outg_mod.o par_mod.o \
283
	point_mod.o unc_mod.o mean_mod.o
284
285
conv_mod.o: par_mod.o
convect43c.o: conv_mod.o par_mod.o
286
convmix.o: com_mod.o conv_mod.o flux_mod.o par_mod.o class_gribfile_mod.o
287
coordtrafo.o: com_mod.o par_mod.o point_mod.o
288
detectformat.o: com_mod.o par_mod.o class_gribfile_mod.o
289
290
291
292
293
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
294
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
295
FLEXPART_MPI.o: com_mod.o conv_mod.o mpi_mod.o par_mod.o point_mod.o \
296
	random_mod.o netcdf_output_mod.o class_gribfile_mod.o
297
298
fluxoutput.o: com_mod.o flux_mod.o outg_mod.o par_mod.o
get_settling.o: com_mod.o par_mod.o
299
300
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
301
302
303
304
305
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
306
gridcheck_ecmwf.o: cmapf_mod.o com_mod.o conv_mod.o par_mod.o
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
gridcheck_emos.o: com_mod.o conv_mod.o par_mod.o
gridcheck_fnl.o: cmapf_mod.o com_mod.o conv_mod.o par_mod.o
gridcheck_gfs.o: cmapf_mod.o com_mod.o conv_mod.o par_mod.o
gridcheck_gfs_emos.o: com_mod.o conv_mod.o par_mod.o
gridcheck_nests.o: com_mod.o par_mod.o
gridcheck_nests_emos.o: com_mod.o par_mod.o
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
338
mean_mod.o: par_mod.o
339
mpi_mod.o: com_mod.o par_mod.o unc_mod.o
340
netcdf_output_mod.o: com_mod.o outg_mod.o par_mod.o point_mod.o unc_mod.o mean_mod.o
341
obukhov.o: par_mod.o class_gribfile_mod.o
342
343
344
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
345
outg_mod.o: par_mod.o
346
347
348
349
350
351
352
353
354
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
355
plumetraj.o: com_mod.o par_mod.o point_mod.o mean_mod.o
356
357
358
359
360
361
362
363
364
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
365
#readlanduse_int1.o: com_mod.o par_mod.o
366
367
368
369
370
371
372
373
374
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
375
readwind_ecmwf.o: com_mod.o par_mod.o
376
377
378
readwind_emos.o: com_mod.o par_mod.o
readwind_gfs.o: com_mod.o par_mod.o
readwind_gfs_emos.o: com_mod.o par_mod.o
379
readwind_ecmwf_mpi.o: com_mod.o mpi_mod.o par_mod.o
380
381
382
383
384
385
386
387
readwind_nests.o: com_mod.o par_mod.o
readwind_nests_emos.o: com_mod.o par_mod.o
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
388
richardson.o: par_mod.o class_gribfile_mod.o
389
390
391
392
393
394
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 \
395
	par_mod.o point_mod.o unc_mod.o xmass_mod.o netcdf_output_mod.o	
396
unc_mod.o: par_mod.o
397
verttransform_ecmwf.o: cmapf_mod.o com_mod.o par_mod.o 
398
399
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
400
get_wetscav.o: com_mod.o par_mod.o point_mod.o
401
402
403
404
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
405
writeprecip.o: com_mod.o par_mod.o point_mod.o
406
407
408
409
410
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