testing the new dap predictor

pull/73/head
jonsowman 2010-05-26 23:01:47 +01:00
rodzic d25a932b74
commit ae8ad20ab6
51 zmienionych plików z 6026 dodań i 0 usunięć

Wyświetl plik

@ -0,0 +1,23 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 2.6
# Relative path conversion top directories.
SET(CMAKE_RELATIVE_PATH_TOP_SOURCE "/var/hab/cusf-landing-prediction")
SET(CMAKE_RELATIVE_PATH_TOP_BINARY "/var/hab/cusf-landing-prediction")
# Force unix paths in dependencies.
SET(CMAKE_FORCE_UNIX_PATHS 1)
# The C and CXX include file search paths:
SET(CMAKE_C_INCLUDE_PATH
"/usr/include/glib-2.0"
"/usr/lib/glib-2.0/include"
)
SET(CMAKE_CXX_INCLUDE_PATH ${CMAKE_C_INCLUDE_PATH})
SET(CMAKE_Fortran_INCLUDE_PATH ${CMAKE_C_INCLUDE_PATH})
# The C and CXX include file regular expressions for this directory.
SET(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$")
SET(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$")
SET(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN})
SET(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN})

Wyświetl plik

@ -0,0 +1,616 @@
#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">])
#IncludeRegexScan: ^.*$
#IncludeRegexComplain: ^$
/usr/include/glib-2.0/glib.h
glib/galloca.h
-
glib/garray.h
-
glib/gasyncqueue.h
-
glib/gatomic.h
-
glib/gbacktrace.h
-
glib/gbase64.h
-
glib/gbookmarkfile.h
-
glib/gcache.h
-
glib/gchecksum.h
-
glib/gcompletion.h
-
glib/gconvert.h
-
glib/gdataset.h
-
glib/gdate.h
-
glib/gdir.h
-
glib/gerror.h
-
glib/gfileutils.h
-
glib/ghash.h
-
glib/ghook.h
-
glib/giochannel.h
-
glib/gkeyfile.h
-
glib/glist.h
-
glib/gmacros.h
-
glib/gmain.h
-
glib/gmappedfile.h
-
glib/gmarkup.h
-
glib/gmem.h
-
glib/gmessages.h
-
glib/gnode.h
-
glib/goption.h
-
glib/gpattern.h
-
glib/gprimes.h
-
glib/gqsort.h
-
glib/gquark.h
-
glib/gqueue.h
-
glib/grand.h
-
glib/grel.h
-
glib/gregex.h
-
glib/gscanner.h
-
glib/gsequence.h
-
glib/gshell.h
-
glib/gslist.h
-
glib/gspawn.h
-
glib/gstrfuncs.h
-
glib/gstring.h
-
glib/gtestutils.h
-
glib/gthread.h
-
glib/gthreadpool.h
-
glib/gtimer.h
-
glib/gtree.h
-
glib/gtypes.h
-
glib/gunicode.h
-
glib/gurifuncs.h
-
glib/gutils.h
-
glib/gwin32.h
-
/usr/include/glib-2.0/glib/galloca.h
glib/gtypes.h
-
alloca.h
-
malloc.h
-
/usr/include/glib-2.0/glib/garray.h
glib/gtypes.h
-
/usr/include/glib-2.0/glib/gasyncqueue.h
glib/gthread.h
-
/usr/include/glib-2.0/glib/gatomic.h
glib/gtypes.h
-
/usr/include/glib-2.0/glib/gbacktrace.h
glib/gtypes.h
-
/usr/include/glib-2.0/glib/gbase64.h
glib/gtypes.h
-
/usr/include/glib-2.0/glib/gbookmarkfile.h
glib/gerror.h
-
time.h
-
/usr/include/glib-2.0/glib/gcache.h
glib/glist.h
-
/usr/include/glib-2.0/glib/gchecksum.h
glib/gtypes.h
-
/usr/include/glib-2.0/glib/gcompletion.h
glib/glist.h
-
/usr/include/glib-2.0/glib/gconvert.h
glib/gerror.h
-
/usr/include/glib-2.0/glib/gdataset.h
glib/gquark.h
-
/usr/include/glib-2.0/glib/gdate.h
time.h
-
glib/gtypes.h
-
glib/gquark.h
-
/usr/include/glib-2.0/glib/gdir.h
glib/gerror.h
-
/usr/include/glib-2.0/glib/gerror.h
glib/gquark.h
-
/usr/include/glib-2.0/glib/gfileutils.h
glib/gerror.h
-
/usr/include/glib-2.0/glib/ghash.h
glib/gtypes.h
-
glib/glist.h
-
/usr/include/glib-2.0/glib/ghook.h
glib/gmem.h
-
/usr/include/glib-2.0/glib/giochannel.h
glib/gconvert.h
-
glib/gmain.h
-
glib/gstring.h
-
/usr/include/glib-2.0/glib/gkeyfile.h
glib/gerror.h
-
/usr/include/glib-2.0/glib/glist.h
glib/gmem.h
-
/usr/include/glib-2.0/glib/gmacros.h
stddef.h
-
/usr/include/glib-2.0/glib/gmain.h
glib/gslist.h
-
glib/gthread.h
-
/usr/include/glib-2.0/glib/gmappedfile.h
glib/gerror.h
-
/usr/include/glib-2.0/glib/gmarkup.h
stdarg.h
-
glib/gerror.h
-
glib/gslist.h
-
/usr/include/glib-2.0/glib/gmem.h
glib/gslice.h
-
glib/gtypes.h
-
/usr/include/glib-2.0/glib/gmessages.h
stdarg.h
-
glib/gtypes.h
-
glib/gmacros.h
-
/usr/include/glib-2.0/glib/gnode.h
glib/gmem.h
-
/usr/include/glib-2.0/glib/goption.h
glib/gerror.h
-
glib/gquark.h
-
/usr/include/glib-2.0/glib/gpattern.h
glib/gtypes.h
-
/usr/include/glib-2.0/glib/gprimes.h
glib/gtypes.h
-
/usr/include/glib-2.0/glib/gqsort.h
glib/gtypes.h
-
/usr/include/glib-2.0/glib/gquark.h
glib/gtypes.h
-
/usr/include/glib-2.0/glib/gqueue.h
glib/glist.h
-
/usr/include/glib-2.0/glib/grand.h
glib/gtypes.h
-
/usr/include/glib-2.0/glib/gregex.h
glib/gerror.h
-
glib/gstring.h
-
/usr/include/glib-2.0/glib/grel.h
glib/gtypes.h
-
/usr/include/glib-2.0/glib/gscanner.h
glib/gdataset.h
-
glib/ghash.h
-
/usr/include/glib-2.0/glib/gsequence.h
glib/gtypes.h
-
/usr/include/glib-2.0/glib/gshell.h
glib/gerror.h
-
/usr/include/glib-2.0/glib/gslice.h
glib/gtypes.h
-
/usr/include/glib-2.0/glib/gslist.h
glib/gmem.h
-
/usr/include/glib-2.0/glib/gspawn.h
glib/gerror.h
-
/usr/include/glib-2.0/glib/gstrfuncs.h
stdarg.h
-
glib/gtypes.h
-
/usr/include/glib-2.0/glib/gstring.h
glib/gtypes.h
-
glib/gunicode.h
-
glib/gutils.h
-
/usr/include/glib-2.0/glib/gtestutils.h
glib.h
-
/usr/include/glib-2.0/glib/gthread.h
glib/gerror.h
-
glib/gtypes.h
-
glib/gutils.h
-
glib/gatomic.h
-
/usr/include/glib-2.0/glib/gthreadpool.h
glib/gthread.h
-
/usr/include/glib-2.0/glib/gtimer.h
glib/gtypes.h
-
/usr/include/glib-2.0/glib/gtree.h
glib/gnode.h
-
/usr/include/glib-2.0/glib/gtypes.h
glibconfig.h
-
/usr/include/glib-2.0/glib/gunicode.h
glib/gerror.h
-
glib/gtypes.h
-
/usr/include/glib-2.0/glib/gurifuncs.h
glib.h
-
/usr/include/glib-2.0/glib/gutils.h
glib/gtypes.h
-
stdarg.h
-
/usr/include/glib-2.0/glib/gwin32.h
glib/gtypes.h
-
/usr/lib/glib-2.0/include/glibconfig.h
glib/gmacros.h
-
limits.h
-
float.h
-
/var/hab/cusf-landing-prediction/pred_src/altitude.c
stdio.h
-
stdlib.h
-
math.h
-
pred.h
/var/hab/cusf-landing-prediction/pred_src/pred.h
altitude.h
/var/hab/cusf-landing-prediction/pred_src/altitude.h
run_model.h
/var/hab/cusf-landing-prediction/pred_src/run_model.h
/var/hab/cusf-landing-prediction/pred_src/altitude.h
/var/hab/cusf-landing-prediction/pred_src/ini/dictionary.c
dictionary.h
/var/hab/cusf-landing-prediction/pred_src/ini/dictionary.h
stdio.h
-
stdlib.h
-
string.h
-
unistd.h
-
/var/hab/cusf-landing-prediction/pred_src/ini/dictionary.h
stdio.h
-
stdlib.h
-
string.h
-
unistd.h
-
/var/hab/cusf-landing-prediction/pred_src/ini/iniparser.c
ctype.h
-
iniparser.h
/var/hab/cusf-landing-prediction/pred_src/ini/iniparser.h
/var/hab/cusf-landing-prediction/pred_src/ini/iniparser.h
stdio.h
-
stdlib.h
-
string.h
-
dictionary.h
/var/hab/cusf-landing-prediction/pred_src/ini/dictionary.h
/var/hab/cusf-landing-prediction/pred_src/pred.c
stdio.h
-
stdlib.h
-
string.h
-
time.h
-
errno.h
-
ini/iniparser.h
/var/hab/cusf-landing-prediction/pred_src/ini/iniparser.h
util/gopt.h
/var/hab/cusf-landing-prediction/pred_src/util/gopt.h
wind/wind_file_cache.h
/var/hab/cusf-landing-prediction/pred_src/wind/wind_file_cache.h
run_model.h
/var/hab/cusf-landing-prediction/pred_src/run_model.h
pred.h
/var/hab/cusf-landing-prediction/pred_src/pred.h
altitude.h
/var/hab/cusf-landing-prediction/pred_src/altitude.h
/var/hab/cusf-landing-prediction/pred_src/pred.h
/var/hab/cusf-landing-prediction/pred_src/run_model.c
math.h
-
stdio.h
-
stdlib.h
-
assert.h
-
wind/wind_file.h
/var/hab/cusf-landing-prediction/pred_src/wind/wind_file.h
util/random.h
/var/hab/cusf-landing-prediction/pred_src/util/random.h
run_model.h
/var/hab/cusf-landing-prediction/pred_src/run_model.h
pred.h
/var/hab/cusf-landing-prediction/pred_src/pred.h
altitude.h
/var/hab/cusf-landing-prediction/pred_src/altitude.h
/var/hab/cusf-landing-prediction/pred_src/run_model.h
wind/wind_file_cache.h
/var/hab/cusf-landing-prediction/pred_src/wind/wind_file_cache.h
altitude.h
/var/hab/cusf-landing-prediction/pred_src/altitude.h
/var/hab/cusf-landing-prediction/pred_src/util/getdelim.c
config.h
-
getdelim.h
/var/hab/cusf-landing-prediction/pred_src/util/getdelim.h
limits.h
-
stdlib.h
-
errno.h
-
/var/hab/cusf-landing-prediction/pred_src/util/getdelim.h
stddef.h
-
stdio.h
-
sys/types.h
-
/var/hab/cusf-landing-prediction/pred_src/util/getline.c
config.h
-
getdelim.h
/var/hab/cusf-landing-prediction/pred_src/util/getdelim.h
getline.h
/var/hab/cusf-landing-prediction/pred_src/util/getline.h
/var/hab/cusf-landing-prediction/pred_src/util/getline.h
stddef.h
-
stdio.h
-
sys/types.h
-
/var/hab/cusf-landing-prediction/pred_src/util/gopt.c
stdio.h
-
stdlib.h
-
string.h
-
gopt.h
/var/hab/cusf-landing-prediction/pred_src/util/gopt.h
sysexits.h
-
/var/hab/cusf-landing-prediction/pred_src/util/gopt.h
/var/hab/cusf-landing-prediction/pred_src/util/random.c
random.h
/var/hab/cusf-landing-prediction/pred_src/util/random.h
glib.h
-
math.h
-
/var/hab/cusf-landing-prediction/pred_src/util/random.h
/var/hab/cusf-landing-prediction/pred_src/wind/../util/getline.h
stddef.h
-
stdio.h
-
sys/types.h
-
/var/hab/cusf-landing-prediction/pred_src/wind/wind_file.c
wind_file.h
/var/hab/cusf-landing-prediction/pred_src/wind/wind_file.h
stdio.h
-
stdlib.h
-
assert.h
-
math.h
-
../util/getline.h
/var/hab/cusf-landing-prediction/pred_src/wind/../util/getline.h
/var/hab/cusf-landing-prediction/pred_src/wind/wind_file.h
/var/hab/cusf-landing-prediction/pred_src/wind/wind_file_cache.c
wind_file_cache.h
/var/hab/cusf-landing-prediction/pred_src/wind/wind_file_cache.h
wind_file.h
/var/hab/cusf-landing-prediction/pred_src/wind/wind_file.h
sys/types.h
-
sys/stat.h
-
stdlib.h
-
stdio.h
-
unistd.h
-
assert.h
-
dirent.h
-
errno.h
-
string.h
-
math.h
-
../util/getline.h
/var/hab/cusf-landing-prediction/pred_src/wind/../util/getline.h
/var/hab/cusf-landing-prediction/pred_src/wind/wind_file_cache.h
wind_file.h
/var/hab/cusf-landing-prediction/pred_src/wind/wind_file.h

Wyświetl plik

@ -0,0 +1,23 @@
# The set of languages for which implicit dependencies are needed:
SET(CMAKE_DEPENDS_LANGUAGES
"C"
)
# The set of files for implicit dependencies of each language:
SET(CMAKE_DEPENDS_CHECK_C
"/var/hab/cusf-landing-prediction/pred_src/altitude.c" "/var/hab/cusf-landing-prediction/pred_src/CMakeFiles/pred.dir/altitude.o"
"/var/hab/cusf-landing-prediction/pred_src/ini/dictionary.c" "/var/hab/cusf-landing-prediction/pred_src/CMakeFiles/pred.dir/ini/dictionary.o"
"/var/hab/cusf-landing-prediction/pred_src/ini/iniparser.c" "/var/hab/cusf-landing-prediction/pred_src/CMakeFiles/pred.dir/ini/iniparser.o"
"/var/hab/cusf-landing-prediction/pred_src/pred.c" "/var/hab/cusf-landing-prediction/pred_src/CMakeFiles/pred.dir/pred.o"
"/var/hab/cusf-landing-prediction/pred_src/run_model.c" "/var/hab/cusf-landing-prediction/pred_src/CMakeFiles/pred.dir/run_model.o"
"/var/hab/cusf-landing-prediction/pred_src/util/getdelim.c" "/var/hab/cusf-landing-prediction/pred_src/CMakeFiles/pred.dir/util/getdelim.o"
"/var/hab/cusf-landing-prediction/pred_src/util/getline.c" "/var/hab/cusf-landing-prediction/pred_src/CMakeFiles/pred.dir/util/getline.o"
"/var/hab/cusf-landing-prediction/pred_src/util/gopt.c" "/var/hab/cusf-landing-prediction/pred_src/CMakeFiles/pred.dir/util/gopt.o"
"/var/hab/cusf-landing-prediction/pred_src/util/random.c" "/var/hab/cusf-landing-prediction/pred_src/CMakeFiles/pred.dir/util/random.o"
"/var/hab/cusf-landing-prediction/pred_src/wind/wind_file.c" "/var/hab/cusf-landing-prediction/pred_src/CMakeFiles/pred.dir/wind/wind_file.o"
"/var/hab/cusf-landing-prediction/pred_src/wind/wind_file_cache.c" "/var/hab/cusf-landing-prediction/pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.o"
)
SET(CMAKE_C_COMPILER_ID "GNU")
# Targets to which this target links.
SET(CMAKE_TARGET_LINKED_INFO_FILES
)

Plik binarny nie jest wyświetlany.

Wyświetl plik

@ -0,0 +1,373 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 2.6
#=============================================================================
# Special targets provided by cmake.
# Disable implicit rules so canoncical targets will work.
.SUFFIXES:
# Remove some rules from gmake that .SUFFIXES does not remove.
SUFFIXES =
.SUFFIXES: .hpux_make_needs_suffix_list
# Suppress display of executed commands.
$(VERBOSE).SILENT:
# A target that is always out of date.
cmake_force:
.PHONY : cmake_force
#=============================================================================
# Set environment variables for the build.
# The shell in which to execute make rules.
SHELL = /bin/sh
# The CMake executable.
CMAKE_COMMAND = /usr/bin/cmake
# The command to remove a file.
RM = /usr/bin/cmake -E remove -f
# The program to use to edit the cache.
CMAKE_EDIT_COMMAND = /usr/bin/ccmake
# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /var/hab/cusf-landing-prediction
# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /var/hab/cusf-landing-prediction
# Include any dependencies generated for this target.
include pred_src/CMakeFiles/pred.dir/depend.make
# Include the progress variables for this target.
include pred_src/CMakeFiles/pred.dir/progress.make
# Include the compile flags for this target's objects.
include pred_src/CMakeFiles/pred.dir/flags.make
pred_src/CMakeFiles/pred.dir/util/gopt.o: pred_src/CMakeFiles/pred.dir/flags.make
pred_src/CMakeFiles/pred.dir/util/gopt.o: pred_src/util/gopt.c
$(CMAKE_COMMAND) -E cmake_progress_report /var/hab/cusf-landing-prediction/CMakeFiles $(CMAKE_PROGRESS_1)
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object pred_src/CMakeFiles/pred.dir/util/gopt.o"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/pred.dir/util/gopt.o -c /var/hab/cusf-landing-prediction/pred_src/util/gopt.c
pred_src/CMakeFiles/pred.dir/util/gopt.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/pred.dir/util/gopt.i"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -E /var/hab/cusf-landing-prediction/pred_src/util/gopt.c > CMakeFiles/pred.dir/util/gopt.i
pred_src/CMakeFiles/pred.dir/util/gopt.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/pred.dir/util/gopt.s"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -S /var/hab/cusf-landing-prediction/pred_src/util/gopt.c -o CMakeFiles/pred.dir/util/gopt.s
pred_src/CMakeFiles/pred.dir/util/gopt.o.requires:
.PHONY : pred_src/CMakeFiles/pred.dir/util/gopt.o.requires
pred_src/CMakeFiles/pred.dir/util/gopt.o.provides: pred_src/CMakeFiles/pred.dir/util/gopt.o.requires
$(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/util/gopt.o.provides.build
.PHONY : pred_src/CMakeFiles/pred.dir/util/gopt.o.provides
pred_src/CMakeFiles/pred.dir/util/gopt.o.provides.build: pred_src/CMakeFiles/pred.dir/util/gopt.o
.PHONY : pred_src/CMakeFiles/pred.dir/util/gopt.o.provides.build
pred_src/CMakeFiles/pred.dir/util/getdelim.o: pred_src/CMakeFiles/pred.dir/flags.make
pred_src/CMakeFiles/pred.dir/util/getdelim.o: pred_src/util/getdelim.c
$(CMAKE_COMMAND) -E cmake_progress_report /var/hab/cusf-landing-prediction/CMakeFiles $(CMAKE_PROGRESS_2)
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object pred_src/CMakeFiles/pred.dir/util/getdelim.o"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/pred.dir/util/getdelim.o -c /var/hab/cusf-landing-prediction/pred_src/util/getdelim.c
pred_src/CMakeFiles/pred.dir/util/getdelim.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/pred.dir/util/getdelim.i"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -E /var/hab/cusf-landing-prediction/pred_src/util/getdelim.c > CMakeFiles/pred.dir/util/getdelim.i
pred_src/CMakeFiles/pred.dir/util/getdelim.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/pred.dir/util/getdelim.s"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -S /var/hab/cusf-landing-prediction/pred_src/util/getdelim.c -o CMakeFiles/pred.dir/util/getdelim.s
pred_src/CMakeFiles/pred.dir/util/getdelim.o.requires:
.PHONY : pred_src/CMakeFiles/pred.dir/util/getdelim.o.requires
pred_src/CMakeFiles/pred.dir/util/getdelim.o.provides: pred_src/CMakeFiles/pred.dir/util/getdelim.o.requires
$(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/util/getdelim.o.provides.build
.PHONY : pred_src/CMakeFiles/pred.dir/util/getdelim.o.provides
pred_src/CMakeFiles/pred.dir/util/getdelim.o.provides.build: pred_src/CMakeFiles/pred.dir/util/getdelim.o
.PHONY : pred_src/CMakeFiles/pred.dir/util/getdelim.o.provides.build
pred_src/CMakeFiles/pred.dir/util/getline.o: pred_src/CMakeFiles/pred.dir/flags.make
pred_src/CMakeFiles/pred.dir/util/getline.o: pred_src/util/getline.c
$(CMAKE_COMMAND) -E cmake_progress_report /var/hab/cusf-landing-prediction/CMakeFiles $(CMAKE_PROGRESS_3)
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object pred_src/CMakeFiles/pred.dir/util/getline.o"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/pred.dir/util/getline.o -c /var/hab/cusf-landing-prediction/pred_src/util/getline.c
pred_src/CMakeFiles/pred.dir/util/getline.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/pred.dir/util/getline.i"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -E /var/hab/cusf-landing-prediction/pred_src/util/getline.c > CMakeFiles/pred.dir/util/getline.i
pred_src/CMakeFiles/pred.dir/util/getline.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/pred.dir/util/getline.s"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -S /var/hab/cusf-landing-prediction/pred_src/util/getline.c -o CMakeFiles/pred.dir/util/getline.s
pred_src/CMakeFiles/pred.dir/util/getline.o.requires:
.PHONY : pred_src/CMakeFiles/pred.dir/util/getline.o.requires
pred_src/CMakeFiles/pred.dir/util/getline.o.provides: pred_src/CMakeFiles/pred.dir/util/getline.o.requires
$(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/util/getline.o.provides.build
.PHONY : pred_src/CMakeFiles/pred.dir/util/getline.o.provides
pred_src/CMakeFiles/pred.dir/util/getline.o.provides.build: pred_src/CMakeFiles/pred.dir/util/getline.o
.PHONY : pred_src/CMakeFiles/pred.dir/util/getline.o.provides.build
pred_src/CMakeFiles/pred.dir/util/random.o: pred_src/CMakeFiles/pred.dir/flags.make
pred_src/CMakeFiles/pred.dir/util/random.o: pred_src/util/random.c
$(CMAKE_COMMAND) -E cmake_progress_report /var/hab/cusf-landing-prediction/CMakeFiles $(CMAKE_PROGRESS_4)
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object pred_src/CMakeFiles/pred.dir/util/random.o"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/pred.dir/util/random.o -c /var/hab/cusf-landing-prediction/pred_src/util/random.c
pred_src/CMakeFiles/pred.dir/util/random.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/pred.dir/util/random.i"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -E /var/hab/cusf-landing-prediction/pred_src/util/random.c > CMakeFiles/pred.dir/util/random.i
pred_src/CMakeFiles/pred.dir/util/random.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/pred.dir/util/random.s"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -S /var/hab/cusf-landing-prediction/pred_src/util/random.c -o CMakeFiles/pred.dir/util/random.s
pred_src/CMakeFiles/pred.dir/util/random.o.requires:
.PHONY : pred_src/CMakeFiles/pred.dir/util/random.o.requires
pred_src/CMakeFiles/pred.dir/util/random.o.provides: pred_src/CMakeFiles/pred.dir/util/random.o.requires
$(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/util/random.o.provides.build
.PHONY : pred_src/CMakeFiles/pred.dir/util/random.o.provides
pred_src/CMakeFiles/pred.dir/util/random.o.provides.build: pred_src/CMakeFiles/pred.dir/util/random.o
.PHONY : pred_src/CMakeFiles/pred.dir/util/random.o.provides.build
pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.o: pred_src/CMakeFiles/pred.dir/flags.make
pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.o: pred_src/wind/wind_file_cache.c
$(CMAKE_COMMAND) -E cmake_progress_report /var/hab/cusf-landing-prediction/CMakeFiles $(CMAKE_PROGRESS_5)
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.o"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/pred.dir/wind/wind_file_cache.o -c /var/hab/cusf-landing-prediction/pred_src/wind/wind_file_cache.c
pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/pred.dir/wind/wind_file_cache.i"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -E /var/hab/cusf-landing-prediction/pred_src/wind/wind_file_cache.c > CMakeFiles/pred.dir/wind/wind_file_cache.i
pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/pred.dir/wind/wind_file_cache.s"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -S /var/hab/cusf-landing-prediction/pred_src/wind/wind_file_cache.c -o CMakeFiles/pred.dir/wind/wind_file_cache.s
pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.o.requires:
.PHONY : pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.o.requires
pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.o.provides: pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.o.requires
$(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.o.provides.build
.PHONY : pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.o.provides
pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.o.provides.build: pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.o
.PHONY : pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.o.provides.build
pred_src/CMakeFiles/pred.dir/wind/wind_file.o: pred_src/CMakeFiles/pred.dir/flags.make
pred_src/CMakeFiles/pred.dir/wind/wind_file.o: pred_src/wind/wind_file.c
$(CMAKE_COMMAND) -E cmake_progress_report /var/hab/cusf-landing-prediction/CMakeFiles $(CMAKE_PROGRESS_6)
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object pred_src/CMakeFiles/pred.dir/wind/wind_file.o"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/pred.dir/wind/wind_file.o -c /var/hab/cusf-landing-prediction/pred_src/wind/wind_file.c
pred_src/CMakeFiles/pred.dir/wind/wind_file.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/pred.dir/wind/wind_file.i"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -E /var/hab/cusf-landing-prediction/pred_src/wind/wind_file.c > CMakeFiles/pred.dir/wind/wind_file.i
pred_src/CMakeFiles/pred.dir/wind/wind_file.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/pred.dir/wind/wind_file.s"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -S /var/hab/cusf-landing-prediction/pred_src/wind/wind_file.c -o CMakeFiles/pred.dir/wind/wind_file.s
pred_src/CMakeFiles/pred.dir/wind/wind_file.o.requires:
.PHONY : pred_src/CMakeFiles/pred.dir/wind/wind_file.o.requires
pred_src/CMakeFiles/pred.dir/wind/wind_file.o.provides: pred_src/CMakeFiles/pred.dir/wind/wind_file.o.requires
$(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/wind/wind_file.o.provides.build
.PHONY : pred_src/CMakeFiles/pred.dir/wind/wind_file.o.provides
pred_src/CMakeFiles/pred.dir/wind/wind_file.o.provides.build: pred_src/CMakeFiles/pred.dir/wind/wind_file.o
.PHONY : pred_src/CMakeFiles/pred.dir/wind/wind_file.o.provides.build
pred_src/CMakeFiles/pred.dir/altitude.o: pred_src/CMakeFiles/pred.dir/flags.make
pred_src/CMakeFiles/pred.dir/altitude.o: pred_src/altitude.c
$(CMAKE_COMMAND) -E cmake_progress_report /var/hab/cusf-landing-prediction/CMakeFiles $(CMAKE_PROGRESS_7)
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object pred_src/CMakeFiles/pred.dir/altitude.o"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/pred.dir/altitude.o -c /var/hab/cusf-landing-prediction/pred_src/altitude.c
pred_src/CMakeFiles/pred.dir/altitude.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/pred.dir/altitude.i"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -E /var/hab/cusf-landing-prediction/pred_src/altitude.c > CMakeFiles/pred.dir/altitude.i
pred_src/CMakeFiles/pred.dir/altitude.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/pred.dir/altitude.s"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -S /var/hab/cusf-landing-prediction/pred_src/altitude.c -o CMakeFiles/pred.dir/altitude.s
pred_src/CMakeFiles/pred.dir/altitude.o.requires:
.PHONY : pred_src/CMakeFiles/pred.dir/altitude.o.requires
pred_src/CMakeFiles/pred.dir/altitude.o.provides: pred_src/CMakeFiles/pred.dir/altitude.o.requires
$(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/altitude.o.provides.build
.PHONY : pred_src/CMakeFiles/pred.dir/altitude.o.provides
pred_src/CMakeFiles/pred.dir/altitude.o.provides.build: pred_src/CMakeFiles/pred.dir/altitude.o
.PHONY : pred_src/CMakeFiles/pred.dir/altitude.o.provides.build
pred_src/CMakeFiles/pred.dir/pred.o: pred_src/CMakeFiles/pred.dir/flags.make
pred_src/CMakeFiles/pred.dir/pred.o: pred_src/pred.c
$(CMAKE_COMMAND) -E cmake_progress_report /var/hab/cusf-landing-prediction/CMakeFiles $(CMAKE_PROGRESS_8)
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object pred_src/CMakeFiles/pred.dir/pred.o"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/pred.dir/pred.o -c /var/hab/cusf-landing-prediction/pred_src/pred.c
pred_src/CMakeFiles/pred.dir/pred.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/pred.dir/pred.i"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -E /var/hab/cusf-landing-prediction/pred_src/pred.c > CMakeFiles/pred.dir/pred.i
pred_src/CMakeFiles/pred.dir/pred.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/pred.dir/pred.s"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -S /var/hab/cusf-landing-prediction/pred_src/pred.c -o CMakeFiles/pred.dir/pred.s
pred_src/CMakeFiles/pred.dir/pred.o.requires:
.PHONY : pred_src/CMakeFiles/pred.dir/pred.o.requires
pred_src/CMakeFiles/pred.dir/pred.o.provides: pred_src/CMakeFiles/pred.dir/pred.o.requires
$(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/pred.o.provides.build
.PHONY : pred_src/CMakeFiles/pred.dir/pred.o.provides
pred_src/CMakeFiles/pred.dir/pred.o.provides.build: pred_src/CMakeFiles/pred.dir/pred.o
.PHONY : pred_src/CMakeFiles/pred.dir/pred.o.provides.build
pred_src/CMakeFiles/pred.dir/run_model.o: pred_src/CMakeFiles/pred.dir/flags.make
pred_src/CMakeFiles/pred.dir/run_model.o: pred_src/run_model.c
$(CMAKE_COMMAND) -E cmake_progress_report /var/hab/cusf-landing-prediction/CMakeFiles $(CMAKE_PROGRESS_9)
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object pred_src/CMakeFiles/pred.dir/run_model.o"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/pred.dir/run_model.o -c /var/hab/cusf-landing-prediction/pred_src/run_model.c
pred_src/CMakeFiles/pred.dir/run_model.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/pred.dir/run_model.i"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -E /var/hab/cusf-landing-prediction/pred_src/run_model.c > CMakeFiles/pred.dir/run_model.i
pred_src/CMakeFiles/pred.dir/run_model.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/pred.dir/run_model.s"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -S /var/hab/cusf-landing-prediction/pred_src/run_model.c -o CMakeFiles/pred.dir/run_model.s
pred_src/CMakeFiles/pred.dir/run_model.o.requires:
.PHONY : pred_src/CMakeFiles/pred.dir/run_model.o.requires
pred_src/CMakeFiles/pred.dir/run_model.o.provides: pred_src/CMakeFiles/pred.dir/run_model.o.requires
$(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/run_model.o.provides.build
.PHONY : pred_src/CMakeFiles/pred.dir/run_model.o.provides
pred_src/CMakeFiles/pred.dir/run_model.o.provides.build: pred_src/CMakeFiles/pred.dir/run_model.o
.PHONY : pred_src/CMakeFiles/pred.dir/run_model.o.provides.build
pred_src/CMakeFiles/pred.dir/ini/iniparser.o: pred_src/CMakeFiles/pred.dir/flags.make
pred_src/CMakeFiles/pred.dir/ini/iniparser.o: pred_src/ini/iniparser.c
$(CMAKE_COMMAND) -E cmake_progress_report /var/hab/cusf-landing-prediction/CMakeFiles $(CMAKE_PROGRESS_10)
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object pred_src/CMakeFiles/pred.dir/ini/iniparser.o"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/pred.dir/ini/iniparser.o -c /var/hab/cusf-landing-prediction/pred_src/ini/iniparser.c
pred_src/CMakeFiles/pred.dir/ini/iniparser.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/pred.dir/ini/iniparser.i"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -E /var/hab/cusf-landing-prediction/pred_src/ini/iniparser.c > CMakeFiles/pred.dir/ini/iniparser.i
pred_src/CMakeFiles/pred.dir/ini/iniparser.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/pred.dir/ini/iniparser.s"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -S /var/hab/cusf-landing-prediction/pred_src/ini/iniparser.c -o CMakeFiles/pred.dir/ini/iniparser.s
pred_src/CMakeFiles/pred.dir/ini/iniparser.o.requires:
.PHONY : pred_src/CMakeFiles/pred.dir/ini/iniparser.o.requires
pred_src/CMakeFiles/pred.dir/ini/iniparser.o.provides: pred_src/CMakeFiles/pred.dir/ini/iniparser.o.requires
$(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/ini/iniparser.o.provides.build
.PHONY : pred_src/CMakeFiles/pred.dir/ini/iniparser.o.provides
pred_src/CMakeFiles/pred.dir/ini/iniparser.o.provides.build: pred_src/CMakeFiles/pred.dir/ini/iniparser.o
.PHONY : pred_src/CMakeFiles/pred.dir/ini/iniparser.o.provides.build
pred_src/CMakeFiles/pred.dir/ini/dictionary.o: pred_src/CMakeFiles/pred.dir/flags.make
pred_src/CMakeFiles/pred.dir/ini/dictionary.o: pred_src/ini/dictionary.c
$(CMAKE_COMMAND) -E cmake_progress_report /var/hab/cusf-landing-prediction/CMakeFiles $(CMAKE_PROGRESS_11)
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object pred_src/CMakeFiles/pred.dir/ini/dictionary.o"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/pred.dir/ini/dictionary.o -c /var/hab/cusf-landing-prediction/pred_src/ini/dictionary.c
pred_src/CMakeFiles/pred.dir/ini/dictionary.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/pred.dir/ini/dictionary.i"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -E /var/hab/cusf-landing-prediction/pred_src/ini/dictionary.c > CMakeFiles/pred.dir/ini/dictionary.i
pred_src/CMakeFiles/pred.dir/ini/dictionary.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/pred.dir/ini/dictionary.s"
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/gcc $(C_DEFINES) $(C_FLAGS) -S /var/hab/cusf-landing-prediction/pred_src/ini/dictionary.c -o CMakeFiles/pred.dir/ini/dictionary.s
pred_src/CMakeFiles/pred.dir/ini/dictionary.o.requires:
.PHONY : pred_src/CMakeFiles/pred.dir/ini/dictionary.o.requires
pred_src/CMakeFiles/pred.dir/ini/dictionary.o.provides: pred_src/CMakeFiles/pred.dir/ini/dictionary.o.requires
$(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/ini/dictionary.o.provides.build
.PHONY : pred_src/CMakeFiles/pred.dir/ini/dictionary.o.provides
pred_src/CMakeFiles/pred.dir/ini/dictionary.o.provides.build: pred_src/CMakeFiles/pred.dir/ini/dictionary.o
.PHONY : pred_src/CMakeFiles/pred.dir/ini/dictionary.o.provides.build
# Object files for target pred
pred_OBJECTS = \
"CMakeFiles/pred.dir/util/gopt.o" \
"CMakeFiles/pred.dir/util/getdelim.o" \
"CMakeFiles/pred.dir/util/getline.o" \
"CMakeFiles/pred.dir/util/random.o" \
"CMakeFiles/pred.dir/wind/wind_file_cache.o" \
"CMakeFiles/pred.dir/wind/wind_file.o" \
"CMakeFiles/pred.dir/altitude.o" \
"CMakeFiles/pred.dir/pred.o" \
"CMakeFiles/pred.dir/run_model.o" \
"CMakeFiles/pred.dir/ini/iniparser.o" \
"CMakeFiles/pred.dir/ini/dictionary.o"
# External object files for target pred
pred_EXTERNAL_OBJECTS =
pred_src/pred: pred_src/CMakeFiles/pred.dir/util/gopt.o
pred_src/pred: pred_src/CMakeFiles/pred.dir/util/getdelim.o
pred_src/pred: pred_src/CMakeFiles/pred.dir/util/getline.o
pred_src/pred: pred_src/CMakeFiles/pred.dir/util/random.o
pred_src/pred: pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.o
pred_src/pred: pred_src/CMakeFiles/pred.dir/wind/wind_file.o
pred_src/pred: pred_src/CMakeFiles/pred.dir/altitude.o
pred_src/pred: pred_src/CMakeFiles/pred.dir/pred.o
pred_src/pred: pred_src/CMakeFiles/pred.dir/run_model.o
pred_src/pred: pred_src/CMakeFiles/pred.dir/ini/iniparser.o
pred_src/pred: pred_src/CMakeFiles/pred.dir/ini/dictionary.o
pred_src/pred: pred_src/CMakeFiles/pred.dir/build.make
pred_src/pred: pred_src/CMakeFiles/pred.dir/link.txt
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --red --bold "Linking C executable pred"
cd /var/hab/cusf-landing-prediction/pred_src && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/pred.dir/link.txt --verbose=$(VERBOSE)
# Rule to build all files generated by this target.
pred_src/CMakeFiles/pred.dir/build: pred_src/pred
.PHONY : pred_src/CMakeFiles/pred.dir/build
pred_src/CMakeFiles/pred.dir/requires: pred_src/CMakeFiles/pred.dir/util/gopt.o.requires
pred_src/CMakeFiles/pred.dir/requires: pred_src/CMakeFiles/pred.dir/util/getdelim.o.requires
pred_src/CMakeFiles/pred.dir/requires: pred_src/CMakeFiles/pred.dir/util/getline.o.requires
pred_src/CMakeFiles/pred.dir/requires: pred_src/CMakeFiles/pred.dir/util/random.o.requires
pred_src/CMakeFiles/pred.dir/requires: pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.o.requires
pred_src/CMakeFiles/pred.dir/requires: pred_src/CMakeFiles/pred.dir/wind/wind_file.o.requires
pred_src/CMakeFiles/pred.dir/requires: pred_src/CMakeFiles/pred.dir/altitude.o.requires
pred_src/CMakeFiles/pred.dir/requires: pred_src/CMakeFiles/pred.dir/pred.o.requires
pred_src/CMakeFiles/pred.dir/requires: pred_src/CMakeFiles/pred.dir/run_model.o.requires
pred_src/CMakeFiles/pred.dir/requires: pred_src/CMakeFiles/pred.dir/ini/iniparser.o.requires
pred_src/CMakeFiles/pred.dir/requires: pred_src/CMakeFiles/pred.dir/ini/dictionary.o.requires
.PHONY : pred_src/CMakeFiles/pred.dir/requires
pred_src/CMakeFiles/pred.dir/clean:
cd /var/hab/cusf-landing-prediction/pred_src && $(CMAKE_COMMAND) -P CMakeFiles/pred.dir/cmake_clean.cmake
.PHONY : pred_src/CMakeFiles/pred.dir/clean
pred_src/CMakeFiles/pred.dir/depend:
cd /var/hab/cusf-landing-prediction && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /var/hab/cusf-landing-prediction /var/hab/cusf-landing-prediction/pred_src /var/hab/cusf-landing-prediction /var/hab/cusf-landing-prediction/pred_src /var/hab/cusf-landing-prediction/pred_src/CMakeFiles/pred.dir/DependInfo.cmake --color=$(COLOR)
.PHONY : pred_src/CMakeFiles/pred.dir/depend

Wyświetl plik

@ -0,0 +1,20 @@
FILE(REMOVE_RECURSE
"CMakeFiles/pred.dir/util/gopt.o"
"CMakeFiles/pred.dir/util/getdelim.o"
"CMakeFiles/pred.dir/util/getline.o"
"CMakeFiles/pred.dir/util/random.o"
"CMakeFiles/pred.dir/wind/wind_file_cache.o"
"CMakeFiles/pred.dir/wind/wind_file.o"
"CMakeFiles/pred.dir/altitude.o"
"CMakeFiles/pred.dir/pred.o"
"CMakeFiles/pred.dir/run_model.o"
"CMakeFiles/pred.dir/ini/iniparser.o"
"CMakeFiles/pred.dir/ini/dictionary.o"
"pred.pdb"
"pred"
)
# Per-language clean rules from dependency scanning.
FOREACH(lang C)
INCLUDE(CMakeFiles/pred.dir/cmake_clean_${lang}.cmake OPTIONAL)
ENDFOREACH(lang)

Wyświetl plik

@ -0,0 +1,114 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 2.6
pred_src/CMakeFiles/pred.dir/altitude.o
/var/hab/cusf-landing-prediction/pred_src/altitude.c
/var/hab/cusf-landing-prediction/pred_src/altitude.h
/var/hab/cusf-landing-prediction/pred_src/pred.h
/var/hab/cusf-landing-prediction/pred_src/run_model.h
/var/hab/cusf-landing-prediction/pred_src/wind/wind_file.h
/var/hab/cusf-landing-prediction/pred_src/wind/wind_file_cache.h
pred_src/CMakeFiles/pred.dir/ini/dictionary.o
/var/hab/cusf-landing-prediction/pred_src/ini/dictionary.c
/var/hab/cusf-landing-prediction/pred_src/ini/dictionary.h
pred_src/CMakeFiles/pred.dir/ini/iniparser.o
/var/hab/cusf-landing-prediction/pred_src/ini/dictionary.h
/var/hab/cusf-landing-prediction/pred_src/ini/iniparser.c
/var/hab/cusf-landing-prediction/pred_src/ini/iniparser.h
pred_src/CMakeFiles/pred.dir/pred.o
/var/hab/cusf-landing-prediction/pred_src/altitude.h
/var/hab/cusf-landing-prediction/pred_src/ini/dictionary.h
/var/hab/cusf-landing-prediction/pred_src/ini/iniparser.h
/var/hab/cusf-landing-prediction/pred_src/pred.c
/var/hab/cusf-landing-prediction/pred_src/pred.h
/var/hab/cusf-landing-prediction/pred_src/run_model.h
/var/hab/cusf-landing-prediction/pred_src/util/gopt.h
/var/hab/cusf-landing-prediction/pred_src/wind/wind_file.h
/var/hab/cusf-landing-prediction/pred_src/wind/wind_file_cache.h
pred_src/CMakeFiles/pred.dir/run_model.o
/var/hab/cusf-landing-prediction/pred_src/altitude.h
/var/hab/cusf-landing-prediction/pred_src/pred.h
/var/hab/cusf-landing-prediction/pred_src/run_model.c
/var/hab/cusf-landing-prediction/pred_src/run_model.h
/var/hab/cusf-landing-prediction/pred_src/util/random.h
/var/hab/cusf-landing-prediction/pred_src/wind/wind_file.h
/var/hab/cusf-landing-prediction/pred_src/wind/wind_file_cache.h
pred_src/CMakeFiles/pred.dir/util/getdelim.o
/var/hab/cusf-landing-prediction/pred_src/util/getdelim.c
/var/hab/cusf-landing-prediction/pred_src/util/getdelim.h
pred_src/CMakeFiles/pred.dir/util/getline.o
/var/hab/cusf-landing-prediction/pred_src/util/getdelim.h
/var/hab/cusf-landing-prediction/pred_src/util/getline.c
/var/hab/cusf-landing-prediction/pred_src/util/getline.h
pred_src/CMakeFiles/pred.dir/util/gopt.o
/var/hab/cusf-landing-prediction/pred_src/util/gopt.c
/var/hab/cusf-landing-prediction/pred_src/util/gopt.h
pred_src/CMakeFiles/pred.dir/util/random.o
/usr/include/glib-2.0/glib.h
/usr/include/glib-2.0/glib/galloca.h
/usr/include/glib-2.0/glib/garray.h
/usr/include/glib-2.0/glib/gasyncqueue.h
/usr/include/glib-2.0/glib/gatomic.h
/usr/include/glib-2.0/glib/gbacktrace.h
/usr/include/glib-2.0/glib/gbase64.h
/usr/include/glib-2.0/glib/gbookmarkfile.h
/usr/include/glib-2.0/glib/gcache.h
/usr/include/glib-2.0/glib/gchecksum.h
/usr/include/glib-2.0/glib/gcompletion.h
/usr/include/glib-2.0/glib/gconvert.h
/usr/include/glib-2.0/glib/gdataset.h
/usr/include/glib-2.0/glib/gdate.h
/usr/include/glib-2.0/glib/gdir.h
/usr/include/glib-2.0/glib/gerror.h
/usr/include/glib-2.0/glib/gfileutils.h
/usr/include/glib-2.0/glib/ghash.h
/usr/include/glib-2.0/glib/ghook.h
/usr/include/glib-2.0/glib/giochannel.h
/usr/include/glib-2.0/glib/gkeyfile.h
/usr/include/glib-2.0/glib/glist.h
/usr/include/glib-2.0/glib/gmacros.h
/usr/include/glib-2.0/glib/gmain.h
/usr/include/glib-2.0/glib/gmappedfile.h
/usr/include/glib-2.0/glib/gmarkup.h
/usr/include/glib-2.0/glib/gmem.h
/usr/include/glib-2.0/glib/gmessages.h
/usr/include/glib-2.0/glib/gnode.h
/usr/include/glib-2.0/glib/goption.h
/usr/include/glib-2.0/glib/gpattern.h
/usr/include/glib-2.0/glib/gprimes.h
/usr/include/glib-2.0/glib/gqsort.h
/usr/include/glib-2.0/glib/gquark.h
/usr/include/glib-2.0/glib/gqueue.h
/usr/include/glib-2.0/glib/grand.h
/usr/include/glib-2.0/glib/gregex.h
/usr/include/glib-2.0/glib/grel.h
/usr/include/glib-2.0/glib/gscanner.h
/usr/include/glib-2.0/glib/gsequence.h
/usr/include/glib-2.0/glib/gshell.h
/usr/include/glib-2.0/glib/gslice.h
/usr/include/glib-2.0/glib/gslist.h
/usr/include/glib-2.0/glib/gspawn.h
/usr/include/glib-2.0/glib/gstrfuncs.h
/usr/include/glib-2.0/glib/gstring.h
/usr/include/glib-2.0/glib/gtestutils.h
/usr/include/glib-2.0/glib/gthread.h
/usr/include/glib-2.0/glib/gthreadpool.h
/usr/include/glib-2.0/glib/gtimer.h
/usr/include/glib-2.0/glib/gtree.h
/usr/include/glib-2.0/glib/gtypes.h
/usr/include/glib-2.0/glib/gunicode.h
/usr/include/glib-2.0/glib/gurifuncs.h
/usr/include/glib-2.0/glib/gutils.h
/usr/include/glib-2.0/glib/gwin32.h
/usr/lib/glib-2.0/include/glibconfig.h
/var/hab/cusf-landing-prediction/pred_src/util/random.c
/var/hab/cusf-landing-prediction/pred_src/util/random.h
pred_src/CMakeFiles/pred.dir/wind/wind_file.o
/var/hab/cusf-landing-prediction/pred_src/wind/../util/getline.h
/var/hab/cusf-landing-prediction/pred_src/wind/wind_file.c
/var/hab/cusf-landing-prediction/pred_src/wind/wind_file.h
pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.o
/var/hab/cusf-landing-prediction/pred_src/wind/../util/getline.h
/var/hab/cusf-landing-prediction/pred_src/wind/wind_file.h
/var/hab/cusf-landing-prediction/pred_src/wind/wind_file_cache.c
/var/hab/cusf-landing-prediction/pred_src/wind/wind_file_cache.h

Wyświetl plik

@ -0,0 +1,114 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 2.6
pred_src/CMakeFiles/pred.dir/altitude.o: pred_src/altitude.c
pred_src/CMakeFiles/pred.dir/altitude.o: pred_src/altitude.h
pred_src/CMakeFiles/pred.dir/altitude.o: pred_src/pred.h
pred_src/CMakeFiles/pred.dir/altitude.o: pred_src/run_model.h
pred_src/CMakeFiles/pred.dir/altitude.o: pred_src/wind/wind_file.h
pred_src/CMakeFiles/pred.dir/altitude.o: pred_src/wind/wind_file_cache.h
pred_src/CMakeFiles/pred.dir/ini/dictionary.o: pred_src/ini/dictionary.c
pred_src/CMakeFiles/pred.dir/ini/dictionary.o: pred_src/ini/dictionary.h
pred_src/CMakeFiles/pred.dir/ini/iniparser.o: pred_src/ini/dictionary.h
pred_src/CMakeFiles/pred.dir/ini/iniparser.o: pred_src/ini/iniparser.c
pred_src/CMakeFiles/pred.dir/ini/iniparser.o: pred_src/ini/iniparser.h
pred_src/CMakeFiles/pred.dir/pred.o: pred_src/altitude.h
pred_src/CMakeFiles/pred.dir/pred.o: pred_src/ini/dictionary.h
pred_src/CMakeFiles/pred.dir/pred.o: pred_src/ini/iniparser.h
pred_src/CMakeFiles/pred.dir/pred.o: pred_src/pred.c
pred_src/CMakeFiles/pred.dir/pred.o: pred_src/pred.h
pred_src/CMakeFiles/pred.dir/pred.o: pred_src/run_model.h
pred_src/CMakeFiles/pred.dir/pred.o: pred_src/util/gopt.h
pred_src/CMakeFiles/pred.dir/pred.o: pred_src/wind/wind_file.h
pred_src/CMakeFiles/pred.dir/pred.o: pred_src/wind/wind_file_cache.h
pred_src/CMakeFiles/pred.dir/run_model.o: pred_src/altitude.h
pred_src/CMakeFiles/pred.dir/run_model.o: pred_src/pred.h
pred_src/CMakeFiles/pred.dir/run_model.o: pred_src/run_model.c
pred_src/CMakeFiles/pred.dir/run_model.o: pred_src/run_model.h
pred_src/CMakeFiles/pred.dir/run_model.o: pred_src/util/random.h
pred_src/CMakeFiles/pred.dir/run_model.o: pred_src/wind/wind_file.h
pred_src/CMakeFiles/pred.dir/run_model.o: pred_src/wind/wind_file_cache.h
pred_src/CMakeFiles/pred.dir/util/getdelim.o: pred_src/util/getdelim.c
pred_src/CMakeFiles/pred.dir/util/getdelim.o: pred_src/util/getdelim.h
pred_src/CMakeFiles/pred.dir/util/getline.o: pred_src/util/getdelim.h
pred_src/CMakeFiles/pred.dir/util/getline.o: pred_src/util/getline.c
pred_src/CMakeFiles/pred.dir/util/getline.o: pred_src/util/getline.h
pred_src/CMakeFiles/pred.dir/util/gopt.o: pred_src/util/gopt.c
pred_src/CMakeFiles/pred.dir/util/gopt.o: pred_src/util/gopt.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/galloca.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/garray.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gasyncqueue.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gatomic.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gbacktrace.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gbase64.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gbookmarkfile.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gcache.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gchecksum.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gcompletion.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gconvert.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gdataset.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gdate.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gdir.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gerror.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gfileutils.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/ghash.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/ghook.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/giochannel.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gkeyfile.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/glist.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gmacros.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gmain.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gmappedfile.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gmarkup.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gmem.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gmessages.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gnode.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/goption.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gpattern.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gprimes.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gqsort.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gquark.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gqueue.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/grand.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gregex.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/grel.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gscanner.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gsequence.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gshell.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gslice.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gslist.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gspawn.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gstrfuncs.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gstring.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gtestutils.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gthread.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gthreadpool.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gtimer.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gtree.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gtypes.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gunicode.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gurifuncs.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gutils.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/include/glib-2.0/glib/gwin32.h
pred_src/CMakeFiles/pred.dir/util/random.o: /usr/lib/glib-2.0/include/glibconfig.h
pred_src/CMakeFiles/pred.dir/util/random.o: pred_src/util/random.c
pred_src/CMakeFiles/pred.dir/util/random.o: pred_src/util/random.h
pred_src/CMakeFiles/pred.dir/wind/wind_file.o: pred_src/wind/../util/getline.h
pred_src/CMakeFiles/pred.dir/wind/wind_file.o: pred_src/wind/wind_file.c
pred_src/CMakeFiles/pred.dir/wind/wind_file.o: pred_src/wind/wind_file.h
pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.o: pred_src/wind/../util/getline.h
pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.o: pred_src/wind/wind_file.h
pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.o: pred_src/wind/wind_file_cache.c
pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.o: pred_src/wind/wind_file_cache.h

Wyświetl plik

@ -0,0 +1,8 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 2.6
# compile C with /usr/bin/gcc
C_FLAGS = -O9 -Wall -Werror -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include
C_DEFINES =

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Wyświetl plik

@ -0,0 +1 @@
/usr/bin/gcc -O9 -Wall -Werror CMakeFiles/pred.dir/util/gopt.o CMakeFiles/pred.dir/util/getdelim.o CMakeFiles/pred.dir/util/getline.o CMakeFiles/pred.dir/util/random.o CMakeFiles/pred.dir/wind/wind_file_cache.o CMakeFiles/pred.dir/wind/wind_file.o CMakeFiles/pred.dir/altitude.o CMakeFiles/pred.dir/pred.o CMakeFiles/pred.dir/run_model.o CMakeFiles/pred.dir/ini/iniparser.o CMakeFiles/pred.dir/ini/dictionary.o -o pred -rdynamic -lglib-2.0 -lm

Plik binarny nie jest wyświetlany.

Wyświetl plik

@ -0,0 +1,12 @@
CMAKE_PROGRESS_1 = 1
CMAKE_PROGRESS_2 = 2
CMAKE_PROGRESS_3 = 3
CMAKE_PROGRESS_4 = 4
CMAKE_PROGRESS_5 = 5
CMAKE_PROGRESS_6 = 6
CMAKE_PROGRESS_7 = 7
CMAKE_PROGRESS_8 = 8
CMAKE_PROGRESS_9 = 9
CMAKE_PROGRESS_10 = 10
CMAKE_PROGRESS_11 = 11

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Wyświetl plik

@ -0,0 +1 @@
11

Wyświetl plik

@ -0,0 +1,38 @@
# CMake build file for the CUSF landing prediction software
#
# Original version: Rich Wareham <rjw57@cam.ac.uk>
# Use PkgConfig to find the glib libraries
find_package(PkgConfig)
pkg_check_modules(GLIB REQUIRED glib-2.0)
include_directories(${GLIB_INCLUDE_DIRS})
link_directories(${GLIB_LIBRARY_DIRS})
add_executable(pred
util/gopt.c
util/getdelim.c
util/random.h
util/gopt.h
util/getline.h
util/getline.c
util/getdelim.h
util/random.c
altitude.h
wind/wind_file_cache.c
wind/wind_file_cache.h
wind/wind_file.c
wind/wind_file.h
altitude.c
pred.c
run_model.c
pred.h
run_model.h
ini/iniparser.c
ini/iniparser.h
ini/dictionary.h
ini/dictionary.c
)
target_link_libraries(pred ${GLIB_LIBRARIES} -lm)

335
pred_src/Makefile 100644
Wyświetl plik

@ -0,0 +1,335 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 2.6
# Default target executed when no arguments are given to make.
default_target: all
.PHONY : default_target
#=============================================================================
# Special targets provided by cmake.
# Disable implicit rules so canoncical targets will work.
.SUFFIXES:
# Remove some rules from gmake that .SUFFIXES does not remove.
SUFFIXES =
.SUFFIXES: .hpux_make_needs_suffix_list
# Suppress display of executed commands.
$(VERBOSE).SILENT:
# A target that is always out of date.
cmake_force:
.PHONY : cmake_force
#=============================================================================
# Set environment variables for the build.
# The shell in which to execute make rules.
SHELL = /bin/sh
# The CMake executable.
CMAKE_COMMAND = /usr/bin/cmake
# The command to remove a file.
RM = /usr/bin/cmake -E remove -f
# The program to use to edit the cache.
CMAKE_EDIT_COMMAND = /usr/bin/ccmake
# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /var/hab/cusf-landing-prediction
# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /var/hab/cusf-landing-prediction
#=============================================================================
# Targets provided globally by CMake.
# Special rule for the target edit_cache
edit_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..."
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/ccmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : edit_cache
# Special rule for the target edit_cache
edit_cache/fast: edit_cache
.PHONY : edit_cache/fast
# Special rule for the target rebuild_cache
rebuild_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..."
cd /var/hab/cusf-landing-prediction/pred_src && /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : rebuild_cache
# Special rule for the target rebuild_cache
rebuild_cache/fast: rebuild_cache
.PHONY : rebuild_cache/fast
# The main all target
all: cmake_check_build_system
cd /var/hab/cusf-landing-prediction && $(CMAKE_COMMAND) -E cmake_progress_start /var/hab/cusf-landing-prediction/CMakeFiles /var/hab/cusf-landing-prediction/pred_src/CMakeFiles/progress.make
cd /var/hab/cusf-landing-prediction && $(MAKE) -f CMakeFiles/Makefile2 pred_src/all
$(CMAKE_COMMAND) -E cmake_progress_start /var/hab/cusf-landing-prediction/CMakeFiles 0
.PHONY : all
# The main clean target
clean:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f CMakeFiles/Makefile2 pred_src/clean
.PHONY : clean
# The main clean target
clean/fast: clean
.PHONY : clean/fast
# Prepare targets for installation.
preinstall: all
cd /var/hab/cusf-landing-prediction && $(MAKE) -f CMakeFiles/Makefile2 pred_src/preinstall
.PHONY : preinstall
# Prepare targets for installation.
preinstall/fast:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f CMakeFiles/Makefile2 pred_src/preinstall
.PHONY : preinstall/fast
# clear depends
depend:
cd /var/hab/cusf-landing-prediction && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
.PHONY : depend
# Convenience name for target.
pred_src/CMakeFiles/pred.dir/rule:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f CMakeFiles/Makefile2 pred_src/CMakeFiles/pred.dir/rule
.PHONY : pred_src/CMakeFiles/pred.dir/rule
# Convenience name for target.
pred: pred_src/CMakeFiles/pred.dir/rule
.PHONY : pred
# fast build rule for target.
pred/fast:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/build
.PHONY : pred/fast
# target to build an object file
altitude.o:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/altitude.o
.PHONY : altitude.o
# target to preprocess a source file
altitude.i:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/altitude.i
.PHONY : altitude.i
# target to generate assembly for a file
altitude.s:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/altitude.s
.PHONY : altitude.s
# target to build an object file
ini/dictionary.o:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/ini/dictionary.o
.PHONY : ini/dictionary.o
# target to preprocess a source file
ini/dictionary.i:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/ini/dictionary.i
.PHONY : ini/dictionary.i
# target to generate assembly for a file
ini/dictionary.s:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/ini/dictionary.s
.PHONY : ini/dictionary.s
# target to build an object file
ini/iniparser.o:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/ini/iniparser.o
.PHONY : ini/iniparser.o
# target to preprocess a source file
ini/iniparser.i:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/ini/iniparser.i
.PHONY : ini/iniparser.i
# target to generate assembly for a file
ini/iniparser.s:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/ini/iniparser.s
.PHONY : ini/iniparser.s
# target to build an object file
pred.o:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/pred.o
.PHONY : pred.o
# target to preprocess a source file
pred.i:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/pred.i
.PHONY : pred.i
# target to generate assembly for a file
pred.s:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/pred.s
.PHONY : pred.s
# target to build an object file
run_model.o:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/run_model.o
.PHONY : run_model.o
# target to preprocess a source file
run_model.i:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/run_model.i
.PHONY : run_model.i
# target to generate assembly for a file
run_model.s:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/run_model.s
.PHONY : run_model.s
# target to build an object file
util/getdelim.o:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/util/getdelim.o
.PHONY : util/getdelim.o
# target to preprocess a source file
util/getdelim.i:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/util/getdelim.i
.PHONY : util/getdelim.i
# target to generate assembly for a file
util/getdelim.s:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/util/getdelim.s
.PHONY : util/getdelim.s
# target to build an object file
util/getline.o:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/util/getline.o
.PHONY : util/getline.o
# target to preprocess a source file
util/getline.i:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/util/getline.i
.PHONY : util/getline.i
# target to generate assembly for a file
util/getline.s:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/util/getline.s
.PHONY : util/getline.s
# target to build an object file
util/gopt.o:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/util/gopt.o
.PHONY : util/gopt.o
# target to preprocess a source file
util/gopt.i:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/util/gopt.i
.PHONY : util/gopt.i
# target to generate assembly for a file
util/gopt.s:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/util/gopt.s
.PHONY : util/gopt.s
# target to build an object file
util/random.o:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/util/random.o
.PHONY : util/random.o
# target to preprocess a source file
util/random.i:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/util/random.i
.PHONY : util/random.i
# target to generate assembly for a file
util/random.s:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/util/random.s
.PHONY : util/random.s
# target to build an object file
wind/wind_file.o:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/wind/wind_file.o
.PHONY : wind/wind_file.o
# target to preprocess a source file
wind/wind_file.i:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/wind/wind_file.i
.PHONY : wind/wind_file.i
# target to generate assembly for a file
wind/wind_file.s:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/wind/wind_file.s
.PHONY : wind/wind_file.s
# target to build an object file
wind/wind_file_cache.o:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.o
.PHONY : wind/wind_file_cache.o
# target to preprocess a source file
wind/wind_file_cache.i:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.i
.PHONY : wind/wind_file_cache.i
# target to generate assembly for a file
wind/wind_file_cache.s:
cd /var/hab/cusf-landing-prediction && $(MAKE) -f pred_src/CMakeFiles/pred.dir/build.make pred_src/CMakeFiles/pred.dir/wind/wind_file_cache.s
.PHONY : wind/wind_file_cache.s
# Help Target
help:
@echo "The following are some of the valid targets for this Makefile:"
@echo "... all (the default if no target is provided)"
@echo "... clean"
@echo "... depend"
@echo "... edit_cache"
@echo "... pred"
@echo "... rebuild_cache"
@echo "... altitude.o"
@echo "... altitude.i"
@echo "... altitude.s"
@echo "... ini/dictionary.o"
@echo "... ini/dictionary.i"
@echo "... ini/dictionary.s"
@echo "... ini/iniparser.o"
@echo "... ini/iniparser.i"
@echo "... ini/iniparser.s"
@echo "... pred.o"
@echo "... pred.i"
@echo "... pred.s"
@echo "... run_model.o"
@echo "... run_model.i"
@echo "... run_model.s"
@echo "... util/getdelim.o"
@echo "... util/getdelim.i"
@echo "... util/getdelim.s"
@echo "... util/getline.o"
@echo "... util/getline.i"
@echo "... util/getline.s"
@echo "... util/gopt.o"
@echo "... util/gopt.i"
@echo "... util/gopt.s"
@echo "... util/random.o"
@echo "... util/random.i"
@echo "... util/random.s"
@echo "... wind/wind_file.o"
@echo "... wind/wind_file.i"
@echo "... wind/wind_file.s"
@echo "... wind/wind_file_cache.o"
@echo "... wind/wind_file_cache.i"
@echo "... wind/wind_file_cache.s"
.PHONY : help
#=============================================================================
# Special targets to cleanup operation of make.
# Special rule to run CMake to check the build system integrity.
# No rule that depends on this can have commands that come from listfiles
# because they might be regenerated.
cmake_check_build_system:
cd /var/hab/cusf-landing-prediction && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
.PHONY : cmake_check_build_system

126
pred_src/altitude.c 100644
Wyświetl plik

@ -0,0 +1,126 @@
// --------------------------------------------------------------
// CU Spaceflight Landing Prediction
// Copyright (c) CU Spaceflight 2009, All Right Reserved
//
// Written by Rob Anderson
// Modified by Fergus Noble
//
// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
// --------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "pred.h"
#include "altitude.h"
#include "run_model.h"
// get density of atmosphere at a given altitude
// uses NASA model from http://www.grc.nasa.gov/WWW/K-12/airplane/atmosmet.html
// units of degrees celcius, metres, KPa and Kg/metre cubed
static float get_density(float altitude);
#define G 9.8
struct altitude_model_s
{
float burst_altitude;
float ascent_rate;
float drag_coeff;
int descent_mode;
float initial_alt;
int burst_time;
};
altitude_model_t*
altitude_model_new(int dec_mode, float burst_alt, float asc_rate, float drag_co)
{
altitude_model_t* self = (altitude_model_t*)malloc(sizeof(altitude_model_t));
// this function doesn't do anything much at the moment
// but will prove useful in the future
self->burst_altitude = burst_alt;
self->ascent_rate = asc_rate;
self->drag_coeff = drag_co;
self->descent_mode = dec_mode;
return self;
}
void
altitude_model_free(altitude_model_t* self)
{
if(!self)
return;
free(self);
}
int
altitude_model_get_altitude(altitude_model_t* self, int time_into_flight, float* alt) {
// TODO: this section needs some work to make it more flexible
// time == 0 so setup initial altitude stuff
if (time_into_flight == 0) {
self->initial_alt = *alt;
self->burst_time = (self->burst_altitude - self->initial_alt) / self->ascent_rate;
}
// If we are not doing a descending mode sim then start going up
// at out ascent rate. The ascent rate is constant to a good approximation.
if (self->descent_mode == DESCENT_MODE_NORMAL)
if (time_into_flight <= self->burst_time) {
*alt = self->initial_alt + time_into_flight*self->ascent_rate;
return 1;
}
// Descent - just assume its at terminal velocity (which varies with altitude)
// this is a pretty darn good approximation for high-ish drag e.g. under parachute
// still converges to T.V. quickly (i.e. less than a minute) for low drag.
// terminal velocity = -drag_coeff/sqrt(get_density(*alt));
*alt += TIMESTEP * -self->drag_coeff/sqrt(get_density(*alt));
/*
// Rob's method - is this just freefall until we reach terminal velocity?
vertical_speed = -drag_coeff/sqrt(get_density(*alt));
// TODO: inaccurate if still accelerating
if (vertical_speed < previous_vertical_speed - G*TIMESTEP) // still accelerating
vertical_speed = previous_vertical_speed - G*TIMESTEP;
if(vertical_speed > previous_vertical_speed + G*TIMESTEP) // still accelerating
vertical_speed = previous_vertical_speed + G*TIMESTEP;
previous_vertical_speed = vertical_speed;
*alt += TIMESTEP * vertical_speed;
*/
if (*alt <= 0)
return 0;
return 1;
}
float get_density(float altitude) {
float temp = 0.f, pressure = 0.f;
if (altitude > 25000) {
temp = -131.21 + 0.00299 * altitude;
pressure = 2.488*pow((temp+273.1)/216.6,-11.388);
}
if (altitude <=25000 && altitude > 11000) {
temp = -56.46;
pressure = 22.65 * exp(1.73-0.000157*altitude);
}
if (altitude <=11000) {
temp = 15.04 - 0.00649 * altitude;
pressure = 101.29 * pow((temp + 273.1)/288.08,5.256);
}
return pressure/(0.2869*(temp+273.1));
}

Wyświetl plik

@ -0,0 +1,49 @@
// --------------------------------------------------------------
// CU Spaceflight Landing Prediction
// Copyright (c) CU Spaceflight 2009, All Right Reserved
//
// Written by Rob Anderson
// Modified by Fergus Noble
//
// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
// --------------------------------------------------------------
#ifndef __ALTITUDE_H__
#define __ALTITUDE_H__
typedef struct altitude_model_s altitude_model_t;
// create an altitude/time model with given parameters, must be called before
// calling run_model if descent_mode is DESCENT_MODE_DESCENDING then we start
// off with the balloon descending i.e. after burst
altitude_model_t *altitude_model_new (int descent_mode,
float burst_alt,
float ascent_rate,
float drag_coeff);
// free resources associated with the specified altitude model.
void altitude_model_free (altitude_model_t *model);
// returns the altitude corresponding to a certain time into the flight (in seconds)
// the result it stored in the alt variable.
// the contents of alt when the function is called with time_into_flight = 0
// will be taken as the starting altitude returns 1 normally and 0 when the
// flight has terminated
int altitude_model_get_altitude
(altitude_model_t *model,
int time_into_flight,
float *alt);
// it seems like overkill to do it this way but it is in preparation for being able to load in
// arbitrary altitude/time profiles from a file
#define DESCENT_MODE_DESCENDING 1
#define DESCENT_MODE_NORMAL 0
#endif // __ALTITUDE_H__

Wyświetl plik

@ -0,0 +1,34 @@
# Install script for directory: /var/hab/cusf-landing-prediction/pred_src
# Set the install prefix
IF(NOT DEFINED CMAKE_INSTALL_PREFIX)
SET(CMAKE_INSTALL_PREFIX "/usr/local")
ENDIF(NOT DEFINED CMAKE_INSTALL_PREFIX)
STRING(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
# Set the install configuration name.
IF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
IF(BUILD_TYPE)
STRING(REGEX REPLACE "^[^A-Za-z0-9_]+" ""
CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")
ELSE(BUILD_TYPE)
SET(CMAKE_INSTALL_CONFIG_NAME "")
ENDIF(BUILD_TYPE)
MESSAGE(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"")
ENDIF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
# Set the component getting installed.
IF(NOT CMAKE_INSTALL_COMPONENT)
IF(COMPONENT)
MESSAGE(STATUS "Install component: \"${COMPONENT}\"")
SET(CMAKE_INSTALL_COMPONENT "${COMPONENT}")
ELSE(COMPONENT)
SET(CMAKE_INSTALL_COMPONENT)
ENDIF(COMPONENT)
ENDIF(NOT CMAKE_INSTALL_COMPONENT)
# Install shared libraries without execute permission?
IF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)
SET(CMAKE_INSTALL_SO_NO_EXE "1")
ENDIF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)

Wyświetl plik

@ -0,0 +1,21 @@
Copyright (c) 2000-2007 by Nicolas Devillard.
MIT License
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

Wyświetl plik

@ -0,0 +1,4 @@
These files from from the iniparser project[1] and are released under the MIT
license which may be found in the associated LICENSE file.
[1] http://ndevilla.free.fr/iniparser/

Wyświetl plik

@ -0,0 +1,12 @@
Welcome to iniParser -- version 3.0b (beta)
released 03 Jan 2008
This modules offers parsing of ini files from the C level.
See a complete documentation in HTML format, from this directory
open the file html/index.html with any HTML-capable browser.
Enjoy!
N.Devillard
Thu Jan 3 19:36:31 CET 2008

Wyświetl plik

@ -0,0 +1,405 @@
/*-------------------------------------------------------------------------*/
/**
@file dictionary.c
@author N. Devillard
@date Sep 2007
@version $Revision: 1.27 $
@brief Implements a dictionary for string variables.
This module implements a simple dictionary object, i.e. a list
of string/string associations. This object is useful to store e.g.
informations retrieved from a configuration file (ini files).
*/
/*--------------------------------------------------------------------------*/
/*
$Id: dictionary.c,v 1.27 2007-11-23 21:39:18 ndevilla Exp $
$Revision: 1.27 $
*/
/*---------------------------------------------------------------------------
Includes
---------------------------------------------------------------------------*/
#include "dictionary.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
/** Maximum value size for integers and doubles. */
#define MAXVALSZ 1024
/** Minimal allocated number of entries in a dictionary */
#define DICTMINSZ 128
/** Invalid key token */
#define DICT_INVALID_KEY ((char*)-1)
/*---------------------------------------------------------------------------
Private functions
---------------------------------------------------------------------------*/
/* Doubles the allocated size associated to a pointer */
/* 'size' is the current allocated size. */
static void * mem_double(void * ptr, int size)
{
void * newptr ;
newptr = calloc(2*size, 1);
if (newptr==NULL) {
return NULL ;
}
memcpy(newptr, ptr, size);
free(ptr);
return newptr ;
}
/*-------------------------------------------------------------------------*/
/**
@brief Duplicate a string
@param s String to duplicate
@return Pointer to a newly allocated string, to be freed with free()
This is a replacement for strdup(). This implementation is provided
for systems that do not have it.
*/
/*--------------------------------------------------------------------------*/
static char * xstrdup(char * s)
{
char * t ;
if (!s)
return NULL ;
t = malloc(strlen(s)+1) ;
if (t) {
strcpy(t,s);
}
return t ;
}
/*---------------------------------------------------------------------------
Function codes
---------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/
/**
@brief Compute the hash key for a string.
@param key Character string to use for key.
@return 1 unsigned int on at least 32 bits.
This hash function has been taken from an Article in Dr Dobbs Journal.
This is normally a collision-free function, distributing keys evenly.
The key is stored anyway in the struct so that collision can be avoided
by comparing the key itself in last resort.
*/
/*--------------------------------------------------------------------------*/
unsigned dictionary_hash(char * key)
{
int len ;
unsigned hash ;
int i ;
len = strlen(key);
for (hash=0, i=0 ; i<len ; i++) {
hash += (unsigned)key[i] ;
hash += (hash<<10);
hash ^= (hash>>6) ;
}
hash += (hash <<3);
hash ^= (hash >>11);
hash += (hash <<15);
return hash ;
}
/*-------------------------------------------------------------------------*/
/**
@brief Create a new dictionary object.
@param size Optional initial size of the dictionary.
@return 1 newly allocated dictionary objet.
This function allocates a new dictionary object of given size and returns
it. If you do not know in advance (roughly) the number of entries in the
dictionary, give size=0.
*/
/*--------------------------------------------------------------------------*/
dictionary * dictionary_new(int size)
{
dictionary * d ;
/* If no size was specified, allocate space for DICTMINSZ */
if (size<DICTMINSZ) size=DICTMINSZ ;
if (!(d = (dictionary *)calloc(1, sizeof(dictionary)))) {
return NULL;
}
d->size = size ;
d->val = (char **)calloc(size, sizeof(char*));
d->key = (char **)calloc(size, sizeof(char*));
d->hash = (unsigned int *)calloc(size, sizeof(unsigned));
return d ;
}
/*-------------------------------------------------------------------------*/
/**
@brief Delete a dictionary object
@param d dictionary object to deallocate.
@return void
Deallocate a dictionary object and all memory associated to it.
*/
/*--------------------------------------------------------------------------*/
void dictionary_del(dictionary * d)
{
int i ;
if (d==NULL) return ;
for (i=0 ; i<d->size ; i++) {
if (d->key[i]!=NULL)
free(d->key[i]);
if (d->val[i]!=NULL)
free(d->val[i]);
}
free(d->val);
free(d->key);
free(d->hash);
free(d);
return ;
}
/*-------------------------------------------------------------------------*/
/**
@brief Get a value from a dictionary.
@param d dictionary object to search.
@param key Key to look for in the dictionary.
@param def Default value to return if key not found.
@return 1 pointer to internally allocated character string.
This function locates a key in a dictionary and returns a pointer to its
value, or the passed 'def' pointer if no such key can be found in
dictionary. The returned character pointer points to data internal to the
dictionary object, you should not try to free it or modify it.
*/
/*--------------------------------------------------------------------------*/
char * dictionary_get(dictionary * d, char * key, char * def)
{
unsigned hash ;
int i ;
hash = dictionary_hash(key);
for (i=0 ; i<d->size ; i++) {
if (d->key[i]==NULL)
continue ;
/* Compare hash */
if (hash==d->hash[i]) {
/* Compare string, to avoid hash collisions */
if (!strcmp(key, d->key[i])) {
return d->val[i] ;
}
}
}
return def ;
}
/*-------------------------------------------------------------------------*/
/**
@brief Set a value in a dictionary.
@param d dictionary object to modify.
@param key Key to modify or add.
@param val Value to add.
@return int 0 if Ok, anything else otherwise
If the given key is found in the dictionary, the associated value is
replaced by the provided one. If the key cannot be found in the
dictionary, it is added to it.
It is Ok to provide a NULL value for val, but NULL values for the dictionary
or the key are considered as errors: the function will return immediately
in such a case.
Notice that if you dictionary_set a variable to NULL, a call to
dictionary_get will return a NULL value: the variable will be found, and
its value (NULL) is returned. In other words, setting the variable
content to NULL is equivalent to deleting the variable from the
dictionary. It is not possible (in this implementation) to have a key in
the dictionary without value.
This function returns non-zero in case of failure.
*/
/*--------------------------------------------------------------------------*/
int dictionary_set(dictionary * d, char * key, char * val)
{
int i ;
unsigned hash ;
if (d==NULL || key==NULL) return -1 ;
/* Compute hash for this key */
hash = dictionary_hash(key) ;
/* Find if value is already in dictionary */
if (d->n>0) {
for (i=0 ; i<d->size ; i++) {
if (d->key[i]==NULL)
continue ;
if (hash==d->hash[i]) { /* Same hash value */
if (!strcmp(key, d->key[i])) { /* Same key */
/* Found a value: modify and return */
if (d->val[i]!=NULL)
free(d->val[i]);
d->val[i] = val ? xstrdup(val) : NULL ;
/* Value has been modified: return */
return 0 ;
}
}
}
}
/* Add a new value */
/* See if dictionary needs to grow */
if (d->n==d->size) {
/* Reached maximum size: reallocate dictionary */
d->val = (char **)mem_double(d->val, d->size * sizeof(char*)) ;
d->key = (char **)mem_double(d->key, d->size * sizeof(char*)) ;
d->hash = (unsigned int *)mem_double(d->hash, d->size * sizeof(unsigned)) ;
if ((d->val==NULL) || (d->key==NULL) || (d->hash==NULL)) {
/* Cannot grow dictionary */
return -1 ;
}
/* Double size */
d->size *= 2 ;
}
/* Insert key in the first empty slot */
for (i=0 ; i<d->size ; i++) {
if (d->key[i]==NULL) {
/* Add key here */
break ;
}
}
/* Copy key */
d->key[i] = xstrdup(key);
d->val[i] = val ? xstrdup(val) : NULL ;
d->hash[i] = hash;
d->n ++ ;
return 0 ;
}
/*-------------------------------------------------------------------------*/
/**
@brief Delete a key in a dictionary
@param d dictionary object to modify.
@param key Key to remove.
@return void
This function deletes a key in a dictionary. Nothing is done if the
key cannot be found.
*/
/*--------------------------------------------------------------------------*/
void dictionary_unset(dictionary * d, char * key)
{
unsigned hash ;
int i ;
if (key == NULL) {
return;
}
hash = dictionary_hash(key);
for (i=0 ; i<d->size ; i++) {
if (d->key[i]==NULL)
continue ;
/* Compare hash */
if (hash==d->hash[i]) {
/* Compare string, to avoid hash collisions */
if (!strcmp(key, d->key[i])) {
/* Found key */
break ;
}
}
}
if (i>=d->size)
/* Key not found */
return ;
free(d->key[i]);
d->key[i] = NULL ;
if (d->val[i]!=NULL) {
free(d->val[i]);
d->val[i] = NULL ;
}
d->hash[i] = 0 ;
d->n -- ;
return ;
}
/*-------------------------------------------------------------------------*/
/**
@brief Dump a dictionary to an opened file pointer.
@param d Dictionary to dump
@param f Opened file pointer.
@return void
Dumps a dictionary onto an opened file pointer. Key pairs are printed out
as @c [Key]=[Value], one per line. It is Ok to provide stdout or stderr as
output file pointers.
*/
/*--------------------------------------------------------------------------*/
void dictionary_dump(dictionary * d, FILE * out)
{
int i ;
if (d==NULL || out==NULL) return ;
if (d->n<1) {
fprintf(out, "empty dictionary\n");
return ;
}
for (i=0 ; i<d->size ; i++) {
if (d->key[i]) {
fprintf(out, "%20s\t[%s]\n",
d->key[i],
d->val[i] ? d->val[i] : "UNDEF");
}
}
return ;
}
/* Test code */
#ifdef TESTDIC
#define NVALS 20000
int main(int argc, char *argv[])
{
dictionary * d ;
char * val ;
int i ;
char cval[90] ;
/* Allocate dictionary */
printf("allocating...\n");
d = dictionary_new(0);
/* Set values in dictionary */
printf("setting %d values...\n", NVALS);
for (i=0 ; i<NVALS ; i++) {
sprintf(cval, "%04d", i);
dictionary_set(d, cval, "salut");
}
printf("getting %d values...\n", NVALS);
for (i=0 ; i<NVALS ; i++) {
sprintf(cval, "%04d", i);
val = dictionary_get(d, cval, DICT_INVALID_KEY);
if (val==DICT_INVALID_KEY) {
printf("cannot get value for key [%s]\n", cval);
}
}
printf("unsetting %d values...\n", NVALS);
for (i=0 ; i<NVALS ; i++) {
sprintf(cval, "%04d", i);
dictionary_unset(d, cval);
}
if (d->n != 0) {
printf("error deleting values\n");
}
printf("deallocating...\n");
dictionary_del(d);
return 0 ;
}
#endif
/* vim: set ts=4 et sw=4 tw=75 */

Wyświetl plik

@ -0,0 +1,174 @@
/*-------------------------------------------------------------------------*/
/**
@file dictionary.h
@author N. Devillard
@date Sep 2007
@version $Revision: 1.12 $
@brief Implements a dictionary for string variables.
This module implements a simple dictionary object, i.e. a list
of string/string associations. This object is useful to store e.g.
informations retrieved from a configuration file (ini files).
*/
/*--------------------------------------------------------------------------*/
/*
$Id: dictionary.h,v 1.12 2007-11-23 21:37:00 ndevilla Exp $
$Author: ndevilla $
$Date: 2007-11-23 21:37:00 $
$Revision: 1.12 $
*/
#ifndef _DICTIONARY_H_
#define _DICTIONARY_H_
/*---------------------------------------------------------------------------
Includes
---------------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
/*---------------------------------------------------------------------------
New types
---------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/
/**
@brief Dictionary object
This object contains a list of string/string associations. Each
association is identified by a unique string key. Looking up values
in the dictionary is speeded up by the use of a (hopefully collision-free)
hash function.
*/
/*-------------------------------------------------------------------------*/
typedef struct _dictionary_ {
int n ; /** Number of entries in dictionary */
int size ; /** Storage size */
char ** val ; /** List of string values */
char ** key ; /** List of string keys */
unsigned * hash ; /** List of hash values for keys */
} dictionary ;
/*---------------------------------------------------------------------------
Function prototypes
---------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/
/**
@brief Compute the hash key for a string.
@param key Character string to use for key.
@return 1 unsigned int on at least 32 bits.
This hash function has been taken from an Article in Dr Dobbs Journal.
This is normally a collision-free function, distributing keys evenly.
The key is stored anyway in the struct so that collision can be avoided
by comparing the key itself in last resort.
*/
/*--------------------------------------------------------------------------*/
unsigned dictionary_hash(char * key);
/*-------------------------------------------------------------------------*/
/**
@brief Create a new dictionary object.
@param size Optional initial size of the dictionary.
@return 1 newly allocated dictionary objet.
This function allocates a new dictionary object of given size and returns
it. If you do not know in advance (roughly) the number of entries in the
dictionary, give size=0.
*/
/*--------------------------------------------------------------------------*/
dictionary * dictionary_new(int size);
/*-------------------------------------------------------------------------*/
/**
@brief Delete a dictionary object
@param d dictionary object to deallocate.
@return void
Deallocate a dictionary object and all memory associated to it.
*/
/*--------------------------------------------------------------------------*/
void dictionary_del(dictionary * vd);
/*-------------------------------------------------------------------------*/
/**
@brief Get a value from a dictionary.
@param d dictionary object to search.
@param key Key to look for in the dictionary.
@param def Default value to return if key not found.
@return 1 pointer to internally allocated character string.
This function locates a key in a dictionary and returns a pointer to its
value, or the passed 'def' pointer if no such key can be found in
dictionary. The returned character pointer points to data internal to the
dictionary object, you should not try to free it or modify it.
*/
/*--------------------------------------------------------------------------*/
char * dictionary_get(dictionary * d, char * key, char * def);
/*-------------------------------------------------------------------------*/
/**
@brief Set a value in a dictionary.
@param d dictionary object to modify.
@param key Key to modify or add.
@param val Value to add.
@return int 0 if Ok, anything else otherwise
If the given key is found in the dictionary, the associated value is
replaced by the provided one. If the key cannot be found in the
dictionary, it is added to it.
It is Ok to provide a NULL value for val, but NULL values for the dictionary
or the key are considered as errors: the function will return immediately
in such a case.
Notice that if you dictionary_set a variable to NULL, a call to
dictionary_get will return a NULL value: the variable will be found, and
its value (NULL) is returned. In other words, setting the variable
content to NULL is equivalent to deleting the variable from the
dictionary. It is not possible (in this implementation) to have a key in
the dictionary without value.
This function returns non-zero in case of failure.
*/
/*--------------------------------------------------------------------------*/
int dictionary_set(dictionary * vd, char * key, char * val);
/*-------------------------------------------------------------------------*/
/**
@brief Delete a key in a dictionary
@param d dictionary object to modify.
@param key Key to remove.
@return void
This function deletes a key in a dictionary. Nothing is done if the
key cannot be found.
*/
/*--------------------------------------------------------------------------*/
void dictionary_unset(dictionary * d, char * key);
/*-------------------------------------------------------------------------*/
/**
@brief Dump a dictionary to an opened file pointer.
@param d Dictionary to dump
@param f Opened file pointer.
@return void
Dumps a dictionary onto an opened file pointer. Key pairs are printed out
as @c [Key]=[Value], one per line. It is Ok to provide stdout or stderr as
output file pointers.
*/
/*--------------------------------------------------------------------------*/
void dictionary_dump(dictionary * d, FILE * out);
#endif

Wyświetl plik

@ -0,0 +1,668 @@
/*-------------------------------------------------------------------------*/
/**
@file iniparser.c
@author N. Devillard
@date Sep 2007
@version 3.0
@brief Parser for ini files.
*/
/*--------------------------------------------------------------------------*/
/*
$Id: iniparser.c,v 2.18 2008-01-03 18:35:39 ndevilla Exp $
$Revision: 2.18 $
$Date: 2008-01-03 18:35:39 $
*/
/*---------------------------- Includes ------------------------------------*/
#include <ctype.h>
#include "iniparser.h"
/*---------------------------- Defines -------------------------------------*/
#define ASCIILINESZ (1024)
#define INI_INVALID_KEY ((char*)-1)
/*---------------------------------------------------------------------------
Private to this module
---------------------------------------------------------------------------*/
/**
* This enum stores the status for each parsed line (internal use only).
*/
typedef enum _line_status_ {
LINE_UNPROCESSED,
LINE_ERROR,
LINE_EMPTY,
LINE_COMMENT,
LINE_SECTION,
LINE_VALUE
} line_status ;
/*-------------------------------------------------------------------------*/
/**
@brief Convert a string to lowercase.
@param s String to convert.
@return ptr to statically allocated string.
This function returns a pointer to a statically allocated string
containing a lowercased version of the input string. Do not free
or modify the returned string! Since the returned string is statically
allocated, it will be modified at each function call (not re-entrant).
*/
/*--------------------------------------------------------------------------*/
static char * strlwc(const char * s)
{
static char l[ASCIILINESZ+1];
int i ;
if (s==NULL) return NULL ;
memset(l, 0, ASCIILINESZ+1);
i=0 ;
while (s[i] && i<ASCIILINESZ) {
l[i] = (char)tolower((int)s[i]);
i++ ;
}
l[ASCIILINESZ]=(char)0;
return l ;
}
/*-------------------------------------------------------------------------*/
/**
@brief Remove blanks at the beginning and the end of a string.
@param s String to parse.
@return ptr to statically allocated string.
This function returns a pointer to a statically allocated string,
which is identical to the input string, except that all blank
characters at the end and the beg. of the string have been removed.
Do not free or modify the returned string! Since the returned string
is statically allocated, it will be modified at each function call
(not re-entrant).
*/
/*--------------------------------------------------------------------------*/
static char * strstrip(char * s)
{
static char l[ASCIILINESZ+1];
char * last ;
if (s==NULL) return NULL ;
while (isspace((int)*s) && *s) s++;
memset(l, 0, ASCIILINESZ+1);
strcpy(l, s);
last = l + strlen(l);
while (last > l) {
if (!isspace((int)*(last-1)))
break ;
last -- ;
}
*last = (char)0;
return (char*)l ;
}
/*-------------------------------------------------------------------------*/
/**
@brief Get number of sections in a dictionary
@param d Dictionary to examine
@return int Number of sections found in dictionary
This function returns the number of sections found in a dictionary.
The test to recognize sections is done on the string stored in the
dictionary: a section name is given as "section" whereas a key is
stored as "section:key", thus the test looks for entries that do not
contain a colon.
This clearly fails in the case a section name contains a colon, but
this should simply be avoided.
This function returns -1 in case of error.
*/
/*--------------------------------------------------------------------------*/
int iniparser_getnsec(dictionary * d)
{
int i ;
int nsec ;
if (d==NULL) return -1 ;
nsec=0 ;
for (i=0 ; i<d->size ; i++) {
if (d->key[i]==NULL)
continue ;
if (strchr(d->key[i], ':')==NULL) {
nsec ++ ;
}
}
return nsec ;
}
/*-------------------------------------------------------------------------*/
/**
@brief Get name for section n in a dictionary.
@param d Dictionary to examine
@param n Section number (from 0 to nsec-1).
@return Pointer to char string
This function locates the n-th section in a dictionary and returns
its name as a pointer to a string statically allocated inside the
dictionary. Do not free or modify the returned string!
This function returns NULL in case of error.
*/
/*--------------------------------------------------------------------------*/
char * iniparser_getsecname(dictionary * d, int n)
{
int i ;
int foundsec ;
if (d==NULL || n<0) return NULL ;
foundsec=0 ;
for (i=0 ; i<d->size ; i++) {
if (d->key[i]==NULL)
continue ;
if (strchr(d->key[i], ':')==NULL) {
foundsec++ ;
if (foundsec>n)
break ;
}
}
if (foundsec<=n) {
return NULL ;
}
return d->key[i] ;
}
/*-------------------------------------------------------------------------*/
/**
@brief Dump a dictionary to an opened file pointer.
@param d Dictionary to dump.
@param f Opened file pointer to dump to.
@return void
This function prints out the contents of a dictionary, one element by
line, onto the provided file pointer. It is OK to specify @c stderr
or @c stdout as output files. This function is meant for debugging
purposes mostly.
*/
/*--------------------------------------------------------------------------*/
void iniparser_dump(dictionary * d, FILE * f)
{
int i ;
if (d==NULL || f==NULL) return ;
for (i=0 ; i<d->size ; i++) {
if (d->key[i]==NULL)
continue ;
if (d->val[i]!=NULL) {
fprintf(f, "[%s]=[%s]\n", d->key[i], d->val[i]);
} else {
fprintf(f, "[%s]=UNDEF\n", d->key[i]);
}
}
return ;
}
/*-------------------------------------------------------------------------*/
/**
@brief Save a dictionary to a loadable ini file
@param d Dictionary to dump
@param f Opened file pointer to dump to
@return void
This function dumps a given dictionary into a loadable ini file.
It is Ok to specify @c stderr or @c stdout as output files.
*/
/*--------------------------------------------------------------------------*/
void iniparser_dump_ini(dictionary * d, FILE * f)
{
int i, j ;
char keym[ASCIILINESZ+1];
int nsec ;
char * secname ;
int seclen ;
if (d==NULL || f==NULL) return ;
nsec = iniparser_getnsec(d);
if (nsec<1) {
/* No section in file: dump all keys as they are */
for (i=0 ; i<d->size ; i++) {
if (d->key[i]==NULL)
continue ;
fprintf(f, "%s = %s\n", d->key[i], d->val[i]);
}
return ;
}
for (i=0 ; i<nsec ; i++) {
secname = iniparser_getsecname(d, i) ;
seclen = (int)strlen(secname);
fprintf(f, "\n[%s]\n", secname);
sprintf(keym, "%s:", secname);
for (j=0 ; j<d->size ; j++) {
if (d->key[j]==NULL)
continue ;
if (!strncmp(d->key[j], keym, seclen+1)) {
fprintf(f,
"%-30s = %s\n",
d->key[j]+seclen+1,
d->val[j] ? d->val[j] : "");
}
}
}
fprintf(f, "\n");
return ;
}
/*-------------------------------------------------------------------------*/
/**
@brief Get the string associated to a key
@param d Dictionary to search
@param key Key string to look for
@param def Default value to return if key not found.
@return pointer to statically allocated character string
This function queries a dictionary for a key. A key as read from an
ini file is given as "section:key". If the key cannot be found,
the pointer passed as 'def' is returned.
The returned char pointer is pointing to a string allocated in
the dictionary, do not free or modify it.
*/
/*--------------------------------------------------------------------------*/
char * iniparser_getstring(dictionary * d, const char * key, char * def)
{
char * lc_key ;
char * sval ;
if (d==NULL || key==NULL)
return def ;
lc_key = strlwc(key);
sval = dictionary_get(d, lc_key, def);
return sval ;
}
/*-------------------------------------------------------------------------*/
/**
@brief Get the string associated to a key, convert to an int
@param d Dictionary to search
@param key Key string to look for
@param notfound Value to return in case of error
@return integer
This function queries a dictionary for a key. A key as read from an
ini file is given as "section:key". If the key cannot be found,
the notfound value is returned.
Supported values for integers include the usual C notation
so decimal, octal (starting with 0) and hexadecimal (starting with 0x)
are supported. Examples:
"42" -> 42
"042" -> 34 (octal -> decimal)
"0x42" -> 66 (hexa -> decimal)
Warning: the conversion may overflow in various ways. Conversion is
totally outsourced to strtol(), see the associated man page for overflow
handling.
Credits: Thanks to A. Becker for suggesting strtol()
*/
/*--------------------------------------------------------------------------*/
int iniparser_getint(dictionary * d, const char * key, int notfound)
{
char * str ;
str = iniparser_getstring(d, key, INI_INVALID_KEY);
if (str==INI_INVALID_KEY) return notfound ;
return (int)strtol(str, NULL, 0);
}
/*-------------------------------------------------------------------------*/
/**
@brief Get the string associated to a key, convert to a double
@param d Dictionary to search
@param key Key string to look for
@param notfound Value to return in case of error
@return double
This function queries a dictionary for a key. A key as read from an
ini file is given as "section:key". If the key cannot be found,
the notfound value is returned.
*/
/*--------------------------------------------------------------------------*/
double iniparser_getdouble(dictionary * d, char * key, double notfound)
{
char * str ;
str = iniparser_getstring(d, key, INI_INVALID_KEY);
if (str==INI_INVALID_KEY) return notfound ;
return atof(str);
}
/*-------------------------------------------------------------------------*/
/**
@brief Get the string associated to a key, convert to a boolean
@param d Dictionary to search
@param key Key string to look for
@param notfound Value to return in case of error
@return integer
This function queries a dictionary for a key. A key as read from an
ini file is given as "section:key". If the key cannot be found,
the notfound value is returned.
A true boolean is found if one of the following is matched:
- A string starting with 'y'
- A string starting with 'Y'
- A string starting with 't'
- A string starting with 'T'
- A string starting with '1'
A false boolean is found if one of the following is matched:
- A string starting with 'n'
- A string starting with 'N'
- A string starting with 'f'
- A string starting with 'F'
- A string starting with '0'
The notfound value returned if no boolean is identified, does not
necessarily have to be 0 or 1.
*/
/*--------------------------------------------------------------------------*/
int iniparser_getboolean(dictionary * d, const char * key, int notfound)
{
char * c ;
int ret ;
c = iniparser_getstring(d, key, INI_INVALID_KEY);
if (c==INI_INVALID_KEY) return notfound ;
if (c[0]=='y' || c[0]=='Y' || c[0]=='1' || c[0]=='t' || c[0]=='T') {
ret = 1 ;
} else if (c[0]=='n' || c[0]=='N' || c[0]=='0' || c[0]=='f' || c[0]=='F') {
ret = 0 ;
} else {
ret = notfound ;
}
return ret;
}
/*-------------------------------------------------------------------------*/
/**
@brief Finds out if a given entry exists in a dictionary
@param ini Dictionary to search
@param entry Name of the entry to look for
@return integer 1 if entry exists, 0 otherwise
Finds out if a given entry exists in the dictionary. Since sections
are stored as keys with NULL associated values, this is the only way
of querying for the presence of sections in a dictionary.
*/
/*--------------------------------------------------------------------------*/
int iniparser_find_entry(
dictionary * ini,
char * entry
)
{
int found=0 ;
if (iniparser_getstring(ini, entry, INI_INVALID_KEY)!=INI_INVALID_KEY) {
found = 1 ;
}
return found ;
}
/*-------------------------------------------------------------------------*/
/**
@brief Set an entry in a dictionary.
@param ini Dictionary to modify.
@param entry Entry to modify (entry name)
@param val New value to associate to the entry.
@return int 0 if Ok, -1 otherwise.
If the given entry can be found in the dictionary, it is modified to
contain the provided value. If it cannot be found, -1 is returned.
It is Ok to set val to NULL.
*/
/*--------------------------------------------------------------------------*/
int iniparser_set(dictionary * ini, char * entry, char * val)
{
return dictionary_set(ini, strlwc(entry), val) ;
}
/*-------------------------------------------------------------------------*/
/**
@brief Delete an entry in a dictionary
@param ini Dictionary to modify
@param entry Entry to delete (entry name)
@return void
If the given entry can be found, it is deleted from the dictionary.
*/
/*--------------------------------------------------------------------------*/
void iniparser_unset(dictionary * ini, char * entry)
{
dictionary_unset(ini, strlwc(entry));
}
/*-------------------------------------------------------------------------*/
/**
@brief Load a single line from an INI file
@param input_line Input line, may be concatenated multi-line input
@param section Output space to store section
@param key Output space to store key
@param value Output space to store value
@return line_status value
*/
/*--------------------------------------------------------------------------*/
static line_status iniparser_line(
char * input_line,
char * section,
char * key,
char * value)
{
line_status sta ;
char line[ASCIILINESZ+1];
int len ;
strcpy(line, strstrip(input_line));
len = (int)strlen(line);
sta = LINE_UNPROCESSED ;
if (len<1) {
/* Empty line */
sta = LINE_EMPTY ;
} else if (line[0]=='#') {
/* Comment line */
sta = LINE_COMMENT ;
} else if (line[0]=='[' && line[len-1]==']') {
/* Section name */
sscanf(line, "[%[^]]", section);
strcpy(section, strstrip(section));
strcpy(section, strlwc(section));
sta = LINE_SECTION ;
} else if (sscanf (line, "%[^=] = \"%[^\"]\"", key, value) == 2
|| sscanf (line, "%[^=] = '%[^\']'", key, value) == 2
|| sscanf (line, "%[^=] = %[^;#]", key, value) == 2) {
/* Usual key=value, with or without comments */
strcpy(key, strstrip(key));
strcpy(key, strlwc(key));
strcpy(value, strstrip(value));
/*
* sscanf cannot handle '' or "" as empty values
* this is done here
*/
if (!strcmp(value, "\"\"") || (!strcmp(value, "''"))) {
value[0]=0 ;
}
sta = LINE_VALUE ;
} else if (sscanf(line, "%[^=] = %[;#]", key, value)==2
|| sscanf(line, "%[^=] %[=]", key, value) == 2) {
/*
* Special cases:
* key=
* key=;
* key=#
*/
strcpy(key, strstrip(key));
strcpy(key, strlwc(key));
value[0]=0 ;
sta = LINE_VALUE ;
} else {
/* Generate syntax error */
sta = LINE_ERROR ;
}
return sta ;
}
/*-------------------------------------------------------------------------*/
/**
@brief Parse an ini file and return an allocated dictionary object
@param in FILE* to read INI from
@return Pointer to newly allocated dictionary
This is the parser for ini files. This function is called, providing
the name of the file to be read. It returns a dictionary object that
should not be accessed directly, but through accessor functions
instead.
The returned dictionary must be freed using iniparser_freedict().
*/
/*--------------------------------------------------------------------------*/
dictionary * iniparser_loadfile(FILE * in)
{
char line [ASCIILINESZ+1] ;
char section [ASCIILINESZ+1] ;
char key [ASCIILINESZ+1] ;
char tmp [ASCIILINESZ+1] ;
char val [ASCIILINESZ+1] ;
int last=0 ;
int len ;
int lineno=0 ;
int errs=0;
dictionary * dict ;
if(in == NULL) {
return NULL ;
}
dict = dictionary_new(0) ;
if (!dict) {
return NULL ;
}
memset(line, 0, ASCIILINESZ);
memset(section, 0, ASCIILINESZ);
memset(key, 0, ASCIILINESZ);
memset(val, 0, ASCIILINESZ);
last=0 ;
while (fgets(line+last, ASCIILINESZ-last, in)!=NULL) {
lineno++ ;
len = (int)strlen(line)-1;
/* Safety check against buffer overflows */
if (line[len]!='\n') {
fprintf(stderr,
"iniparser: input line too long in file (%d)\n",
lineno);
dictionary_del(dict);
return NULL ;
}
/* Get rid of \n and spaces at end of line */
while ((len>=0) &&
((line[len]=='\n') || (isspace(line[len])))) {
line[len]=0 ;
len-- ;
}
/* Detect multi-line */
if (line[len]=='\\') {
/* Multi-line value */
last=len ;
continue ;
} else {
last=0 ;
}
switch (iniparser_line(line, section, key, val)) {
case LINE_EMPTY:
case LINE_COMMENT:
break ;
case LINE_SECTION:
errs = dictionary_set(dict, section, NULL);
break ;
case LINE_VALUE:
sprintf(tmp, "%s:%s", section, key);
errs = dictionary_set(dict, tmp, val) ;
break ;
case LINE_ERROR:
fprintf(stderr, "iniparser: syntax error in file (%d):\n",
lineno);
fprintf(stderr, "-> %s\n", line);
errs++ ;
break;
default:
break ;
}
memset(line, 0, ASCIILINESZ);
last=0;
if (errs<0) {
fprintf(stderr, "iniparser: memory allocation failure\n");
break ;
}
}
if (errs) {
dictionary_del(dict);
dict = NULL ;
}
return dict ;
}
/*-------------------------------------------------------------------------*/
/**
@brief Parse an ini file and return an allocated dictionary object
@param ininame Name of the ini file to read.
@return Pointer to newly allocated dictionary
This is the parser for ini files. This function is called, providing
the name of the file to be read. It returns a dictionary object that
should not be accessed directly, but through accessor functions
instead.
The returned dictionary must be freed using iniparser_freedict().
*/
/*--------------------------------------------------------------------------*/
dictionary * iniparser_load(const char * ininame)
{
FILE * in;
dictionary * dict;
if ((in=fopen(ininame, "r"))==NULL) {
fprintf(stderr, "iniparser: cannot open %s\n", ininame);
return NULL ;
}
dict = iniparser_loadfile(in);
fclose(in);
return dict ;
}
/*-------------------------------------------------------------------------*/
/**
@brief Free all memory associated to an ini dictionary
@param d Dictionary to free
@return void
Free all memory associated to an ini dictionary.
It is mandatory to call this function before the dictionary object
gets out of the current context.
*/
/*--------------------------------------------------------------------------*/
void iniparser_freedict(dictionary * d)
{
dictionary_del(d);
}
/* vim: set ts=4 et sw=4 tw=75 */

Wyświetl plik

@ -0,0 +1,296 @@
/*-------------------------------------------------------------------------*/
/**
@file iniparser.h
@author N. Devillard
@date Sep 2007
@version 3.0
@brief Parser for ini files.
*/
/*--------------------------------------------------------------------------*/
/*
$Id: iniparser.h,v 1.24 2007-11-23 21:38:19 ndevilla Exp $
$Revision: 1.24 $
*/
#ifndef _INIPARSER_H_
#define _INIPARSER_H_
/*---------------------------------------------------------------------------
Includes
---------------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
* The following #include is necessary on many Unixes but not Linux.
* It is not needed for Windows platforms.
* Uncomment it if needed.
*/
/* #include <unistd.h> */
#include "dictionary.h"
/*---------------------------------------------------------------------------
Macros
---------------------------------------------------------------------------*/
/** For backwards compatibility only */
#define iniparser_getstr(d, k) iniparser_getstring(d, k, NULL)
#define iniparser_setstr iniparser_setstring
/*-------------------------------------------------------------------------*/
/**
@brief Get number of sections in a dictionary
@param d Dictionary to examine
@return int Number of sections found in dictionary
This function returns the number of sections found in a dictionary.
The test to recognize sections is done on the string stored in the
dictionary: a section name is given as "section" whereas a key is
stored as "section:key", thus the test looks for entries that do not
contain a colon.
This clearly fails in the case a section name contains a colon, but
this should simply be avoided.
This function returns -1 in case of error.
*/
/*--------------------------------------------------------------------------*/
int iniparser_getnsec(dictionary * d);
/*-------------------------------------------------------------------------*/
/**
@brief Get name for section n in a dictionary.
@param d Dictionary to examine
@param n Section number (from 0 to nsec-1).
@return Pointer to char string
This function locates the n-th section in a dictionary and returns
its name as a pointer to a string statically allocated inside the
dictionary. Do not free or modify the returned string!
This function returns NULL in case of error.
*/
/*--------------------------------------------------------------------------*/
char * iniparser_getsecname(dictionary * d, int n);
/*-------------------------------------------------------------------------*/
/**
@brief Save a dictionary to a loadable ini file
@param d Dictionary to dump
@param f Opened file pointer to dump to
@return void
This function dumps a given dictionary into a loadable ini file.
It is Ok to specify @c stderr or @c stdout as output files.
*/
/*--------------------------------------------------------------------------*/
void iniparser_dump_ini(dictionary * d, FILE * f);
/*-------------------------------------------------------------------------*/
/**
@brief Dump a dictionary to an opened file pointer.
@param d Dictionary to dump.
@param f Opened file pointer to dump to.
@return void
This function prints out the contents of a dictionary, one element by
line, onto the provided file pointer. It is OK to specify @c stderr
or @c stdout as output files. This function is meant for debugging
purposes mostly.
*/
/*--------------------------------------------------------------------------*/
void iniparser_dump(dictionary * d, FILE * f);
/*-------------------------------------------------------------------------*/
/**
@brief Get the string associated to a key
@param d Dictionary to search
@param key Key string to look for
@param def Default value to return if key not found.
@return pointer to statically allocated character string
This function queries a dictionary for a key. A key as read from an
ini file is given as "section:key". If the key cannot be found,
the pointer passed as 'def' is returned.
The returned char pointer is pointing to a string allocated in
the dictionary, do not free or modify it.
*/
/*--------------------------------------------------------------------------*/
char * iniparser_getstring(dictionary * d, const char * key, char * def);
/*-------------------------------------------------------------------------*/
/**
@brief Get the string associated to a key, convert to an int
@param d Dictionary to search
@param key Key string to look for
@param notfound Value to return in case of error
@return integer
This function queries a dictionary for a key. A key as read from an
ini file is given as "section:key". If the key cannot be found,
the notfound value is returned.
Supported values for integers include the usual C notation
so decimal, octal (starting with 0) and hexadecimal (starting with 0x)
are supported. Examples:
- "42" -> 42
- "042" -> 34 (octal -> decimal)
- "0x42" -> 66 (hexa -> decimal)
Warning: the conversion may overflow in various ways. Conversion is
totally outsourced to strtol(), see the associated man page for overflow
handling.
Credits: Thanks to A. Becker for suggesting strtol()
*/
/*--------------------------------------------------------------------------*/
int iniparser_getint(dictionary * d, const char * key, int notfound);
/*-------------------------------------------------------------------------*/
/**
@brief Get the string associated to a key, convert to a double
@param d Dictionary to search
@param key Key string to look for
@param notfound Value to return in case of error
@return double
This function queries a dictionary for a key. A key as read from an
ini file is given as "section:key". If the key cannot be found,
the notfound value is returned.
*/
/*--------------------------------------------------------------------------*/
double iniparser_getdouble(dictionary * d, char * key, double notfound);
/*-------------------------------------------------------------------------*/
/**
@brief Get the string associated to a key, convert to a boolean
@param d Dictionary to search
@param key Key string to look for
@param notfound Value to return in case of error
@return integer
This function queries a dictionary for a key. A key as read from an
ini file is given as "section:key". If the key cannot be found,
the notfound value is returned.
A true boolean is found if one of the following is matched:
- A string starting with 'y'
- A string starting with 'Y'
- A string starting with 't'
- A string starting with 'T'
- A string starting with '1'
A false boolean is found if one of the following is matched:
- A string starting with 'n'
- A string starting with 'N'
- A string starting with 'f'
- A string starting with 'F'
- A string starting with '0'
The notfound value returned if no boolean is identified, does not
necessarily have to be 0 or 1.
*/
/*--------------------------------------------------------------------------*/
int iniparser_getboolean(dictionary * d, const char * key, int notfound);
/*-------------------------------------------------------------------------*/
/**
@brief Set an entry in a dictionary.
@param ini Dictionary to modify.
@param entry Entry to modify (entry name)
@param val New value to associate to the entry.
@return int 0 if Ok, -1 otherwise.
If the given entry can be found in the dictionary, it is modified to
contain the provided value. If it cannot be found, -1 is returned.
It is Ok to set val to NULL.
*/
/*--------------------------------------------------------------------------*/
int iniparser_setstring(dictionary * ini, char * entry, char * val);
/*-------------------------------------------------------------------------*/
/**
@brief Delete an entry in a dictionary
@param ini Dictionary to modify
@param entry Entry to delete (entry name)
@return void
If the given entry can be found, it is deleted from the dictionary.
*/
/*--------------------------------------------------------------------------*/
void iniparser_unset(dictionary * ini, char * entry);
/*-------------------------------------------------------------------------*/
/**
@brief Finds out if a given entry exists in a dictionary
@param ini Dictionary to search
@param entry Name of the entry to look for
@return integer 1 if entry exists, 0 otherwise
Finds out if a given entry exists in the dictionary. Since sections
are stored as keys with NULL associated values, this is the only way
of querying for the presence of sections in a dictionary.
*/
/*--------------------------------------------------------------------------*/
int iniparser_find_entry(dictionary * ini, char * entry) ;
/*-------------------------------------------------------------------------*/
/**
@brief Parse an ini file and return an allocated dictionary object
@param ininame Name of the ini file to read.
@return Pointer to newly allocated dictionary
This is the parser for ini files. This function is called, providing
the name of the file to be read. It returns a dictionary object that
should not be accessed directly, but through accessor functions
instead.
The returned dictionary must be freed using iniparser_freedict().
*/
/*--------------------------------------------------------------------------*/
dictionary * iniparser_load(const char * ininame);
/*-------------------------------------------------------------------------*/
/**
@brief Parse an ini file and return an allocated dictionary object
@param file FILE* associated with file to read
@return Pointer to newly allocated dictionary
This is the parser for ini files. This function is called, providing
the name of the file to be read. It returns a dictionary object that
should not be accessed directly, but through accessor functions
instead.
The returned dictionary must be freed using iniparser_freedict().
*/
/*--------------------------------------------------------------------------*/
dictionary * iniparser_loadfile(FILE * file);
/*-------------------------------------------------------------------------*/
/**
@brief Free all memory associated to an ini dictionary
@param d Dictionary to free
@return void
Free all memory associated to an ini dictionary.
It is mandatory to call this function before the dictionary object
gets out of the current context.
*/
/*--------------------------------------------------------------------------*/
void iniparser_freedict(dictionary * d);
#endif

BIN
pred_src/pred 100755

Plik binarny nie jest wyświetlany.

363
pred_src/pred.c 100644
Wyświetl plik

@ -0,0 +1,363 @@
// --------------------------------------------------------------
// CU Spaceflight Landing Prediction
// Copyright (c) CU Spaceflight 2009, All Right Reserved
//
// Written by Rob Anderson
// Modified by Fergus Noble
//
// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
// --------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include "ini/iniparser.h"
#include "util/gopt.h"
#include "wind/wind_file_cache.h"
#include "run_model.h"
#include "pred.h"
#include "altitude.h"
FILE* output;
FILE* kml_file;
const char* data_dir;
int verbosity;
int main(int argc, const char *argv[]) {
const char* argument;
long int initial_timestamp;
float initial_lat, initial_lng, initial_alt;
float burst_alt, ascent_rate, drag_coeff, rmswinderror;
int descent_mode;
int scenario_idx, n_scenarios;
char* endptr; // used to check for errors on strtod calls
wind_file_cache_t* file_cache;
dictionary* scenario = NULL;
// configure command-line options parsing
void *options = gopt_sort(&argc, argv, gopt_start(
gopt_option('h', 0, gopt_shorts('h', '?'), gopt_longs("help")),
gopt_option('z', 0, gopt_shorts(0), gopt_longs("version")),
gopt_option('v', GOPT_REPEAT, gopt_shorts('v'), gopt_longs("verbose")),
gopt_option('o', GOPT_ARG, gopt_shorts('o'), gopt_longs("output")),
gopt_option('k', GOPT_ARG, gopt_shorts('k'), gopt_longs("kml")),
gopt_option('t', GOPT_ARG, gopt_shorts('t'), gopt_longs("start_time")),
gopt_option('i', GOPT_ARG, gopt_shorts('i'), gopt_longs("data_dir")),
gopt_option('d', 0, gopt_shorts('d'), gopt_longs("descending")),
gopt_option('e', GOPT_ARG, gopt_shorts('e'), gopt_longs("wind_error"))
));
if (gopt(options, 'h')) {
// Help!
// Print usage information
printf("Usage: %s [options] [scenario files]\n", argv[0]);
printf("Options:\n\n");
printf(" -h --help Display this information.\n");
printf(" --version Display version information.\n");
printf(" -v --verbose Display more information while running,\n");
printf(" Use -vv, -vvv etc. for even more verbose output.\n");
printf(" -t --start_time <int> Start time of model, defaults to current time.\n");
printf(" Should be a UNIX standard format timestamp.\n");
printf(" -o --output <file> Output file for CSV data, defaults to stdout. Overrides scenario.\n");
printf(" -k --kml <file> Output KML file.\n");
printf(" -d --descending We are in the descent phase of the flight, i.e. after\n");
printf(" burst or cutdown. burst_alt and ascent_rate ignored.\n");
printf(" -i --data_dir <dir> Input directory for wind data, defaults to current dir.\n\n");
printf(" -e --wind_error <err> RMS windspeed error (m/s).\n");
printf("The scenario file is an INI-like file giving the launch scenario. If it is\n");
printf("omitted, the scenario is read from standard input.\n");
exit(0);
}
if (gopt(options, 'z')) {
// Version information
printf("Landing Prediction version: %s\nCopyright (c) CU Spaceflight 2009\n", VERSION);
exit(0);
}
verbosity = gopt(options, 'v');
if (gopt(options, 'd'))
descent_mode = DESCENT_MODE_DESCENDING;
else
descent_mode = DESCENT_MODE_NORMAL;
if (gopt_arg(options, 'k', &argument) && strcmp(argument, "-")) {
kml_file = fopen(argument, "wb");
if (!kml_file) {
fprintf(stderr, "ERROR: %s: could not open KML file for output\n", argument);
exit(1);
}
}
else
kml_file = NULL;
if (gopt_arg(options, 't', &argument) && strcmp(argument, "-")) {
initial_timestamp = strtol(argument, &endptr, 0);
if (endptr == argument) {
fprintf(stderr, "ERROR: %s: invalid start timestamp\n", argument);
exit(1);
}
} else {
initial_timestamp = time(NULL);
}
if (!(gopt_arg(options, 'i', &data_dir) && strcmp(data_dir, "-")))
data_dir = "./";
// populate wind data file cache
file_cache = wind_file_cache_new(data_dir);
// read in flight parameters
n_scenarios = argc - 1;
if(n_scenarios == 0) {
// we'll parse from std in
n_scenarios = 1;
}
for(scenario_idx = 0; scenario_idx < n_scenarios; ++scenario_idx) {
char* scenario_output = NULL;
if(argc > scenario_idx+1) {
scenario = iniparser_load(argv[scenario_idx+1]);
} else {
scenario = iniparser_loadfile(stdin);
}
if(!scenario) {
fprintf(stderr, "ERROR: could not parse scanario file.\n");
exit(1);
}
if(verbosity > 1) {
fprintf(stderr, "INFO: Parsed scenario file:\n");
iniparser_dump_ini(scenario, stderr);
}
scenario_output = iniparser_getstring(scenario, "output:filename", NULL);
if (gopt_arg(options, 'o', &argument) && strcmp(argument, "-")) {
if(verbosity > 0) {
fprintf(stderr, "INFO: Writing output to file specified on command line: %s\n", argument);
}
output = fopen(argument, "wb");
if (!output) {
fprintf(stderr, "ERROR: %s: could not open CSV file for output\n", argument);
exit(1);
}
} else if (scenario_output != NULL) {
if(verbosity > 0) {
fprintf(stderr, "INFO: Writing output to file specified in scenario: %s\n", scenario_output);
}
output = fopen(scenario_output, "wb");
if (!output) {
fprintf(stderr, "ERROR: %s: could not open CSV file for output\n", scenario_output);
exit(1);
}
} else {
if(verbosity > 0) {
fprintf(stderr, "INFO: Writing output to stdout.\n");
}
output = stdout;
}
// write KML header
if (kml_file)
start_kml();
// The observant amongst you will notice that there are default values for
// *all* keys. This information should not be spread around too well.
// Unfortunately, this means we lack some error checking.
initial_lat = iniparser_getdouble(scenario, "launch-site:latitude", 0.0);
initial_lng = iniparser_getdouble(scenario, "launch-site:longitude", 0.0);
initial_alt = iniparser_getdouble(scenario, "launch-site:altitude", 0.0);
ascent_rate = iniparser_getdouble(scenario, "altitude-model:ascent-rate", 1.0);
// The 1.1045 comes from a magic constant buried in
// ~cuspaceflight/public_html/predict/index.php.
drag_coeff = iniparser_getdouble(scenario, "altitude-model:descent-rate", 1.0) * 1.1045;
burst_alt = iniparser_getdouble(scenario, "altitude-model:burst-altitude", 1.0);
rmswinderror = iniparser_getdouble(scenario, "atmosphere:wind-error", 0.0);
if(gopt_arg(options, 'e', &argument) && strcmp(argument, "-")) {
rmswinderror = strtod(argument, &endptr);
if (endptr == argument) {
fprintf(stderr, "ERROR: %s: invalid RMS wind speed error\n", argument);
exit(1);
}
}
{
int year, month, day, hour, minute, second;
year = iniparser_getint(scenario, "launch-time:year", -1);
month = iniparser_getint(scenario, "launch-time:month", -1);
day = iniparser_getint(scenario, "launch-time:day", -1);
hour = iniparser_getint(scenario, "launch-time:hour", -1);
minute = iniparser_getint(scenario, "launch-time:minute", -1);
second = iniparser_getint(scenario, "launch-time:second", -1);
if((year >= 0) && (month >= 0) && (day >= 0) && (hour >= 0)
&& (minute >= 0) && (second >= 0))
{
struct tm timeval = { 0 };
time_t scenario_launch_time = -1;
if(verbosity > 0) {
fprintf(stderr, "INFO: Using launch time from scenario: "
"%i/%i/%i %i:%i:%i\n",
year, month, day, hour, minute, second);
}
timeval.tm_sec = second;
timeval.tm_min = minute;
timeval.tm_hour = hour;
timeval.tm_mday = day; /* 1 - 31 */
timeval.tm_mon = month - 1; /* 0 - 11 */
timeval.tm_year = year - 1900; /* fuck you Millenium Bug! */
#ifndef _BSD_SOURCE
# warning This version of mktime does not allow explicit setting of timezone.
#else
timeval.tm_zone = "UTC";
#endif
scenario_launch_time = mktime(&timeval);
if(scenario_launch_time <= 0) {
fprintf(stderr, "WARN: Launch time in scenario is invalid, reverting to "
"default timestamp.\n");
} else {
initial_timestamp = scenario_launch_time;
}
}
}
if(verbosity > 0) {
fprintf(stderr, "INFO: Scenario loaded:\n");
fprintf(stderr, " - Initial latitude : %lf deg N\n", initial_lat);
fprintf(stderr, " - Initial longitude : %lf deg E\n", initial_lng);
fprintf(stderr, " - Initial altitude : %lf m above sea level\n", initial_alt);
fprintf(stderr, " - Initial timestamp : %li\n", initial_timestamp);
fprintf(stderr, " - Drag coeff. : %lf\n", drag_coeff);
if(!descent_mode) {
fprintf(stderr, " - Ascent rate : %lf m/s\n", ascent_rate);
fprintf(stderr, " - Burst alt. : %lf m\n", burst_alt);
}
fprintf(stderr, " - Windspeed err. : %f m/s\n", rmswinderror);
}
{
// do the actual stuff!!
altitude_model_t* alt_model = altitude_model_new(descent_mode, burst_alt,
ascent_rate, drag_coeff);
if(!alt_model) {
fprintf(stderr, "ERROR: error initialising altitude profile\n");
exit(1);
}
if (!run_model(file_cache, alt_model,
initial_lat, initial_lng, initial_alt, initial_timestamp,
rmswinderror)) {
fprintf(stderr, "ERROR: error during model run!\n");
exit(1);
}
altitude_model_free(alt_model);
}
// release the scenario
iniparser_freedict(scenario);
// write footer to KML and close output files
if (kml_file) {
finish_kml();
fclose(kml_file);
}
if (output != stdout) {
fclose(output);
}
}
// release gopt data,
gopt_free(options);
// release the file cache resources.
wind_file_cache_free(file_cache);
return 0;
}
void write_position(float lat, float lng, float alt, int timestamp) {
if (kml_file) {
fprintf(kml_file, "%g,%g,%g\n", lng, lat, alt);
if (ferror(kml_file)) {
fprintf(stderr, "ERROR: error writing to KML file\n");
exit(1);
}
}
fprintf(output, "%d,%g,%g,%g\n", timestamp, lat, lng, alt);
if (ferror(output)) {
fprintf(stderr, "ERROR: error writing to CSV file\n");
exit(1);
}
}
void start_kml() {
FILE* kml_header;
char c;
kml_header = fopen("kml_header", "r");
while (!feof(kml_header)) {
c = fgetc(kml_header);
if (ferror(kml_header)) {
fprintf(stderr, "ERROR: error reading KML header file\n");
exit(1);
}
if (!feof(kml_header)) fputc(c, kml_file);
if (ferror(kml_file)) {
fprintf(stderr, "ERROR: error writing header to KML file\n");
exit(1);
}
}
fclose(kml_header);
}
void finish_kml() {
FILE* kml_footer;
char c;
kml_footer = fopen("kml_footer", "r");
while (!feof(kml_footer)) {
c = fgetc(kml_footer);
if (ferror(kml_footer)) {
fprintf(stderr, "ERROR: error reading KML footer file\n");
exit(1);
}
if (!feof(kml_footer)) fputc(c, kml_file);
if (ferror(kml_file)) {
fprintf(stderr, "ERROR: error writing footer to KML file\n");
exit(1);
}
}
fclose(kml_footer);
}

28
pred_src/pred.h 100644
Wyświetl plik

@ -0,0 +1,28 @@
// --------------------------------------------------------------
// CU Spaceflight Landing Prediction
// Copyright (c) CU Spaceflight 2009, All Right Reserved
//
// Written by Rob Anderson
// Modified by Fergus Noble
//
// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
// --------------------------------------------------------------
#ifndef __PRED_H__
#define __PRED_H__
#define VERSION "0.0.1"
// write a position entry into the output files
void write_position(float lat, float lng, float alt, int timestamp);
// start and finish KML files, basically just write header and footer in
void start_kml();
void finish_kml();
#endif // __PRED_H__

Wyświetl plik

@ -0,0 +1,239 @@
// --------------------------------------------------------------
// CU Spaceflight Landing Prediction
// Copyright (c) CU Spaceflight 2009, All Right Reserved
//
// Written by Rob Anderson
// Modified by Fergus Noble
//
// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
// --------------------------------------------------------------
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "wind/wind_file.h"
#include "util/random.h"
#include "run_model.h"
#include "pred.h"
#include "altitude.h"
extern int verbosity;
#define RADIUS_OF_EARTH 6371009.f
typedef struct model_state_s model_state_t;
struct model_state_s
{
float lat;
float lng;
float alt;
altitude_model_t *alt_model;
double loglik;
};
// Get the distance (in metres) of one degree of latitude and one degree of
// longitude. This varys with height (not much grant you).
static void
_get_frame(float lat, float lng, float alt,
float *d_dlat, float *d_dlng)
{
float theta, r;
theta = 2.f * M_PI * (90.f - lat) / 360.f;
r = RADIUS_OF_EARTH + alt;
// See the differentiation section of
// http://en.wikipedia.org/wiki/Spherical_coordinate_system
// d/dv = d/dlat = -d/dtheta
*d_dlat = (2.f * M_PI) * r / 360.f;
// d/du = d/dlong = d/dphi
*d_dlng = (2.f * M_PI) * r * sinf(theta) / 360.f;
}
static int
_advance_one_timestep(wind_file_cache_t* cache,
unsigned long delta_t,
unsigned long timestamp, unsigned long initial_timestamp,
unsigned int n_states, model_state_t* states,
float rmserror)
{
unsigned int i;
for(i=0; i<n_states; ++i)
{
float ddlat, ddlng;
float wind_v, wind_u, wind_var;
float u_samp, v_samp, u_lik, v_lik;
model_state_t* state = &(states[i]);
if(!altitude_model_get_altitude(state->alt_model,
timestamp - initial_timestamp, &state->alt))
return 0;
if(!get_wind(cache, state->lat, state->lng, state->alt, timestamp,
&wind_v, &wind_u, &wind_var)) {
fprintf(stderr, "ERROR: error getting wind data\n");
return 0;
}
_get_frame(state->lat, state->lng, state->alt, &ddlat, &ddlng);
// NOTE: it this really the right thing to be doing? - think about what
// happens near the poles
wind_var += rmserror * rmserror;
assert(wind_var >= 0.f);
//fprintf(stderr, "U: %f +/- %f, V: %f +/- %f\n",
// wind_u, sqrtf(wind_u_var),
// wind_v, sqrtf(wind_v_var));
u_samp = random_sample_normal(wind_u, wind_var, &u_lik);
v_samp = random_sample_normal(wind_v, wind_var, &v_lik);
//u_samp = wind_u;
//v_samp = wind_v;
state->lat += v_samp * delta_t / ddlat;
state->lng += u_samp * delta_t / ddlng;
state->loglik += (double)(u_lik + v_lik);
}
return 1;
}
static int _state_compare_rev(const void* a, const void *b)
{
model_state_t* sa = (model_state_t*)a;
model_state_t* sb = (model_state_t*)b;
// this returns a value s.t. the states will be sorted so that
// the maximum likelihood state is at position 0.
return sb->loglik - sa->loglik;
}
int run_model(wind_file_cache_t* cache, altitude_model_t* alt_model,
float initial_lat, float initial_lng, float initial_alt,
long int initial_timestamp, float rmswinderror)
{
model_state_t* states;
const unsigned int n_states = 1;
unsigned int i;
states = (model_state_t*) malloc( sizeof(model_state_t) * n_states );
for(i=0; i<n_states; ++i)
{
model_state_t* state = &(states[i]);
state->alt = initial_alt;
state->lat = initial_lat;
state->lng = initial_lng;
state->alt_model = alt_model;
state->loglik = 0.f;
}
long int timestamp = initial_timestamp;
int log_counter = 0; // only write position to output files every LOG_DECIMATE timesteps
while(_advance_one_timestep(cache, TIMESTEP, timestamp, initial_timestamp,
n_states, states, rmswinderror))
{
// Sort the array of models in order of log likelihood.
qsort(states, n_states, sizeof(model_state_t), _state_compare_rev);
// write the maximum likelihood state out.
if (log_counter == LOG_DECIMATE) {
write_position(states[0].lat, states[0].lng, states[0].alt, timestamp);
log_counter = 0;
}
log_counter++;
timestamp += TIMESTEP;
}
for(i=0; i<n_states; ++i)
{
model_state_t* state = &(states[i]);
write_position(state->lat, state->lng, state->alt, timestamp);
}
fprintf(stderr, "INFO: Final maximum log lik: %f (=%f)\n",
states[0].loglik, exp(states[0].loglik));
free(states);
return 1;
}
int get_wind(wind_file_cache_t* cache, float lat, float lng, float alt, long int timestamp,
float* wind_v, float* wind_u, float *wind_var) {
int i;
float lambda, wu_l, wv_l, wu_h, wv_h;
float wuvar_l, wvvar_l, wuvar_h, wvvar_h;
wind_file_cache_entry_t* found_entries[] = { NULL, NULL };
wind_file_t* found_files[] = { NULL, NULL };
unsigned int earlier_ts, later_ts;
// look for a wind file which matches this latitude and longitude...
wind_file_cache_find_entry(cache, lat, lng, timestamp,
&(found_entries[0]), &(found_entries[1]));
if(!found_entries[0] || !found_entries[1]) {
fprintf(stderr, "ERROR: Could not locate appropriate wind data tile for time.\n");
return 0;
}
if(!wind_file_cache_entry_contains_point(found_entries[0], lat, lng) ||
!wind_file_cache_entry_contains_point(found_entries[1], lat, lng))
{
fprintf(stderr, "ERROR: Could not locate appropriate wind data tile for location "
"lat=%f, lon=%f.\n", lat, lng);
return 0;
}
// Look in the cache for the files we need.
for(i=0; i<2; ++i)
{
found_files[i] = wind_file_cache_entry_file(found_entries[i]);
}
earlier_ts = wind_file_cache_entry_timestamp(found_entries[0]);
later_ts = wind_file_cache_entry_timestamp(found_entries[1]);
if(earlier_ts == later_ts)
{
fprintf(stderr, "WARN: Do not have two data files around current time. "
"Expect the results to be wrong!\n");
}
if(earlier_ts != later_ts)
lambda = ((float)timestamp - (float)earlier_ts) /
((float)later_ts - (float)earlier_ts);
else
lambda = 0.5f;
wind_file_get_wind(found_files[0], lat, lng, alt, &wu_l, &wv_l, &wuvar_l, &wvvar_l);
wind_file_get_wind(found_files[1], lat, lng, alt, &wu_h, &wv_h, &wuvar_h, &wvvar_h);
*wind_u = lambda * wu_h + (1.f-lambda) * wu_l;
*wind_v = lambda * wv_h + (1.f-lambda) * wv_l;
// flatten the u and v variances into a single mean variance for the
// magnitude.
*wind_var = 0.5f * (wuvar_h + wuvar_l + wvvar_h + wvvar_l);
return 1;
}
// vim:sw=4:ts=4:et:cindent

Wyświetl plik

@ -0,0 +1,40 @@
// --------------------------------------------------------------
// CU Spaceflight Landing Prediction
// Copyright (c) CU Spaceflight 2009, All Right Reserved
//
// Written by Rob Anderson
// Modified by Fergus Noble
//
// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
// --------------------------------------------------------------
#ifndef __RUN_MODEL_H__
#define __RUN_MODEL_H__
#include "wind/wind_file_cache.h"
#include "altitude.h"
// run the model
int run_model(wind_file_cache_t* cache, altitude_model_t* alt_model,
float initial_lat, float initial_lng, float initial_alt,
long int initial_timestamp, float rmswinderror);
#define TIMESTEP 1 // in seconds
#define LOG_DECIMATE 50 // write entry to output files every x timesteps
#define METRES_TO_DEGREES 0.00000899289281755 // one metre corresponds to this many degrees latitude
#define DEGREES_TO_METRES 111198.92345 // one degree latitude corresponds to this many metres
#define DEGREES_TO_RADIANS 0.0174532925 // 1 degree is this many radians
// get the wind values in the u and v directions at a point in space and time from the dataset data
// we interpolate lat, lng, alt and time. The GRIB data only contains pressure levels so we first
// determine which pressure levels straddle to our desired altitude and then interpolate between them
int get_wind(wind_file_cache_t* cache, float lat, float lng, float alt, long int timestamp, float* wind_v, float* wind_u, float *wind_var);
// note: get_wind will likely call load_data and load a different tile into data, so just be careful that data could be pointing
// somewhere else after running get_wind
#endif // __RUN_MODEL_H__

Wyświetl plik

@ -0,0 +1,128 @@
/* getdelim.c --- Implementation of replacement getdelim function.
Copyright (C) 1994, 1996, 1997, 1998, 2001, 2003, 2005 Free
Software Foundation, Inc.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2, or (at
your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA. */
/* Ported from glibc by Simon Josefsson. */
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include "getdelim.h"
#include <limits.h>
#include <stdlib.h>
#include <errno.h>
#ifndef SIZE_MAX
# define SIZE_MAX ((size_t) -1)
#endif
#ifndef SSIZE_MAX
# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
#endif
#if !HAVE_FLOCKFILE
# undef flockfile
# define flockfile(x) ((void) 0)
#endif
#if !HAVE_FUNLOCKFILE
# undef funlockfile
# define funlockfile(x) ((void) 0)
#endif
/* Read up to (and including) a DELIMITER from FP into *LINEPTR (and
NUL-terminate it). *LINEPTR is a pointer returned from malloc (or
NULL), pointing to *N characters of space. It is realloc'ed as
necessary. Returns the number of characters read (not including
the null terminator), or -1 on error or EOF. */
ssize_t
getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp)
{
ssize_t result;
size_t cur_len = 0;
if (lineptr == NULL || n == NULL || fp == NULL)
{
errno = EINVAL;
return -1;
}
flockfile (fp);
if (*lineptr == NULL || *n == 0)
{
*n = 120;
*lineptr = (char *) malloc (*n);
if (*lineptr == NULL)
{
result = -1;
goto unlock_return;
}
}
for (;;)
{
int i;
i = getc (fp);
if (i == EOF)
{
result = -1;
break;
}
/* Make enough space for len+1 (for final NUL) bytes. */
if (cur_len + 1 >= *n)
{
size_t needed_max =
SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX;
size_t needed = 2 * *n + 1; /* Be generous. */
char *new_lineptr;
if (needed_max < needed)
needed = needed_max;
if (cur_len + 1 >= needed)
{
result = -1;
goto unlock_return;
}
new_lineptr = (char *) realloc (*lineptr, needed);
if (new_lineptr == NULL)
{
result = -1;
goto unlock_return;
}
*lineptr = new_lineptr;
*n = needed;
}
(*lineptr)[cur_len] = i;
cur_len++;
if (i == delimiter)
break;
}
(*lineptr)[cur_len] = '\0';
result = cur_len ? cur_len : result;
unlock_return:
funlockfile (fp);
return result;
}

Wyświetl plik

@ -0,0 +1,28 @@
/* getdelim.h --- Prototype for replacement getdelim function.
Copyright (C) 2005 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2, or (at
your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA. */
/* Written by Simon Josefsson. */
/* Get size_t, FILE, ssize_t. And getdelim, if available. */
# include <stddef.h>
# include <stdio.h>
# include <sys/types.h>
#if !HAVE_DECL_GETDELIM
ssize_t getdelim (char **lineptr, size_t *n, int delimiter, FILE *stream);
#endif /* !HAVE_GETDELIM */

Wyświetl plik

@ -0,0 +1,32 @@
/* getline.c --- Implementation of replacement getline function.
Copyright (C) 2005 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2, or (at
your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA. */
/* Written by Simon Josefsson. */
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include "getdelim.h"
#include "getline.h"
ssize_t
getline (char **lineptr, size_t *n, FILE *stream)
{
return getdelim (lineptr, n, '\n', stream);
}

Wyświetl plik

@ -0,0 +1,28 @@
/* getline.h --- Prototype for replacement getline function.
Copyright (C) 2005 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2, or (at
your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA. */
/* Written by Simon Josefsson. */
/* Get size_t, FILE, ssize_t. And getline, if available. */
# include <stddef.h>
# include <stdio.h>
# include <sys/types.h>
#if !HAVE_DECL_GETLINE
ssize_t getline (char **lineptr, size_t *n, FILE *stream);
#endif /* !HAVE_GETLINE */

Wyświetl plik

@ -0,0 +1,268 @@
/* gopt.c version 8.1: tom.viza@gmail.com PUBLIC DOMAIN 2003-8 */
/*
I, Tom Vajzovic, am the author of this software and its documentation and
permanently abandon all copyright and other intellectual property rights in
them, including the right to be identified as the author.
I am fairly certain that this software does what the documentation says it
does, but I cannot guarantee that it does, or that it does what you think it
should, and I cannot guarantee that it will not have undesirable side effects.
You are free to use, modify and distribute this software as you please, but
you do so at your own risk. If you remove or hide this warning then you are
responsible for any problems encountered by people that you make the software
available to.
Before modifying or distributing this software I ask that you would please
read http://www.purposeful.co.uk/tfl/
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "gopt.h"
#ifdef USE_SYSEXITS
#include <sysexits.h>
#else
#define EX_OSERR EXIT_FAILURE
#define EX_USAGE EXIT_FAILURE
#endif
struct opt_spec_s {
int key;
int flags;
const char *shorts;
const char* const *longs;
};
typedef struct opt_spec_s opt_spec_t;
struct opt_s {
int key;
const char *arg;
};
typedef struct opt_s opt_t;
void *gopt_sort( int *argc, const char **argv, const void *opt_specs ){
void *opts;
{{{
const char* const *arg_p= argv + 1;
size_t opt_count= 1;
for( ; *arg_p; ++arg_p ) {
if( '-' == (*arg_p)[0] && (*arg_p)[1] ) {
if( '-' == (*arg_p)[1] ) {
if( (*arg_p)[2] ) {
++opt_count;
} else {
break;
}
} else {
const opt_spec_t *opt_spec_p= opt_specs;
for( ; opt_spec_p-> key; ++opt_spec_p )
if( strchr( opt_spec_p-> shorts, (*arg_p)[1] )){
opt_count+= opt_spec_p-> flags & GOPT_ARG ? 1 : strlen( (*arg_p) + 1 );
break;
}
}
}
}
opts= malloc( opt_count * sizeof(opt_t) );
}}}
{
const char **arg_p= argv + 1;
const char **next_operand= arg_p;
opt_t *next_option= opts;
if( ! opts ){
perror( argv[0] );
exit( EX_OSERR );
}
for( ; *arg_p; ++arg_p )
if( '-' == (*arg_p)[0] && (*arg_p)[1] )
if( '-' == (*arg_p)[1] )
if( (*arg_p)[2] )
{{{
const opt_spec_t *opt_spec_p= opt_specs;
const char* const *longs= opt_spec_p-> longs;
next_option-> key= 0;
while( *longs ){
const char *option_cp= (*arg_p) + 2;
const char *name_cp= *longs;
while( *option_cp && *option_cp == *name_cp ){
++option_cp;
++name_cp;
}
if( '=' == *option_cp || !*option_cp ){
if( *name_cp ){
if( next_option-> key ){
fprintf( stderr, "%s: --%.*s: abbreviated option is ambiguous\n", argv[0], (int)( option_cp -( (*arg_p) + 2 )), (*arg_p) + 2 );
free( opts );
exit( EX_USAGE );
}
next_option-> key= opt_spec_p-> key;
}
else {
next_option-> key= opt_spec_p-> key;
goto found_long;
}
}
if( !*++longs ){
++opt_spec_p;
if( opt_spec_p-> key )
longs= opt_spec_p-> longs;
}
}
if( ! next_option-> key ){
fprintf( stderr, "%s: --%.*s: unknown option\n", argv[0], (int)strcspn( (*arg_p) + 2, "=" ), (*arg_p) + 2 );
free( opts );
exit( EX_USAGE );
}
for( opt_spec_p= opt_specs; opt_spec_p-> key != next_option-> key; ++opt_spec_p );
found_long:
if( !( opt_spec_p-> flags & GOPT_REPEAT )){
const opt_t *opt_p= opts;
for( ; opt_p != next_option; ++opt_p )
if( opt_p-> key == opt_spec_p-> key ){
fprintf( stderr, "%s: --%.*s: option may not be repeated (in any long or short form)\n", argv[0], (int)strcspn( (*arg_p) + 2, "=" ), (*arg_p) + 2 );
free( opts );
exit( EX_USAGE );
}
}
if( opt_spec_p-> flags & GOPT_ARG ){
next_option-> arg= strchr( (*arg_p) + 2, '=' ) + 1;
if( (char*)0 + 1 == next_option-> arg ){
++arg_p;
if( !*arg_p || ('-' == (*arg_p)[0] && (*arg_p)[1]) ){
fprintf( stderr, "%s: --%s: option requires an option argument\n", argv[0], (*(arg_p-1)) + 2 );
free( opts );
exit( EX_USAGE );
}
next_option-> arg= *arg_p;
}
}
else {
if( strchr( (*arg_p) + 2, '=' )){
fprintf( stderr, "%s: --%.*s: option may not take an option argument\n", argv[0], (int)strcspn( (*arg_p) + 2, "=" ), (*arg_p) + 2 );
free( opts );
exit( EX_USAGE );
}
next_option-> arg= NULL;
}
++next_option;
}}}
else {
for( ++arg_p; *arg_p; ++arg_p )
*next_operand++= *arg_p;
break;
}
else
{{{
const char *short_opt= (*arg_p) + 1;
for( ;*short_opt; ++short_opt ){
const opt_spec_t *opt_spec_p= opt_specs;
for( ; opt_spec_p-> key; ++opt_spec_p )
if( strchr( opt_spec_p-> shorts, *short_opt )){
if( !( opt_spec_p-> flags & GOPT_REPEAT )){
const opt_t *opt_p= opts;
for( ; opt_p != next_option; ++opt_p )
if( opt_p-> key == opt_spec_p-> key ){
fprintf( stderr, "%s: -%c: option may not be repeated (in any long or short form)\n", argv[0], *short_opt );
free( opts );
exit( EX_USAGE );
}
}
next_option-> key= opt_spec_p-> key;
if( opt_spec_p-> flags & GOPT_ARG ){
if( short_opt[1] )
next_option-> arg= short_opt + 1;
else {
++arg_p;
if( !*arg_p || ('-' == (*arg_p)[0] && (*arg_p)[1]) ){
fprintf( stderr, "%s: -%c: option requires an option argument\n", argv[0], *short_opt );
free( opts );
exit( EX_USAGE );
}
next_option-> arg= *arg_p;
}
++next_option;
goto break_2;
}
next_option-> arg= NULL;
++next_option;
goto continue_2;
}
fprintf( stderr, "%s: -%c: unknown option\n", argv[0], *short_opt );
free( opts );
exit( EX_USAGE );
continue_2: ;
}
break_2: ;
}}}
else
*next_operand++= *arg_p;
next_option-> key= 0;
*next_operand= NULL;
*argc= next_operand - argv;
}
return opts;
}
size_t gopt( const void *vptr_opts, int key ){
const opt_t *opts= vptr_opts;
size_t count= 0;
for( ; opts-> key; ++opts )
count+= opts-> key == key;
return count;
}
size_t gopt_arg( const void *vptr_opts, int key, const char **arg ){
const opt_t *opts= vptr_opts;
size_t count= 0;
for( ; opts-> key; ++opts )
if( opts-> key == key ){
if( ! count )
*arg= opts-> arg;
++count;
}
return count;
}
const char *gopt_arg_i( const void *vptr_opts, int key, size_t i ){
const opt_t *opts= vptr_opts;
for( ; opts-> key; ++opts )
if( opts-> key == key ){
if( ! i )
return opts-> arg;
--i;
}
return NULL;
}
size_t gopt_args( const void *vptr_opts, int key, const char **args, size_t args_len ){
const char **args_stop= args + args_len;
const char **args_ptr= args;
const opt_t *opts= vptr_opts;
for( ; opts-> key; ++opts )
if( opts-> key == key ){
if( args_stop == args_ptr )
return args_len + gopt( opts, key );
*args_ptr++= opts-> arg;
}
if( args_stop != args_ptr )
*args_ptr= NULL;
return args_ptr - args;
}
void gopt_free( void *vptr_opts ){
free( vptr_opts );
}

Wyświetl plik

@ -0,0 +1,60 @@
/* gopt.h version 8.1: tom.viza@gmail.com PUBLIC DOMAIN 2003-8 */
/*
I, Tom Vajzovic, am the author of this software and its documentation and
permanently abandon all copyright and other intellectual property rights in
them, including the right to be identified as the author.
I am fairly certain that this software does what the documentation says it
does, but I cannot guarantee that it does, or that it does what you think it
should, and I cannot guarantee that it will not have undesirable side effects.
You are free to use, modify and distribute this software as you please, but
you do so at your own risk. If you remove or hide this warning then you are
responsible for any problems encountered by people that you make the software
available to.
Before modifying or distributing this software I ask that you would please
read http://www.purposeful.co.uk/tfl/
*/
#ifndef GOPT_H_INCLUDED
#define GOPT_H_INCLUDED
#define GOPT_ONCE 0
#define GOPT_REPEAT 1
#define GOPT_NOARG 0
#define GOPT_ARG 2
#define gopt_start(...) (const void*)( const struct { int k; int f; const char *s; const char*const*l; }[]){ __VA_ARGS__, {0}}
#define gopt_option(k,f,s,l) { k, f, s, l }
#define gopt_shorts( ... ) (const char*)(const char[]){ __VA_ARGS__, 0 }
#define gopt_longs( ... ) (const char**)(const char*[]){ __VA_ARGS__, NULL }
void *gopt_sort( int *argc, const char **argv, const void *opt_specs );
/* returns a pointer for use in the following calls
* prints to stderr and call exit() on error
*/
size_t gopt( const void *opts, int key );
/* returns the number of times the option was specified
* which will be 0 or 1 unless GOPT_REPEAT was used
*/
size_t gopt_arg( const void *opts, int key, const char **arg );
/* returns the number of times the option was specified
* writes a pointer to the option argument from the first (or only) occurance to *arg
*/
const char *gopt_arg_i( const void *opts, int key, size_t i );
/* returns a pointer to the ith (starting at zero) occurance
* of the option, or NULL if it was not specified that many times
*/
size_t gopt_args( const void *opts, int key, const char **args, size_t args_len );
/* returns the number of times the option was specified
* writes pointers to the option arguments in the order of occurance to args[].
* writes at most args_len pointers
* if the return value is less than args_len, also writes a null pointer
*/
void gopt_free( void *opts );
/* releases memory allocated in the corresponding call to gopt_sort()
* opts can no longer be used
*/
#endif /* GOPT_H_INCLUDED */

Wyświetl plik

@ -0,0 +1,52 @@
// --------------------------------------------------------------
// CU Spaceflight Landing Prediction
// Copyright (c) CU Spaceflight 2009, All Right Reserved
//
// Written by Rich Wareham <rjw57@cam.ac.uk>
//
// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
// --------------------------------------------------------------
#include "random.h"
#include <glib.h>
#include <math.h>
// Sample from a normal distribution with zero mean and unit variance.
// See http://en.wikipedia.org/wiki/Normal_distribution
// #Generating_values_for_normal_random_variables
static float _random_sample_normal_intl(float* loglik)
{
double u, v = 0.0;
static const double k = 0.918938533204673; // = 0.5 * (log(2) + log(pi)), see below.
u = g_random_double();
v = g_random_double();
v = sqrt(-2.0 * log(u)) * cos(2.0 * G_PI * v);
// actual likelihood is 1/sqrt(2*pi) exp(-(x^2)) since mu = 0 and sigma^2 = 1.
// log-likelihood is therefore:
// \ell(x) = - (x^2) - 0.5 * (log(2) + log(pi)) = - (x^2) - k
if(loglik)
*loglik = (float) ( - (v*v) - k );
return v;
}
float random_sample_normal(float mu, float sigma2, float *loglik)
{
// Sample from our base case.
float v = _random_sample_normal_intl(loglik);
// Transform into appropriate range.
v *= sqrt(sigma2);
v += mu;
return v;
}
// vim:sw=4:ts=4:et:cindent

Wyświetl plik

@ -0,0 +1,23 @@
// --------------------------------------------------------------
// CU Spaceflight Landing Prediction
// Copyright (c) CU Spaceflight 2009, All Right Reserved
//
// Written by Rich Wareham <rjw57@cam.ac.uk>
//
// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
// --------------------------------------------------------------
#ifndef __RANDOM_H__
#define __RANDOM_H__
// Return a random sample drawn from the normal distribution with mean mu and
// variance sigma2. If loglik is non-NULL, *loglik is set to the log-likelihood
// of drawing that sample.
float random_sample_normal(float mu, float sigma2, float *loglik);
#endif /* __RANDOM_H__ */
// vim:sw=4:ts=4:et:cindent

Wyświetl plik

@ -0,0 +1,786 @@
// --------------------------------------------------------------
// CU Spaceflight Landing Prediction
// Copyright (c) CU Spaceflight 2009, All Right Reserved
//
// Written by Rich Wareham <rjw57@cam.ac.uk>
//
// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
// --------------------------------------------------------------
#include "wind_file.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <math.h>
#include "../util/getline.h"
extern int verbosity;
typedef struct wind_file_axis_s wind_file_axis_t;
struct wind_file_axis_s
{
unsigned int n_values;
// in actual fact, enough space is allocated for all values.
float values[1];
};
struct wind_file_s
{
// This is from the file header.
float lat, latrad;
float lon, lonrad;
unsigned long timestamp;
// This describes the axes.
unsigned int n_axes;
wind_file_axis_t **axes;
unsigned int n_components;
// A pointer to the actual data.
float *data;
};
// These exciting functions are all to do with the fact that 'left' and 'right'
// is an interesting thing to talk about on a sphere.
// Canonicalise a longitude into the range (0, 360].
static float
_canonicalise_longitude(float lon)
{
lon = fmodf(lon, 360.f);
if(lon < 0.f)
lon += 360.f;
assert((lon >= 0.f) && (lon < 360.f));
return lon;
}
// Return the 'distance' between two canonical longitudes. This will never
// exceed 180 degrees.
static float
_longitude_distance(float lon_a, float lon_b)
{
float d1 = fabsf(lon_a - lon_b);
float d2 = 360.f - d1;
return (d1 < d2) ? d1 : d2;
}
// Given two canonical longitudes, return non-zero iff lon_a is 'left' of lon_b
// or the same. 'Left' means that the number of degrees east one needs to go
// from lon_a to get to lon_b is < 180.
static int
_longitude_is_left_of(float lon_a, float lon_b)
{
float deg_east;
lon_a = _canonicalise_longitude(lon_a);
lon_b = _canonicalise_longitude(lon_b);
deg_east = lon_b - lon_a;
if(deg_east < 0.f)
deg_east += 360.f;
if(deg_east >= 360.f)
deg_east -= 360.f;
assert((deg_east >= 0.f) && (deg_east < 360.f));
return deg_east < 180.f;
}
// Given two values return non-zero iff a is 'left' of b, i.e. a <= b.
static int
_float_is_left_of(float a, float b)
{
return a <= b;
}
// Given an axis, find the indicies of those values left and right of 'value'.
// Return non-zero if 'value' is outside of the axis range. Left is defined as
// 'rightmost value A where left_fun(A,value) returns non-zero' and 'right' is
// defined as 'leftmost value where left_fun(value,A) returns non-zero'.
static int
_wind_file_axis_find_value(wind_file_axis_t* axis, float value,
int (*left_fun) (float a, float b),
unsigned int* left, unsigned int* right)
{
// NOTE: This function can't assume the axis is ordered since
// at least longitude doesn't work that way. Similarly pressure is
// ordered greatest to smallest and latitude is ordered smallest to
// greatest.
unsigned int i;
float lval, rval;
*left = *right = axis->n_values;
lval = rval = 0.f;
// Look over all axis values.
for(i=0; i<axis->n_values; ++i)
{
float axval = axis->values[i];
if((!left_fun(axval,lval) || (*left==axis->n_values)) && left_fun(axval, value))
{
*left = i;
lval = axval;
}
if((!left_fun(rval,axval) || (*right==axis->n_values)) && left_fun(value, axval))
{
*right = i;
rval = axval;
}
}
return (*left != axis->n_values) && (*right != axis->n_values);
}
// Scan forward in 'file' looking for the first line which is a non-comment
// line. Update *line with a pointer to the line which should be free-ed after
// use and update *n with the number of characters in that line.
static
int _get_non_comment_line(char** line, size_t *n, FILE* file)
{
*line = NULL;
while((getline(line, n, file) >= 0) && ((*line)[0] == '#'))
{
// line does not need to be free-ed since getline will realloc
// it if it is too small. See getline(3).
}
if(feof(file)) {
return -1;
}
return *n;
}
// Parse a line of the form value1,value2,...,valueN and add the values to the
// values array of axis. This array should have already been allocated and the
// function ignores any values beyond the number indicated in n_values.
//
// Returns non-zero on success.
static int
_parse_values_line(const char* line, unsigned int n_values, float* values)
{
unsigned int record_idx = 0;
const char* record = line;
float value;
while(1 == sscanf(record, "%f", &value)) {
if(record_idx >= n_values)
{
if(verbosity > 0)
fprintf(stderr, "WARN: Read too many values for axis "
"(%i, expected %i). "
"Ignoring them.\n",
record_idx, n_values);
} else {
values[record_idx] = value;
}
// skip to end of record
while((*record != ',') && (*record != '\n') && (*record != '\0'))
record++;
// and advance past delimiter
if(record != '\0')
record++;
// update the record index
record_idx ++;
}
// we define success as reading the number of values we expected.
return record_idx == n_values;
}
wind_file_t*
wind_file_new(const char* filepath)
{
FILE* file;
char* line = NULL;
size_t line_len;
int num_lines, num_axes, num_components, i;
wind_file_t* self;
if(verbosity > 0)
fprintf(stderr, "INFO: Loading wind data from '%s'.\n", filepath);
file = fopen(filepath, "r");
if(!file) {
perror("ERROR: Could not open file.");
return NULL;
}
// get the header
if(0 > _get_non_comment_line(&line, &line_len, file))
{
fprintf(stderr, "ERROR: EOF before header.\n");
fclose(file);
return NULL;
}
self = (wind_file_t*)malloc(sizeof(wind_file_t));
self->n_axes = 0;
self->axes = NULL;
self->data = NULL;
if(5 != sscanf(line, "%f,%f,%f,%f,%ld",
&self->lat, &self->latrad,
&self->lon, &self->lonrad,
&self->timestamp))
{
fprintf(stderr, "ERROR: Error parsing header '%s'.\n", line);
free(line);
fclose(file);
wind_file_free(self);
return NULL;
}
free(line);
// get the axis count
if(0 > _get_non_comment_line(&line, &line_len, file))
{
fprintf(stderr, "ERROR: EOF before axis count.\n");
fclose(file);
wind_file_free(self);
return NULL;
}
num_axes = atoi(line);
free(line);
self->n_axes = num_axes;
// use calloc(3) so that we initialise everything to NULL.
self->axes = (wind_file_axis_t**)calloc(num_axes, sizeof(wind_file_axis_t*));
// process each axis
for(i=0; i<num_axes; ++i)
{
int num_values;
// get the value count for this axis
if(0 > _get_non_comment_line(&line, &line_len, file))
{
fprintf(stderr, "ERROR: EOF before axis value count.\n");
fclose(file);
wind_file_free(self);
return NULL;
}
num_values = atoi(line);
free(line);
if(num_values < 1)
{
fprintf(stderr, "ERROR: axis %i count is < 1.\n", i);
fclose(file);
wind_file_free(self);
return NULL;
}
self->axes[i] = (wind_file_axis_t*)
malloc(sizeof(wind_file_axis_t) + sizeof(float)*(num_values-1));
self->axes[i]->n_values = num_values;
// get the axis line
if(0 > _get_non_comment_line(&line, &line_len, file))
{
fprintf(stderr, "ERROR: EOF before axis value line.\n");
fclose(file);
wind_file_free(self);
return NULL;
}
if(!_parse_values_line(line, self->axes[i]->n_values, self->axes[i]->values))
{
fprintf(stderr, "ERROR: Error parsing axis value line.\n");
fclose(file);
free(line);
wind_file_free(self);
return NULL;
}
free(line);
}
// get the line count
if(0 > _get_non_comment_line(&line, &line_len, file))
{
fprintf(stderr, "ERROR: EOF before line count.\n");
fclose(file);
free(line);
wind_file_free(self);
return NULL;
}
num_lines = atoi(line);
free(line);
// get the datum component count
if(0 > _get_non_comment_line(&line, &line_len, file))
{
fprintf(stderr, "ERROR: EOF before datum component count.\n");
fclose(file);
free(line);
wind_file_free(self);
return NULL;
}
num_components = atoi(line);
free(line);
self->n_components = num_components;
// check number of lines matches what we expect
{
int expected_line_count = 1;
for(i=0; i<self->n_axes; ++i)
{
expected_line_count *= self->axes[i]->n_values;
}
if(expected_line_count != num_lines)
{
fprintf(stderr, "ERROR: Data axes imply %i records. "
"The file header claims %i.\n",
expected_line_count,
num_lines);
fclose(file);
wind_file_free(self);
return NULL;
}
}
if(verbosity > 0)
fprintf(stderr, "INFO: Data is %i axis made up of "
"(%i records) x (%i components).\n",
num_axes, num_lines, num_components);
// we have everything we need to actually read the data now. Allocate an
// array to store it.
self->data = (float*)malloc(sizeof(float) * num_lines * num_components);
// and iterate reading data. FIXME: Extra data is currently ignored silently.
// we should probably check there are no non-comment lines after the data.
for(i=0; i<num_lines; ++i)
{
if((0 > _get_non_comment_line(&line, &line_len, file)) ||
(!_parse_values_line(line, num_components, &(self->data[num_components*i]))))
{
fprintf(stderr, "ERROR: Could not parse data line %i of file. "
"The file may be corrupt or truncated.\n",
i);
free(line);
fclose(file);
wind_file_free(self);
return NULL;
}
// if we succeed, we need to free the line.
free(line);
}
// close the file since we're done with it now.
fclose(file);
if(self->n_axes != 3)
{
fprintf(stderr, "ERROR: Expected 3 axes in file.\n");
wind_file_free(self);
return NULL;
}
if(self->n_components != 3)
{
fprintf(stderr, "ERROR: Expected 3 component data in file.\n");
wind_file_free(self);
return NULL;
}
return self;
}
void
wind_file_free(wind_file_t* file)
{
if(!file)
return;
if(file->n_axes > 0)
{
unsigned int i;
for(i=0; i<file->n_axes; ++i)
{
if(file->axes[i])
{
free(file->axes[i]);
}
}
free(file->axes);
}
if(file->data)
{
free(file->data);
}
free(file);
}
static float*
_wind_file_get_record(wind_file_t* file,
unsigned int lat_idx, unsigned int lon_idx,
unsigned int pressure_idx)
{
size_t offset = file->n_components *
(lon_idx +
file->axes[2]->n_values *
(lat_idx + file->axes[1]->n_values * pressure_idx));
return &(file->data[offset]);
}
static float
_wind_file_get_height(wind_file_t* file,
unsigned int lat_idx, unsigned int lon_idx,
unsigned int pressure_idx)
{
return _wind_file_get_record(file, lat_idx, lon_idx, pressure_idx)[0];
}
static void
_wind_file_get_wind_raw(wind_file_t* file,
unsigned int lat_idx, unsigned int lon_idx,
unsigned int pressure_idx,
float *u, float* v)
{
float* record = _wind_file_get_record(file, lat_idx, lon_idx, pressure_idx);
*u = record[1]; *v = record[2];
}
static float
_lerp(float a, float b, float lambda)
{
return a * (1.f - lambda) + b * lambda;
}
static float
_bilinear_interpolate(float ll, float lr, float rl, float rr, float lambda1, float lambda2)
{
float il = _lerp(ll, rl, lambda1);
float ir = _lerp(lr, rr, lambda1);
return _lerp(il,ir,lambda2);
}
void
wind_file_get_wind(wind_file_t* file, float lat, float lon, float height,
float* windu, float *windv, float *uvar, float *vvar)
{
// we use static variables to 'cache' the last left and right lat/longs
// and heights so that we can avoid searching the axes if necessary
static int have_valid_latlon_cache = 0;
static int have_valid_pressure_cache = 0;
static unsigned int left_lat_idx, right_lat_idx;
static unsigned int left_lon_idx, right_lon_idx;
static unsigned int left_pr_idx, right_pr_idx;
static float left_lat, right_lat;
static float left_lon, right_lon;
int i;
float left_height, right_height;
float lat_lambda, lon_lambda, pr_lambda;
assert(file);
assert(windu && windv);
// canonicalise the longitude
lon = _canonicalise_longitude(lon);
// by default, return nothing in case of error.
*windu = *windv = 0.f;
// see if the cache is indeed valid
if(have_valid_latlon_cache)
{
if((left_lat > lat) ||
(right_lat < lat) ||
!_longitude_is_left_of(left_lon, lon) ||
!_longitude_is_left_of(lon, right_lon))
{
have_valid_latlon_cache = 0;
}
}
// if we have no cached grid locations, look for them.
if(!have_valid_latlon_cache)
{
// look for latitude along second axis
if(!_wind_file_axis_find_value(file->axes[1], lat,
_float_is_left_of, &left_lat_idx, &right_lat_idx))
{
if(verbosity > 0)
fprintf(stderr, "WARN: Latitude %f is not covered by file.\n", lat);
return;
}
left_lat = file->axes[1]->values[left_lat_idx];
right_lat = file->axes[1]->values[right_lat_idx];
// look for longitude along third axis
if(!_wind_file_axis_find_value(file->axes[2], lon,
_longitude_is_left_of, &left_lon_idx, &right_lon_idx))
{
if(verbosity > 0)
fprintf(stderr, "WARN: Longitude %f is not covered by file.\n", lon);
return;
}
left_lon = file->axes[2]->values[left_lon_idx];
right_lon = file->axes[2]->values[right_lon_idx];
if(verbosity > 1)
fprintf(stderr, "INFO: Moved to latitude/longitude "
"cell (%f,%f)-(%f,%f)\n",
left_lat, left_lon, right_lat, right_lon);
have_valid_latlon_cache = 1;
}
// compute the normalised lat/lon co-ordinate within the cell we're in.
if(left_lat_idx != right_lat_idx)
lat_lambda = (lat - left_lat) / (right_lat - left_lat);
else
lat_lambda = 0.5f;
if(left_lon_idx != right_lon_idx)
lon_lambda = _longitude_distance(lon, left_lon)
/ _longitude_distance(right_lon, left_lon);
else
lon_lambda = 0.5f;
// munge the lambdas into the right range. Numerical approximations can nudge them
// ~1e-08 either side sometimes.
lat_lambda = (lat_lambda < 0.f) ? 0.f : lat_lambda;
lat_lambda = (lat_lambda > 1.f) ? 1.f : lat_lambda;
lon_lambda = (lon_lambda < 0.f) ? 0.f : lon_lambda;
lon_lambda = (lon_lambda > 1.f) ? 1.f : lon_lambda;
// use this normalised co-ordinate to check the left and right heights
if(have_valid_pressure_cache)
{
float ll_height, lr_height, rl_height, rr_height;
// left
ll_height = _wind_file_get_height(file, left_lat_idx, left_lon_idx, left_pr_idx);
lr_height = _wind_file_get_height(file, left_lat_idx, right_lon_idx, left_pr_idx);
rl_height = _wind_file_get_height(file, right_lat_idx, left_lon_idx, left_pr_idx);
rr_height = _wind_file_get_height(file, right_lat_idx, right_lon_idx, left_pr_idx);
left_height = _bilinear_interpolate(ll_height, lr_height, rl_height, rr_height,
lat_lambda, lon_lambda);
// if the leftmost height is too small and we can go lower...
if((left_height > height) && (left_pr_idx > 0))
have_valid_pressure_cache = 0;
// right
ll_height = _wind_file_get_height(file, left_lat_idx, left_lon_idx, right_pr_idx);
lr_height = _wind_file_get_height(file, left_lat_idx, right_lon_idx, right_pr_idx);
rl_height = _wind_file_get_height(file, right_lat_idx, left_lon_idx, right_pr_idx);
rr_height = _wind_file_get_height(file, right_lat_idx, right_lon_idx, right_pr_idx);
right_height = _bilinear_interpolate(ll_height, lr_height, rl_height, rr_height,
lat_lambda, lon_lambda);
// if the rightmost height is too small and we can go higher...
if((right_height < height) && (right_pr_idx < file->axes[0]->n_values-1))
have_valid_pressure_cache = 0;
}
// if our height cache is out of whack, find a better cell.
if(!have_valid_pressure_cache)
{
// search along all heights to find what pressure level we're at
left_pr_idx = right_pr_idx = file->axes[0]->n_values;
left_height = right_height = -1.f;
for(i=0; i<file->axes[0]->n_values; ++i)
{
// get heights for each corner of our lat/lon cell.
float ll_height = _wind_file_get_height(file,
left_lat_idx, left_lon_idx, i);
float lr_height = _wind_file_get_height(file,
left_lat_idx, right_lon_idx, i);
float rl_height = _wind_file_get_height(file,
right_lat_idx, left_lon_idx, i);
float rr_height = _wind_file_get_height(file,
right_lat_idx, right_lon_idx, i);
// interpolate within our cell.
float interp_height = _bilinear_interpolate(
ll_height, lr_height, rl_height, rr_height,
lat_lambda, lon_lambda);
if((interp_height <= height) &&
((interp_height >= left_height) ||
(left_pr_idx == file->axes[0]->n_values)))
{
left_pr_idx = i;
left_height = interp_height;
}
if((interp_height >= height) &&
((interp_height <= right_height) ||
(right_pr_idx == file->axes[0]->n_values)))
{
right_pr_idx = i;
right_height = interp_height;
}
}
if(left_pr_idx == file->axes[0]->n_values)
{
left_pr_idx = right_pr_idx;
if(verbosity > 0)
fprintf(stderr, "WARN: Moved to %.2fm, below height where we "
"have data. "
"Assuming we're at %.fmb or approx. %.2fm.\n",
height,
file->axes[0]->values[left_pr_idx],
_wind_file_get_height(file,
left_lat_idx, left_lon_idx, left_pr_idx));
}
if(right_pr_idx == file->axes[0]->n_values)
{
right_pr_idx = left_pr_idx;
if(verbosity > 0)
fprintf(stderr, "WARN: Moved to %.2fm, above height where we "
"have data. "
"Assuming we're at %.fmb or approx. %.2fm.\n",
height,
file->axes[0]->values[right_pr_idx],
_wind_file_get_height(file,
left_lat_idx, left_lon_idx, right_pr_idx));
}
if((left_pr_idx == file->axes[0]->n_values) ||
(right_pr_idx == file->axes[0]->n_values))
{
fprintf(stderr, "ERROR: Moved to a totally stupid height (%f). "
"Giving up!\n", height);
return;
}
if(verbosity > 1)
fprintf(stderr, "INFO: Moved to pressure cell (%.fmb, %.fmb)\n",
file->axes[0]->values[left_pr_idx],
file->axes[0]->values[right_pr_idx]);
have_valid_pressure_cache = 1;
}
// compute the normalised pressure co-ordinate within the cell we're in.
if(left_pr_idx != right_pr_idx)
pr_lambda = (height - left_height) / (right_height - left_height);
else
pr_lambda = 0.5f;
// pr_lambda might be outside of the range [0,1] depending on if we went
// above or below our data, munge it appropriately.
pr_lambda = (pr_lambda < 0.f) ? 0.f : pr_lambda;
pr_lambda = (pr_lambda > 1.f) ? 1.f : pr_lambda;
assert(lat_lambda >= 0.f);
assert(lon_lambda >= 0.f);
assert(pr_lambda >= 0.f);
assert(lat_lambda <= 1.f);
assert(lon_lambda <= 1.f);
assert(pr_lambda <= 1.f);
// By this point we have left/right co-ordinates which describe the
// latitude, longitude and pressure boundaries of our data cell along
// with normalised co-ordinates within it. We can now actually find
// some data...
//
// We compute the lerped u and v along with the neighbourhood mean and
// square mean to calculate the neighbourhood variance.
{
float llu, lru, rlu, rru;
float llv, lrv, rlv, rrv;
float lowu, lowv, highu, highv;
float umean = 0.f;
float usqmean = 0.f;
float vmean = 0.f;
float vsqmean = 0.f;
// let's get the wind u and v for the lower lat/lon cell
_wind_file_get_wind_raw(file,
left_lat_idx, left_lon_idx, left_pr_idx, &llu, &llv);
_wind_file_get_wind_raw(file,
left_lat_idx, right_lon_idx, left_pr_idx, &lru, &lrv);
_wind_file_get_wind_raw(file,
right_lat_idx, left_lon_idx, left_pr_idx, &rlu, &rlv);
_wind_file_get_wind_raw(file,
right_lat_idx, right_lon_idx, left_pr_idx, &rru, &rrv);
lowu = _bilinear_interpolate(llu, lru, rlu, rru, lat_lambda, lon_lambda);
lowv = _bilinear_interpolate(llv, lrv, rlv, rrv, lat_lambda, lon_lambda);
umean = llu + lru + rlu + rru;
vmean = llv + lrv + rlv + rrv;
usqmean = llu*llu + lru*lru + rlu*rlu + rru*rru;
vsqmean = llv*llv + lrv*lrv + rlv*rlv + rrv*rrv;
/*
lowusq = _bilinear_interpolate(llu*llu, lru*lru, rlu*rlu, rru*rru,
lat_lambda, lon_lambda);
lowvsq = _bilinear_interpolate(llv*llv, lrv*lrv, rlv*rlv, rrv*rrv,
lat_lambda, lon_lambda);
*/
// let's get the wind u and v for the upper lat/lon cell
_wind_file_get_wind_raw(file,
left_lat_idx, left_lon_idx, right_pr_idx, &llu, &llv);
_wind_file_get_wind_raw(file,
left_lat_idx, right_lon_idx, right_pr_idx, &lru, &lrv);
_wind_file_get_wind_raw(file,
right_lat_idx, left_lon_idx, right_pr_idx, &rlu, &rlv);
_wind_file_get_wind_raw(file,
right_lat_idx, right_lon_idx, right_pr_idx, &rru, &rrv);
highu = _bilinear_interpolate(llu, lru, rlu, rru, lat_lambda, lon_lambda);
highv = _bilinear_interpolate(llv, lrv, rlv, rrv, lat_lambda, lon_lambda);
umean += llu + lru + rlu + rru;
vmean += llv + lrv + rlv + rrv;
usqmean += llu*llu + lru*lru + rlu*rlu + rru*rru;
vsqmean += llv*llv + lrv*lrv + rlv*rlv + rrv*rrv;
/*
highusq = _bilinear_interpolate(llu*llu, lru*lru, rlu*rlu, rru*rru,
lat_lambda, lon_lambda);
highvsq = _bilinear_interpolate(llv*llv, lrv*lrv, rlv*rlv, rrv*rrv,
lat_lambda, lon_lambda);
*/
*windu = _lerp(lowu, highu, pr_lambda);
*windv = _lerp(lowv, highv, pr_lambda);
// We will calculate the variance by making use of the fact
// that the lerping is effectively a weighted mean or
// expectation and that
// var = E[X^2] - E[X]^2.
//
// In effect this calculates the instantaneous variance by considering the
// contributions from the cube surrounding the point in question.
// This is highly cunning and, on the face of it, not entirely wrong.
umean *= 0.125f; usqmean *= 0.125f;
vmean *= 0.125f; vsqmean *= 0.125f;
*uvar = usqmean - umean * umean;
*vvar = vsqmean - vmean * vmean;
}
}
// Data for God's own editor.
// vim:sw=8:ts=8:et:cindent

Wyświetl plik

@ -0,0 +1,48 @@
// --------------------------------------------------------------
// CU Spaceflight Landing Prediction
// Copyright (c) CU Spaceflight 2009, All Right Reserved
//
// Written by Rich Wareham <rjw57@cam.ac.uk>
//
// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
// --------------------------------------------------------------
#ifndef __WIND_FILE_H__
#define __WIND_FILE_H__
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
// An opaque type representing the cache itself.
typedef struct wind_file_s wind_file_t;
// An opaque type representing a cache entry.
typedef struct wind_file_entry_s wind_file_entry_t;
// Open 'file' and parse contents. Return NULL on failure.
wind_file_t *wind_file_new (const char *file);
// Free resources associated with 'file'.
void wind_file_free (wind_file_t *file);
void wind_file_get_wind (wind_file_t *file,
float lat,
float lon,
float height,
float *windu,
float *windv,
float *windusq,
float *windvsq);
#ifdef __cplusplus
}
#endif // __cplusplus
#endif // __WIND_FILE_H__
// Data for God's own editor.
// vim:sw=8:ts=8:et:cindent

Wyświetl plik

@ -0,0 +1,357 @@
// --------------------------------------------------------------
// CU Spaceflight Landing Prediction
// Copyright (c) CU Spaceflight 2009, All Right Reserved
//
// Written by Rich Wareham <rjw57@cam.ac.uk>
//
// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
// --------------------------------------------------------------
#include "wind_file_cache.h"
#include "wind_file.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <assert.h>
#include <dirent.h>
#include <errno.h>
#include <string.h>
#include <math.h>
#include "../util/getline.h"
extern int verbosity;
struct wind_file_cache_entry_s
{
char *filepath; // Full path.
unsigned long timestamp; // As POSIX timestamp.
float lat, lon; // Window centre.
float latrad, lonrad; // Window radius.
wind_file_t *loaded_file; // Initially NULL.
};
struct wind_file_cache_s
{
char *directory_name;
unsigned int n_entries;
struct wind_file_cache_entry_s **entries; // Matching directory entries.
};
// Yuk! Needed to make use of scandir. Gotta love APIs designed in the 80s.
static wind_file_cache_t* _scandir_current_cache;
static int
_parse_header(const char* filepath,
float *lat, float *latrad,
float *lon, float *lonrad,
unsigned long* timestamp)
{
FILE* file;
char* line;
size_t line_len;
// Can I open this file?
file = fopen(filepath, "r");
if(!file) {
// No, abort
return 0;
}
// Look for first non-comment line.
line = NULL;
while((getline(&line, &line_len, file) >= 0) && (line[0] == '#'))
{
// line does not need to be free-ed since getline will realloc
// it if it is too small. See getline(3).
}
if(feof(file))
{
// Got to the end without finding non-comment.
free(line);
fclose(file);
return 0;
}
// 'line' is first non-comment. Try to parse it.
if(5 != sscanf(line, "%f,%f,%f,%f,%ld", lat, latrad, lon, lonrad, timestamp))
{
// Failed to parse, it is invalid.
free(line);
fclose(file);
return 0;
}
// File seems valid.
free(line);
fclose(file);
return 1;
}
#ifdef __APPLE__
static int
_file_filter(struct dirent *entry)
#else
static int
_file_filter(const struct dirent *entry)
#endif
{
int filepath_len;
int rv;
wind_file_cache_t* self = _scandir_current_cache;
char* filepath = NULL;
struct stat stat_buf;
float lat, latrad, lon, lonrad;
unsigned long timestamp;
// This is using sprintf in C99 mode to create a buffer with
// the full file path/
filepath_len = 1 + snprintf(NULL, 0, "%s/%s", self->directory_name, entry->d_name);
filepath = (char*)malloc(filepath_len);
snprintf(filepath, filepath_len, "%s/%s", self->directory_name, entry->d_name);
// Stat the file.
rv = stat(filepath, &stat_buf);
if(rv < 0)
{
perror("Error scanning data dir");
free(filepath);
return 0;
}
// Is this a regular file?
if(!S_ISREG(stat_buf.st_mode))
{
free(filepath);
return 0;
}
// Can I parse out the header?
if(!_parse_header(filepath, &lat, &latrad, &lon, &lonrad, &timestamp))
{
free(filepath);
return 0;
}
free(filepath);
return 1;
}
wind_file_cache_t*
wind_file_cache_new(const char *directory)
{
wind_file_cache_t* self;
int rv, i;
struct dirent **dir_entries;
assert(directory);
// Allocate memory for ourself
self = (wind_file_cache_t*) malloc(sizeof(wind_file_cache_t));
self->n_entries = 0;
self->directory_name = strdup(directory);
if(verbosity > 0)
fprintf(stderr, "INFO: Scanning directory '%s'.\n", directory);
// Use scandir scan the directory looking for data files.
_scandir_current_cache = self; // ew!
rv = scandir(directory, &dir_entries, _file_filter, alphasort);
if(rv < 0) {
perror(NULL);
wind_file_cache_free(self);
return NULL;
}
if(verbosity > 0)
fprintf(stderr, "INFO: Found %i data files.\n", rv);
self->n_entries = rv;
self->entries = (struct wind_file_cache_entry_s**)malloc(sizeof(struct wind_file_cache_entry_s*)*self->n_entries);
for(i=0; i<self->n_entries; ++i)
{
struct dirent* entry = dir_entries[i];
int filepath_len, parse_rv;
char* filepath = NULL;
// allocate the entry.
self->entries[i] = (struct wind_file_cache_entry_s*)malloc(sizeof(struct wind_file_cache_entry_s));
// This is using sprintf in C99 mode to create a buffer with
// the full file path/
filepath_len = 1 + snprintf(NULL, 0, "%s/%s", self->directory_name, entry->d_name);
filepath = (char*)malloc(filepath_len);
snprintf(filepath, filepath_len, "%s/%s", self->directory_name, entry->d_name);
// Fill in the file path.
self->entries[i]->filepath = filepath;
// Parse the file header
parse_rv = _parse_header(filepath,
&(self->entries[i]->lat), &(self->entries[i]->latrad),
&(self->entries[i]->lon), &(self->entries[i]->lonrad),
&(self->entries[i]->timestamp));
if(!parse_rv)
{
fprintf(stderr, "WARN: Hmm... some files appear to have "
"changed under me!");
}
if(verbosity > 1) {
fprintf(stderr, "INFO: Found %s.\n", filepath);
fprintf(stderr, "INFO: - Covers window (lat, long) = "
"(%f +/-%f, %f +/-%f).\n",
self->entries[i]->lat, self->entries[i]->latrad,
self->entries[i]->lon, self->entries[i]->lonrad);
}
// initially, no file is loaded.
self->entries[i]->loaded_file = NULL;
// finished with this entry
free(dir_entries[i]);
}
// finished with the dir entries.
free(dir_entries);
return self;
}
void
wind_file_cache_free(wind_file_cache_t *cache)
{
if(!cache)
return;
free(cache->directory_name);
if(cache->n_entries > 0)
{
unsigned int i;
for(i=0; i<cache->n_entries; ++i)
{
free(cache->entries[i]->filepath);
free(cache->entries[i]);
cache->entries[i] = NULL;
}
free(cache->entries);
}
free(cache);
}
static float
_lon_dist(float a, float b)
{
float d1 = fabs(a-b);
float d2 = 360.f - d1;
return (d1 < d2) ? d1 : d2;
}
int
wind_file_cache_entry_contains_point(wind_file_cache_entry_t* entry, float lat, float lon)
{
if(!entry)
return 0;
if(fabs(entry->lat - lat) > entry->latrad)
return 0;
if(_lon_dist(entry->lon, lon) > entry->lonrad)
return 0;
return 1;
}
void
wind_file_cache_find_entry(wind_file_cache_t *cache,
float lat, float lon, unsigned long timestamp,
wind_file_cache_entry_t** earlier,
wind_file_cache_entry_t** later)
{
assert(cache && earlier && later);
*earlier = *later = NULL;
// This is the best we can do if we have no entries.
if(cache->n_entries == 0)
return;
// Search for earlier and later entries which match
unsigned int i;
for(i=0; i<cache->n_entries; ++i)
{
wind_file_cache_entry_t* entry = cache->entries[i];
if(entry->timestamp <= timestamp) {
// This is an earlier entry
if(!(*earlier) || (entry->timestamp > (*earlier)->timestamp))
{
if(wind_file_cache_entry_contains_point(entry,lat,lon))
*earlier = entry;
}
} else {
// This is a later entry
if(!(*later) || (entry->timestamp < (*later)->timestamp)) {
if(wind_file_cache_entry_contains_point(entry,lat,lon))
*later = entry;
}
}
}
if(!*earlier) { *earlier = *later; }
if(!*later) { *later = *earlier; }
// If all else fails, just choose the first entry.
if(!*earlier) { *earlier = *later = cache->entries[0]; }
}
const char*
wind_file_cache_entry_file_path(wind_file_cache_entry_t* entry)
{
if(!entry)
return NULL;
return entry->filepath;
}
unsigned int
wind_file_cache_entry_timestamp(wind_file_cache_entry_t* entry)
{
if(!entry)
return 0;
return entry->timestamp;
}
wind_file_t*
wind_file_cache_entry_file(wind_file_cache_entry_t *entry)
{
const char* filepath;
if(!entry)
return NULL;
if(entry->loaded_file)
return entry->loaded_file;
filepath = wind_file_cache_entry_file_path(entry);
if(!filepath)
return NULL;
entry->loaded_file = wind_file_new(filepath);
return entry->loaded_file;
}
// Data for God's own editor.
// vim:sw=8:ts=8:et:cindent

Wyświetl plik

@ -0,0 +1,79 @@
// --------------------------------------------------------------
// CU Spaceflight Landing Prediction
// Copyright (c) CU Spaceflight 2009, All Right Reserved
//
// Written by Rich Wareham <rjw57@cam.ac.uk>
//
// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
// --------------------------------------------------------------
#ifndef __WIND_FILES_H__
#define __WIND_FILES_H__
#include "wind_file.h"
// A cache which scans the wind data directory for data files, tries to read
// the header and parse out their timestamp and window information. It then
// allows one to query for files closest in time and space for a specified
// latitude/longitude/time.
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
// An opaque type representing the cache itself.
typedef struct wind_file_cache_s wind_file_cache_t;
// An opaque type representing a cache entry.
typedef struct wind_file_cache_entry_s wind_file_cache_entry_t;
// Scan 'directory' for wind files. Return a new cache.
wind_file_cache_t *wind_file_cache_new (const char *directory);
// Free resources associated with 'cache'.
void wind_file_cache_free (wind_file_cache_t *cache);
// Search for a cache entry closest to the specified lat, lon and time.
// *earlier and *later are set to the nearest cache entries which are
// (respectively) earlier and later.
void wind_file_cache_find_entry
(wind_file_cache_t *cache,
float lat,
float lon,
unsigned long timestamp,
wind_file_cache_entry_t **earlier,
wind_file_cache_entry_t **later);
// Return non-zero if the cache entry specifies contains the latitude
// and longitude.
int wind_file_cache_entry_contains_point
(wind_file_cache_entry_t *entry,
float lat,
float lon);
// Return a string which gives the full path to the wind file
// corresponding to 'entry'. This should not be freed since it
// is owned by the cache itself.
const char* wind_file_cache_entry_file_path
(wind_file_cache_entry_t *entry);
// Return the timestamp of the specified cache entry.
unsigned int wind_file_cache_entry_timestamp
(wind_file_cache_entry_t *entry);
// Return the file for of the specified cache entry loading it if
// necessary.
wind_file_t* wind_file_cache_entry_file
(wind_file_cache_entry_t *entry);
#ifdef __cplusplus
}
#endif // __cplusplus
#endif // __WIND_FILES_H__
// Data for God's own editor.
// vim:sw=8:ts=8:et:cindent