diff --git a/config/depcomp b/config/depcomp
index df8eea7e..715e3431 100755
--- a/config/depcomp
+++ b/config/depcomp
@@ -1,10 +1,9 @@
#! /bin/sh
# depcomp - compile a program generating dependencies as side-effects
-scriptversion=2009-04-28.21; # UTC
+scriptversion=2018-03-07.03; # UTC
-# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free
-# Software Foundation, Inc.
+# Copyright (C) 1999-2021 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
@@ -17,7 +16,7 @@ scriptversion=2009-04-28.21; # UTC
# 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, see .
+# along with this program. If not, see .
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
@@ -28,9 +27,9 @@ scriptversion=2009-04-28.21; # UTC
case $1 in
'')
- echo "$0: No command. Try \`$0 --help' for more information." 1>&2
- exit 1;
- ;;
+ echo "$0: No command. Try '$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
-h | --h*)
cat <<\EOF
Usage: depcomp [--help] [--version] PROGRAM [ARGS]
@@ -40,11 +39,11 @@ as side-effects.
Environment variables:
depmode Dependency tracking mode.
- source Source file read by `PROGRAMS ARGS'.
- object Object file output by `PROGRAMS ARGS'.
+ source Source file read by 'PROGRAMS ARGS'.
+ object Object file output by 'PROGRAMS ARGS'.
DEPDIR directory where to store dependencies.
depfile Dependency file to output.
- tmpdepfile Temporary file to use when outputing dependencies.
+ tmpdepfile Temporary file to use when outputting dependencies.
libtool Whether libtool is used (yes/no).
Report bugs to .
@@ -57,6 +56,66 @@ EOF
;;
esac
+# Get the directory component of the given path, and save it in the
+# global variables '$dir'. Note that this directory component will
+# be either empty or ending with a '/' character. This is deliberate.
+set_dir_from ()
+{
+ case $1 in
+ */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
+ *) dir=;;
+ esac
+}
+
+# Get the suffix-stripped basename of the given path, and save it the
+# global variable '$base'.
+set_base_from ()
+{
+ base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
+}
+
+# If no dependency file was actually created by the compiler invocation,
+# we still have to create a dummy depfile, to avoid errors with the
+# Makefile "include basename.Plo" scheme.
+make_dummy_depfile ()
+{
+ echo "#dummy" > "$depfile"
+}
+
+# Factor out some common post-processing of the generated depfile.
+# Requires the auxiliary global variable '$tmpdepfile' to be set.
+aix_post_process_depfile ()
+{
+ # If the compiler actually managed to produce a dependency file,
+ # post-process it.
+ if test -f "$tmpdepfile"; then
+ # Each line is of the form 'foo.o: dependency.h'.
+ # Do two passes, one to just change these to
+ # $object: dependency.h
+ # and one to simply output
+ # dependency.h:
+ # which is needed to avoid the deleted-header problem.
+ { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
+ sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
+ } > "$depfile"
+ rm -f "$tmpdepfile"
+ else
+ make_dummy_depfile
+ fi
+}
+
+# A tabulation character.
+tab=' '
+# A newline character.
+nl='
+'
+# Character ranges might be problematic outside the C locale.
+# These definitions help.
+upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
+lower=abcdefghijklmnopqrstuvwxyz
+digits=0123456789
+alpha=${upper}${lower}
+
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
echo "depcomp: Variables source, object and depmode must be set" 1>&2
exit 1
@@ -69,6 +128,9 @@ tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
rm -f "$tmpdepfile"
+# Avoid interferences from the environment.
+gccflag= dashmflag=
+
# Some modes work just like other modes, but use different flags. We
# parameterize here, but still list the modes in the big case below,
# to make depend.m4 easier to write. Note that we *cannot* use a case
@@ -80,18 +142,32 @@ if test "$depmode" = hp; then
fi
if test "$depmode" = dashXmstdout; then
- # This is just like dashmstdout with a different argument.
- dashmflag=-xM
- depmode=dashmstdout
+ # This is just like dashmstdout with a different argument.
+ dashmflag=-xM
+ depmode=dashmstdout
fi
cygpath_u="cygpath -u -f -"
if test "$depmode" = msvcmsys; then
- # This is just like msvisualcpp but w/o cygpath translation.
- # Just convert the backslash-escaped backslashes to single forward
- # slashes to satisfy depend.m4
- cygpath_u="sed s,\\\\\\\\,/,g"
- depmode=msvisualcpp
+ # This is just like msvisualcpp but w/o cygpath translation.
+ # Just convert the backslash-escaped backslashes to single forward
+ # slashes to satisfy depend.m4
+ cygpath_u='sed s,\\\\,/,g'
+ depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+ # This is just like msvc7 but w/o cygpath translation.
+ # Just convert the backslash-escaped backslashes to single forward
+ # slashes to satisfy depend.m4
+ cygpath_u='sed s,\\\\,/,g'
+ depmode=msvc7
+fi
+
+if test "$depmode" = xlc; then
+ # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
+ gccflag=-qmakedep=gcc,-MF
+ depmode=gcc
fi
case "$depmode" in
@@ -114,8 +190,7 @@ gcc3)
done
"$@"
stat=$?
- if test $stat -eq 0; then :
- else
+ if test $stat -ne 0; then
rm -f "$tmpdepfile"
exit $stat
fi
@@ -123,13 +198,17 @@ gcc3)
;;
gcc)
+## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
+## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
+## (see the conditional assignment to $gccflag above).
## There are various ways to get dependency output from gcc. Here's
## why we pick this rather obscure method:
## - Don't want to use -MD because we'd like the dependencies to end
## up in a subdir. Having to rename by hand is ugly.
## (We might end up doing this anyway to support other compilers.)
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
-## -MM, not -M (despite what the docs say).
+## -MM, not -M (despite what the docs say). Also, it might not be
+## supported by the other compilers which use the 'gcc' depmode.
## - Using -M directly means running the compiler twice (even worse
## than renaming).
if test -z "$gccflag"; then
@@ -137,31 +216,31 @@ gcc)
fi
"$@" -Wp,"$gccflag$tmpdepfile"
stat=$?
- if test $stat -eq 0; then :
- else
+ if test $stat -ne 0; then
rm -f "$tmpdepfile"
exit $stat
fi
rm -f "$depfile"
echo "$object : \\" > "$depfile"
- alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
-## The second -e expression handles DOS-style file names with drive letters.
+ # The second -e expression handles DOS-style file names with drive
+ # letters.
sed -e 's/^[^:]*: / /' \
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
-## This next piece of magic avoids the `deleted header file' problem.
+## This next piece of magic avoids the "deleted header file" problem.
## The problem is that when a header file which appears in a .P file
## is deleted, the dependency causes make to die (because there is
## typically no way to rebuild the header). We avoid this by adding
## dummy dependencies for each header file. Too bad gcc doesn't do
## this for us directly.
- tr ' ' '
-' < "$tmpdepfile" |
-## Some versions of gcc put a space before the `:'. On the theory
+## Some versions of gcc put a space before the ':'. On the theory
## that the space means something, we add a space to the output as
-## well.
+## well. hp depmode also adds that space, but also prefixes the VPATH
+## to the object. Take care to not repeat it in the output.
## Some versions of the HPUX 10.20 sed can't process this invocation
## correctly. Breaking it into two sed invocations is a workaround.
- sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+ | sed -e 's/$/ :/' >> "$depfile"
rm -f "$tmpdepfile"
;;
@@ -179,8 +258,7 @@ sgi)
"$@" -MDupdate "$tmpdepfile"
fi
stat=$?
- if test $stat -eq 0; then :
- else
+ if test $stat -ne 0; then
rm -f "$tmpdepfile"
exit $stat
fi
@@ -188,43 +266,41 @@ sgi)
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
echo "$object : \\" > "$depfile"
-
# Clip off the initial element (the dependent). Don't try to be
# clever and replace this with sed code, as IRIX sed won't handle
# lines with more than a fixed number of characters (4096 in
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
- # the IRIX cc adds comments like `#:fec' to the end of the
+ # the IRIX cc adds comments like '#:fec' to the end of the
# dependency line.
- tr ' ' '
-' < "$tmpdepfile" \
- | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
- tr '
-' ' ' >> "$depfile"
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
+ | tr "$nl" ' ' >> "$depfile"
echo >> "$depfile"
-
# The second pass generates a dummy entry for each header file.
- tr ' ' '
-' < "$tmpdepfile" \
- | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
- >> "$depfile"
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+ >> "$depfile"
else
- # The sourcefile does not contain any dependencies, so just
- # store a dummy comment line, to avoid errors with the Makefile
- # "include basename.Plo" scheme.
- echo "#dummy" > "$depfile"
+ make_dummy_depfile
fi
rm -f "$tmpdepfile"
;;
+xlc)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
aix)
# The C for AIX Compiler uses -M and outputs the dependencies
# in a .u file. In older versions, this file always lives in the
- # current directory. Also, the AIX compiler puts `$object:' at the
+ # current directory. Also, the AIX compiler puts '$object:' at the
# start of each line; $object doesn't have directory information.
# Version 6 uses the directory in both cases.
- dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
- test "x$dir" = "x$object" && dir=
- base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+ set_dir_from "$object"
+ set_base_from "$object"
if test "$libtool" = yes; then
tmpdepfile1=$dir$base.u
tmpdepfile2=$base.u
@@ -237,9 +313,7 @@ aix)
"$@" -M
fi
stat=$?
-
- if test $stat -eq 0; then :
- else
+ if test $stat -ne 0; then
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
exit $stat
fi
@@ -248,44 +322,100 @@ aix)
do
test -f "$tmpdepfile" && break
done
- if test -f "$tmpdepfile"; then
- # Each line is of the form `foo.o: dependent.h'.
- # Do two passes, one to just change these to
- # `$object: dependent.h' and one to simply `dependent.h:'.
- sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
- # That's a tab and a space in the [].
- sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
- else
- # The sourcefile does not contain any dependencies, so just
- # store a dummy comment line, to avoid errors with the Makefile
- # "include basename.Plo" scheme.
- echo "#dummy" > "$depfile"
+ aix_post_process_depfile
+ ;;
+
+tcc)
+ # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
+ # FIXME: That version still under development at the moment of writing.
+ # Make that this statement remains true also for stable, released
+ # versions.
+ # It will wrap lines (doesn't matter whether long or short) with a
+ # trailing '\', as in:
+ #
+ # foo.o : \
+ # foo.c \
+ # foo.h \
+ #
+ # It will put a trailing '\' even on the last line, and will use leading
+ # spaces rather than leading tabs (at least since its commit 0394caf7
+ # "Emit spaces for -MD").
+ "$@" -MD -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
fi
+ rm -f "$depfile"
+ # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
+ # We have to change lines of the first kind to '$object: \'.
+ sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
+ # And for each line of the second kind, we have to emit a 'dep.h:'
+ # dummy dependency, to avoid the deleted-header problem.
+ sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
rm -f "$tmpdepfile"
;;
-icc)
- # Intel's C compiler understands `-MD -MF file'. However on
- # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
- # ICC 7.0 will fill foo.d with something like
- # foo.o: sub/foo.c
- # foo.o: sub/foo.h
- # which is wrong. We want:
- # sub/foo.o: sub/foo.c
- # sub/foo.o: sub/foo.h
- # sub/foo.c:
- # sub/foo.h:
- # ICC 7.1 will output
+## The order of this option in the case statement is important, since the
+## shell code in configure will try each of these formats in the order
+## listed in this file. A plain '-MD' option would be understood by many
+## compilers, so we must ensure this comes after the gcc and icc options.
+pgcc)
+ # Portland's C compiler understands '-MD'.
+ # Will always output deps to 'file.d' where file is the root name of the
+ # source file under compilation, even if file resides in a subdirectory.
+ # The object file name does not affect the name of the '.d' file.
+ # pgcc 10.2 will output
# foo.o: sub/foo.c sub/foo.h
- # and will wrap long lines using \ :
+ # and will wrap long lines using '\' :
# foo.o: sub/foo.c ... \
# sub/foo.h ... \
# ...
+ set_dir_from "$object"
+ # Use the source, not the object, to determine the base name, since
+ # that's sadly what pgcc will do too.
+ set_base_from "$source"
+ tmpdepfile=$base.d
+
+ # For projects that build the same source file twice into different object
+ # files, the pgcc approach of using the *source* file root name can cause
+ # problems in parallel builds. Use a locking strategy to avoid stomping on
+ # the same $tmpdepfile.
+ lockdir=$base.d-lock
+ trap "
+ echo '$0: caught signal, cleaning up...' >&2
+ rmdir '$lockdir'
+ exit 1
+ " 1 2 13 15
+ numtries=100
+ i=$numtries
+ while test $i -gt 0; do
+ # mkdir is a portable test-and-set.
+ if mkdir "$lockdir" 2>/dev/null; then
+ # This process acquired the lock.
+ "$@" -MD
+ stat=$?
+ # Release the lock.
+ rmdir "$lockdir"
+ break
+ else
+ # If the lock is being held by a different process, wait
+ # until the winning process is done or we timeout.
+ while test -d "$lockdir" && test $i -gt 0; do
+ sleep 1
+ i=`expr $i - 1`
+ done
+ fi
+ i=`expr $i - 1`
+ done
+ trap - 1 2 13 15
+ if test $i -le 0; then
+ echo "$0: failed to acquire lock after $numtries attempts" >&2
+ echo "$0: check lockdir '$lockdir'" >&2
+ exit 1
+ fi
- "$@" -MD -MF "$tmpdepfile"
- stat=$?
- if test $stat -eq 0; then :
- else
+ if test $stat -ne 0; then
rm -f "$tmpdepfile"
exit $stat
fi
@@ -297,8 +427,8 @@ icc)
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
# Some versions of the HPUX 10.20 sed can't process this invocation
# correctly. Breaking it into two sed invocations is a workaround.
- sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
- sed -e 's/$/ :/' >> "$depfile"
+ sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
+ | sed -e 's/$/ :/' >> "$depfile"
rm -f "$tmpdepfile"
;;
@@ -309,9 +439,8 @@ hp2)
# 'foo.d', which lands next to the object file, wherever that
# happens to be.
# Much of this is similar to the tru64 case; see comments there.
- dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
- test "x$dir" = "x$object" && dir=
- base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+ set_dir_from "$object"
+ set_base_from "$object"
if test "$libtool" = yes; then
tmpdepfile1=$dir$base.d
tmpdepfile2=$dir.libs/$base.d
@@ -322,8 +451,7 @@ hp2)
"$@" +Maked
fi
stat=$?
- if test $stat -eq 0; then :
- else
+ if test $stat -ne 0; then
rm -f "$tmpdepfile1" "$tmpdepfile2"
exit $stat
fi
@@ -333,77 +461,107 @@ hp2)
test -f "$tmpdepfile" && break
done
if test -f "$tmpdepfile"; then
- sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
- # Add `dependent.h:' lines.
+ sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
+ # Add 'dependent.h:' lines.
sed -ne '2,${
- s/^ *//
- s/ \\*$//
- s/$/:/
- p
- }' "$tmpdepfile" >> "$depfile"
+ s/^ *//
+ s/ \\*$//
+ s/$/:/
+ p
+ }' "$tmpdepfile" >> "$depfile"
else
- echo "#dummy" > "$depfile"
+ make_dummy_depfile
fi
rm -f "$tmpdepfile" "$tmpdepfile2"
;;
tru64)
- # The Tru64 compiler uses -MD to generate dependencies as a side
- # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
- # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
- # dependencies in `foo.d' instead, so we check for that too.
- # Subdirectories are respected.
- dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
- test "x$dir" = "x$object" && dir=
- base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-
- if test "$libtool" = yes; then
- # With Tru64 cc, shared objects can also be used to make a
- # static library. This mechanism is used in libtool 1.4 series to
- # handle both shared and static libraries in a single compilation.
- # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
- #
- # With libtool 1.5 this exception was removed, and libtool now
- # generates 2 separate objects for the 2 libraries. These two
- # compilations output dependencies in $dir.libs/$base.o.d and
- # in $dir$base.o.d. We have to check for both files, because
- # one of the two compilations can be disabled. We should prefer
- # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
- # automatically cleaned when .libs/ is deleted, while ignoring
- # the former would cause a distcleancheck panic.
- tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4
- tmpdepfile2=$dir$base.o.d # libtool 1.5
- tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
- tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
- "$@" -Wc,-MD
- else
- tmpdepfile1=$dir$base.o.d
- tmpdepfile2=$dir$base.d
- tmpdepfile3=$dir$base.d
- tmpdepfile4=$dir$base.d
- "$@" -MD
- fi
-
- stat=$?
- if test $stat -eq 0; then :
- else
- rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
- exit $stat
- fi
-
- for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
- do
- test -f "$tmpdepfile" && break
- done
- if test -f "$tmpdepfile"; then
- sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
- # That's a tab and a space in the [].
- sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
- else
- echo "#dummy" > "$depfile"
- fi
- rm -f "$tmpdepfile"
- ;;
+ # The Tru64 compiler uses -MD to generate dependencies as a side
+ # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
+ # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+ # dependencies in 'foo.d' instead, so we check for that too.
+ # Subdirectories are respected.
+ set_dir_from "$object"
+ set_base_from "$object"
+
+ if test "$libtool" = yes; then
+ # Libtool generates 2 separate objects for the 2 libraries. These
+ # two compilations output dependencies in $dir.libs/$base.o.d and
+ # in $dir$base.o.d. We have to check for both files, because
+ # one of the two compilations can be disabled. We should prefer
+ # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+ # automatically cleaned when .libs/ is deleted, while ignoring
+ # the former would cause a distcleancheck panic.
+ tmpdepfile1=$dir$base.o.d # libtool 1.5
+ tmpdepfile2=$dir.libs/$base.o.d # Likewise.
+ tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504
+ "$@" -Wc,-MD
+ else
+ tmpdepfile1=$dir$base.d
+ tmpdepfile2=$dir$base.d
+ tmpdepfile3=$dir$base.d
+ "$@" -MD
+ fi
+
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ # Same post-processing that is required for AIX mode.
+ aix_post_process_depfile
+ ;;
+
+msvc7)
+ if test "$libtool" = yes; then
+ showIncludes=-Wc,-showIncludes
+ else
+ showIncludes=-showIncludes
+ fi
+ "$@" $showIncludes > "$tmpdepfile"
+ stat=$?
+ grep -v '^Note: including file: ' "$tmpdepfile"
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ # The first sed program below extracts the file names and escapes
+ # backslashes for cygpath. The second sed program outputs the file
+ # name when reading, but also accumulates all include files in the
+ # hold buffer in order to output them again at the end. This only
+ # works with sed implementations that can handle large buffers.
+ sed < "$tmpdepfile" -n '
+/^Note: including file: *\(.*\)/ {
+ s//\1/
+ s/\\/\\\\/g
+ p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/'"$tab"'\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+ s/.*/'"$tab"'/
+ G
+ p
+}' >> "$depfile"
+ echo >> "$depfile" # make sure the fragment doesn't end with a backslash
+ rm -f "$tmpdepfile"
+ ;;
+
+msvc7msys)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
#nosideeffect)
# This comment above is used by automake to tell side-effect
@@ -422,7 +580,7 @@ dashmstdout)
shift
fi
- # Remove `-o $object'.
+ # Remove '-o $object'.
IFS=" "
for arg
do
@@ -442,18 +600,18 @@ dashmstdout)
done
test -z "$dashmflag" && dashmflag=-M
- # Require at least two characters before searching for `:'
+ # Require at least two characters before searching for ':'
# in the target name. This is to cope with DOS-style filenames:
- # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+ # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
"$@" $dashmflag |
- sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
+ sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
rm -f "$depfile"
cat < "$tmpdepfile" > "$depfile"
- tr ' ' '
-' < "$tmpdepfile" | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly. Breaking it into two sed invocations is a workaround.
- sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process this sed invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+ | sed -e 's/$/ :/' >> "$depfile"
rm -f "$tmpdepfile"
;;
@@ -503,12 +661,15 @@ makedepend)
touch "$tmpdepfile"
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
rm -f "$depfile"
- cat < "$tmpdepfile" > "$depfile"
- sed '1,2d' "$tmpdepfile" | tr ' ' '
-' | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly. Breaking it into two sed invocations is a workaround.
- sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ # makedepend may prepend the VPATH from the source file name to the object.
+ # No need to regex-escape $object, excess matching of '.' is harmless.
+ sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process the last invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ sed '1,2d' "$tmpdepfile" \
+ | tr ' ' "$nl" \
+ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+ | sed -e 's/$/ :/' >> "$depfile"
rm -f "$tmpdepfile" "$tmpdepfile".bak
;;
@@ -525,7 +686,7 @@ cpp)
shift
fi
- # Remove `-o $object'.
+ # Remove '-o $object'.
IFS=" "
for arg
do
@@ -544,10 +705,10 @@ cpp)
esac
done
- "$@" -E |
- sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
- -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
- sed '$ s: \\$::' > "$tmpdepfile"
+ "$@" -E \
+ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+ | sed '$ s: \\$::' > "$tmpdepfile"
rm -f "$depfile"
echo "$object : \\" > "$depfile"
cat < "$tmpdepfile" >> "$depfile"
@@ -579,23 +740,23 @@ msvisualcpp)
shift
;;
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
- set fnord "$@"
- shift
- shift
- ;;
+ set fnord "$@"
+ shift
+ shift
+ ;;
*)
- set fnord "$@" "$arg"
- shift
- shift
- ;;
+ set fnord "$@" "$arg"
+ shift
+ shift
+ ;;
esac
done
"$@" -E 2>/dev/null |
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
rm -f "$depfile"
echo "$object : \\" > "$depfile"
- sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
- echo " " >> "$depfile"
+ sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
+ echo "$tab" >> "$depfile"
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
rm -f "$tmpdepfile"
;;
@@ -622,9 +783,9 @@ exit 0
# Local Variables:
# mode: shell-script
# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
+# eval: (add-hook 'before-save-hook 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
+# time-stamp-time-zone: "UTC0"
# time-stamp-end: "; # UTC"
# End:
diff --git a/src/Makefile.am b/src/Makefile.am
index 5cdc3cb6..ada5ce5a 100755
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -38,9 +38,9 @@ util/util_area_intersection.f90\
util/util_poisson.f90\
util/util_pop_array.f90\
util/util_push_array.f90\
-util/util_traverse_pop.f90\
+util/util_traverse_pop_array.f90\
util/util_destroy_list.f90\
-util/util_init_list.f90\
+util/util_init_array.f90\
util/util_perlin_noise.f90\
io/io_read_const.f90\
io/io_get_token.f90\
@@ -60,9 +60,7 @@ io/io_crater_profile.f90\
io/io_updatePbar.f90\
io/io_resetPbar.f90\
io/io_splash.f90\
-io/io_write_age.f90\
io/io_write_pindex_map.f90\
-io/io_write_age_depth.f90\
ejecta/ejecta_emplace.f90\
ejecta/ejecta_ray_pattern.f90\
ejecta/ejecta_ray_pattern_func.f90\
diff --git a/src/io/io_write_age.f90 b/src/io/io_write_age.f90
index 2f102188..78e1c4b6 100644
--- a/src/io/io_write_age.f90
+++ b/src/io/io_write_age.f90
@@ -38,7 +38,8 @@ subroutine io_write_age(user,surf,n_size,icrater,ncrat)
integer(kind=8) :: recsize
real(SP) :: stmp
real(SP) :: agetot, age_weighted
- type(regolisttype),pointer :: current => null()
+ !type(regolisttype),pointer :: current => null()
+ type(regodatatype),dimension(:),allocatable :: current
real(DP) :: depth, depth_prev
real(SP) :: recyclratio
! Output multiple "comphisto" files
@@ -55,8 +56,10 @@ subroutine io_write_age(user,surf,n_size,icrater,ncrat)
depth = 0.0
depth_prev = 0.0
- current => surf(i,j)%regolayer
- age_prev(:) = current%regodata%age(:)
+ !current => surf(i,j)%regolayer
+ !current = surf(i,j)%regolayer(:)
+ allocate(current,source=surf(i,j)%regolayer(:))
+ age_prev(:) = current%age(:)
agedepthtot = 0.0_SP
do
if (depth > sdepth) then
@@ -66,10 +69,10 @@ subroutine io_write_age(user,surf,n_size,icrater,ncrat)
exit
end if
depth_prev = depth
- depth = depth + current%regodata%thickness
- agedepthtot(:) = agedepthtot(:) + current%regodata%age(:)
- age_prev(:) = current%regodata%age(:)
- current => current%next
+ depth = depth + current%thickness
+ agedepthtot(:) = agedepthtot(:) + current%age(:)
+ age_prev(:) = current%age(:)
+ !current => current%next
end do
age_weighted = 0.0_SP
diff --git a/src/io/io_write_regotrack.f90 b/src/io/io_write_regotrack.f90
index e21ad5e8..a2f8fd41 100644
--- a/src/io/io_write_regotrack.f90
+++ b/src/io/io_write_regotrack.f90
@@ -77,10 +77,10 @@ subroutine io_write_regotrack(user,surf)
! comp(k) = current%regodata%comp
! age(:,k) = current%regodata%age(:)
! current => current%next
- meltfrac(k) = current%meltfrac
- thickness(k) = current%thickness
- comp(k) = current%comp
- age(:,k) = current%age(:)
+ meltfrac(k) = current(k)%meltfrac
+ thickness(k) = current(k)%thickness
+ comp(k) = current(k)%comp
+ age(:,k) = current(k)%age(:)
end do
write(FMELT) meltfrac(:)
diff --git a/src/regolith/module_regolith.f90 b/src/regolith/module_regolith.f90
index 5aa2a944..d9941907 100644
--- a/src/regolith/module_regolith.f90
+++ b/src/regolith/module_regolith.f90
@@ -269,7 +269,7 @@ subroutine regolith_superdomain(user,crater,domain,regolayer,ejdistribution,xpi,
type(usertype),intent(in) :: user
type(cratertype),intent(inout) :: crater
type(domaintype),intent(in) :: domain
- type(regolisttype),pointer :: regolayer
+ type(regodatatype),dimension(:),allocatable,intent(inout) :: regolayer
real(DP),intent(in) :: ejdistribution
integer(I4B),intent(in) :: xpi, ypi
real(DP),intent(in) :: age
diff --git a/src/regolith/regolith_streamtube_head.f90 b/src/regolith/regolith_streamtube_head.f90
index 7624d742..cb7568fc 100644
--- a/src/regolith/regolith_streamtube_head.f90
+++ b/src/regolith/regolith_streamtube_head.f90
@@ -30,7 +30,8 @@ subroutine regolith_streamtube_head(user,surfi,deltar,totmare,tots,age_collector
real(SP),dimension(:),intent(inout) :: age_collector
! internal variables
- type(regolisttype),pointer :: current
+ !type(regolisttype),pointer :: current
+ type(regodatatype),dimension(:),allocatable :: current
real(DP),parameter :: vratio = sqrt(2.0_DP)/2.0_DP ! Unfortunately, the approximate function that is used to get the size of a stream
! tube with a constraint of CTEM's ejecta blanket thickness is slightly different
! from the analytical function that we use here to approximate the stream tube's
@@ -41,8 +42,10 @@ subroutine regolith_streamtube_head(user,surfi,deltar,totmare,tots,age_collector
! melt collector
real(DP) :: recyratio
- current => surfi%regolayer
- z = current%regodata%thickness
+ !current => surfi%regolayer
+ !current = surfi%regolayer
+ allocate(current,source=surfi%regolayer)
+ z = current%thickness
vsgly = vratio * PI * deltar**3
tothead = 0._DP
totmarehead = 0._DP
@@ -55,29 +58,29 @@ subroutine regolith_streamtube_head(user,surfi,deltar,totmare,tots,age_collector
if (zend >= zmax) then ! Stream tube's head is inside the 1st layer.
tots = tots + vsgly
- totmare = totmare + vsgly * current%regodata%comp
- recyratio = vsgly / (user%pix**2) /current%regodata%thickness
- age_collector(:) = age_collector(:) + current%regodata%age(:) * recyratio
+ totmare = totmare + vsgly * current%comp
+ recyratio = vsgly / (user%pix**2) /current%thickness
+ age_collector(:) = age_collector(:) + current%age(:) * recyratio
else ! head is not intersected with layers.
do
- if (.not. associated(current%next)) exit
+ ! if (.not. associated(current%next)) exit
if (zend < zmax) then
vhead = regolith_circle_sector_func(deltar,zstart,zend)
tothead = tothead + vhead * vratio
- totmarehead = totmarehead + vhead * vratio * current%regodata%comp
- recyratio = vhead * vratio / (user%pix**2) / current%regodata%thickness
- age_collector(:) = age_collector(:) + current%regodata%age(:) * recyratio
- current => current%next
- z = z + current%regodata%thickness
+ totmarehead = totmarehead + vhead * vratio * current%comp
+ recyratio = vhead * vratio / (user%pix**2) / current%thickness
+ age_collector(:) = age_collector(:) + current%age(:) * recyratio
+ !current => current%next
+ z = z + current%thickness
zstart = zend
zend = z
else
- totmarehead = totmarehead + (vsgly-tothead) * current%regodata%comp
+ totmarehead = totmarehead + (vsgly-tothead) * current%comp
tothead = vsgly
- recyratio = (vsgly - tothead) / (user%pix**2) / current%regodata%thickness
- age_collector(:) = age_collector(:) + current%regodata%age(:) * recyratio
+ recyratio = (vsgly - tothead) / (user%pix**2) / current%thickness
+ age_collector(:) = age_collector(:) + current%age(:) * recyratio
exit
end if
end do
diff --git a/src/regolith/regolith_superdomain.f90 b/src/regolith/regolith_superdomain.f90
index 062b0be4..ba48f482 100644
--- a/src/regolith/regolith_superdomain.f90
+++ b/src/regolith/regolith_superdomain.f90
@@ -29,7 +29,7 @@ subroutine regolith_superdomain(user,crater,domain,regolayer,ejdistribution,xpi,
type(usertype),intent(in) :: user
type(cratertype),intent(inout) :: crater
type(domaintype),intent(in) :: domain
- type(regolisttype),pointer :: regolayer
+ type(regodatatype),dimension(:),allocatable,intent(inout) :: regolayer
real(DP),intent(in) :: ejdistribution
integer(I4B),intent(in) :: xpi, ypi
real(DP),intent(in) :: age
diff --git a/src/util/module_util.f90 b/src/util/module_util.f90
index 78720ef6..75b9731b 100644
--- a/src/util/module_util.f90
+++ b/src/util/module_util.f90
@@ -46,8 +46,8 @@ module module_util
subroutine util_push_array(regolayer,newregodata)
use module_globals
implicit none
- type(regodatatype),dimension(:),allocatable :: regolayer
- type(regodatatype),dimension(:),allocatable,intent(in) :: newregodata
+ type(regodatatype),dimension(:),allocatable,intent(inout) :: regolayer
+ type(regodatatype),intent(in) :: newregodata
end subroutine util_push_array
end interface
@@ -55,7 +55,7 @@ end subroutine util_push_array
subroutine util_pop_array(regolayer,oldregodata)
use module_globals
implicit none
- type(regodatatype),dimension(:),allocatable :: regolayer
+ type(regodatatype),dimension(:),allocatable,intent(inout) :: regolayer
type(regodatatype),intent(out) :: oldregodata
end subroutine util_pop_array
end interface
@@ -70,15 +70,26 @@ end subroutine util_pop_array
! end subroutine util_pop
! end interface
+! interface
+! subroutine util_traverse_pop(regolayer,traverse_depth,poppedlist)
+! use module_globals
+! implicit none
+! !type(regolisttype),pointer :: regolayer
+! type(regodatatype),dimension(:),allocatable,intent(inout) :: regolayer
+! real(DP),intent(in) :: traverse_depth
+! !type(regolisttype),pointer :: poppedlist
+! !type(regodatatype),dimension(:),allocatable,intent(out) :: poppedarray
+! end subroutine
+! end interface
+
interface
- subroutine util_traverse_pop(regolayer,traverse_depth,poppedlist)
+ subroutine util_traverse_pop_array(regolayer,traverse_depth,poppedarray)
use module_globals
implicit none
- !type(regolisttype),pointer :: regolayer
- type(regodatatype),dimension(:),allocatable :: regolayer
- real(DP),intent(in) :: traverse_depth
- type(regolisttype),pointer :: poppedlist
- end subroutine
+ type(regodatatype),dimension(:),allocatable,intent(inout) :: regolayer
+ real(DP),intent(in) :: traverse_depth
+ type(regodatatype),dimension(:),allocatable,intent(out) :: poppedarray
+ end subroutine
end interface
interface
@@ -89,13 +100,22 @@ subroutine util_destroy_list(regolayer)
end subroutine util_destroy_list
end interface
+! interface
+! subroutine util_init_list(regolayer,initstat)
+! use module_globals
+! implicit none
+! type(regolisttype),pointer :: regolayer
+! logical, intent(out) :: initstat
+! end subroutine util_init_list
+! end interface
+
interface
- subroutine util_init_list(regolayer,initstat)
+ subroutine util_init_array(regolayer,initstat)
use module_globals
implicit none
- type(regolisttype),pointer :: regolayer
+ type(regodatatype),dimension(:),allocatable,intent(inout) :: regolayer
logical, intent(out) :: initstat
- end subroutine util_init_list
+ end subroutine util_init_array
end interface
interface
diff --git a/src/util/util_init_array.f90 b/src/util/util_init_array.f90
new file mode 100644
index 00000000..e1c2dc52
--- /dev/null
+++ b/src/util/util_init_array.f90
@@ -0,0 +1,61 @@
+!**********************************************************************************************************************************
+!
+! Unit Name : util_init_array
+! Unit Type : subroutine
+! Project : CTEM
+! Language : Fortran 2003
+!
+! Description : Initialize an new allocatable array
+!
+!
+! Input
+! Arguments : regolayer :: array
+! oldlayer :: old layer to pop off of the top of the stack
+!
+! Output
+! Arguments :
+!
+!
+! Notes :
+!
+!**********************************************************************************************************************************
+subroutine util_init_array(regolayer,initstat)
+ use module_globals
+ use module_util, EXCEPT_THIS_ONE => util_init_array
+ implicit none
+
+ ! Arguments
+ type(regodatatype),dimension(:),allocatable,intent(inout) :: regolayer
+ logical, intent(out) :: initstat
+
+ ! Internal variables
+ integer(I4B) :: allocstat
+
+ ! Executable code
+ initstat = .false.
+ ! if (.not. associated(regolayer)) then
+ ! allocate(regolayer, STAT=allocstat)
+ ! if (allocstat == 0) then
+ ! initstat = .true.
+ ! nullify(regolayer%next)
+ ! regolayer%regodata%thickness = sqrt(VBIG) ! This generates a buffer layer that the model should never reach if the run is structured properly
+ ! regolayer%regodata%comp = 0.0_DP
+ ! regolayer%regodata%meltfrac = 0.0_DP
+ ! regolayer%regodata%porosity = 0.0_DP
+ ! regolayer%regodata%age(:) = 0.0_SP
+ if (allocated(regolayer)) deallocate(regolayer)
+ allocate(regolayer(1))
+ regolayer(1)%thickness = sqrt(VBIG) ! This generates a buffer layer that the model should never reach if the run is structured properly
+ regolayer(1)%comp = 0.0_DP
+ regolayer(1)%meltfrac = 0.0_DP
+ regolayer(1)%porosity = 0.0_DP
+ regolayer(1)%age(:) = 0.0_SP
+ ! else
+ ! write(*,*) 'util_init_list: Initialization failed. Exhausted memory.'
+ ! end if
+ ! else
+ ! write(*,*) 'util_init_list: Initialization failed. Regolayer already associated.'
+ ! end if
+
+ return
+ end subroutine util_init_array
\ No newline at end of file
diff --git a/src/util/util_pop_array.f90 b/src/util/util_pop_array.f90
index 7d148d1e..9fb4ec77 100644
--- a/src/util/util_pop_array.f90
+++ b/src/util/util_pop_array.f90
@@ -25,19 +25,19 @@ subroutine util_pop_array(regolayer,oldregodata)
implicit none
! Arguments
- type(regodatatype),dimension(:),allocatable :: regolayer
+ type(regodatatype),dimension(:),allocatable,intent(inout) :: regolayer
type(regodatatype),intent(out) :: oldregodata
! Internal variables
type(regodatatype), dimension(:), allocatable :: newlayer
- integer(I4B) :: allocstat
integer(I4B) :: nold
! Executable code
nold = size(regolayer)
- allocate(newlayer(nold-1), stat=allocstat)
- newlayer(1:nold-1) = regolayer(1:nold-1) ! could also be 2:nold depending on if top or bottom is popped off
+ allocate(newlayer(nold-1),source=regolayer(1:nold-1))
+ !newlayer(1:nold-1) = regolayer(1:nold-1) ! could also be 2:nold depending on if top or bottom is popped off
+ oldregodata = regolayer(nold)
call move_alloc(newlayer, regolayer)
end subroutine util_pop_array
\ No newline at end of file
diff --git a/src/util/util_push_array.f90 b/src/util/util_push_array.f90
index c1aea892..958f207a 100644
--- a/src/util/util_push_array.f90
+++ b/src/util/util_push_array.f90
@@ -25,21 +25,20 @@ subroutine util_push_array(regolayer,newregodata)
implicit none
! Arguments
- type(regodatatype),dimension(:),allocatable :: regolayer
- type(regodatatype),dimension(:),allocatable :: newregodata
+ type(regodatatype),dimension(:),allocatable,intent(inout) :: regolayer
+ type(regodatatype),intent(in) :: newregodata
! Internal variables
type(regodatatype), dimension(:), allocatable :: newlayer
- integer(I4B) :: allocstat
integer(I4B) :: nold
! Executable code
nold = size(regolayer)
- allocate(newregodata(nold+1), stat=allocstat)
+ allocate(newlayer(nold+1))
newlayer(1:nold) = regolayer(1:nold)
- newlayer(nold+1) = newregodata(:) ! need to see if this adds to the top or bottom of the layer stack
+ newlayer(nold+1) = newregodata ! need to see if this adds to the top or bottom of the layer stack
call move_alloc(newlayer, regolayer)
end subroutine util_push_array
diff --git a/src/util/util_traverse_pop.f90 b/src/util/util_traverse_pop.f90
index f4725482..8b208739 100755
--- a/src/util/util_traverse_pop.f90
+++ b/src/util/util_traverse_pop.f90
@@ -60,10 +60,11 @@ subroutine util_traverse_pop(regolayer,traverse_depth,poppedlist)
implicit none
! Arguments
- !type(regolisttype),pointer :: regolayer
- type(regodatatype),dimension(:),allocatable :: regolayer
+ type(regolisttype),pointer :: regolayer
+ type(regodatatype),dimension(:),allocatable,intent(inout) :: regolayer
real(DP),intent(in) :: traverse_depth
type(regolisttype),pointer :: poppedlist
+ type(regodatatype),dimension(:),allocatable,intent(out) :: poppedarray
! Internal variables
real(DP) :: z,depth,dz
@@ -71,7 +72,7 @@ subroutine util_traverse_pop(regolayer,traverse_depth,poppedlist)
logical :: initstat
real(DP) :: recyratio
- depth = regolayer%regodata%thickness
+ depth = regolayer%thickness
dz = 0._DP
z = traverse_depth
poppedlist => null()
@@ -90,19 +91,19 @@ subroutine util_traverse_pop(regolayer,traverse_depth,poppedlist)
if (z <= depth) then
dz = depth - z
- oldregodata = regolayer%regodata
+ oldregodata = regolayer
oldregodata%thickness = z
- oldregodata%age(:) = z / regolayer%regodata%thickness * regolayer%regodata%age(:)
- recyratio = dz / regolayer%regodata%thickness
- regolayer%regodata%age(:) = recyratio * regolayer%regodata%age(:)
- regolayer%regodata%thickness = dz
+ oldregodata%age(:) = z / regolayer%thickness * regolayer%age(:)
+ recyratio = dz / regolayer%thickness
+ regolayer%age(:) = recyratio * regolayer%age(:)
+ regolayer%thickness = dz
call util_push_array(poppedlist,oldregodata)
exit
else
- z = z - regolayer%regodata%thickness
+ z = z - regolayer%thickness
call util_pop_array(regolayer,oldregodata)
call util_push_array(poppedlist,oldregodata)
- depth = regolayer%regodata%thickness
+ depth = regolayer%thickness
end if
end do
diff --git a/src/util/util_traverse_pop_array.f90 b/src/util/util_traverse_pop_array.f90
new file mode 100644
index 00000000..15bebc5e
--- /dev/null
+++ b/src/util/util_traverse_pop_array.f90
@@ -0,0 +1,87 @@
+!**********************************************************************************************************************************
+!
+! Unit Name : util_traverse_pop_array
+! Unit Type : function
+! Project : CTEM
+! Language : Fortran 2003
+!
+! Description : Removes all layers down to a given depth. Cuts a layer if the depth ends in the middle of an old layer.
+!
+!
+! Input
+! Arguments :
+!
+! Output
+! Arguments : surf
+!
+!
+! Notes : Popped list will be in reversed order from the original list
+!
+!**********************************************************************************************************************************
+subroutine util_traverse_pop_array(regolayer,traverse_depth,poppedarray)
+ use module_globals
+ use module_util, EXCEPT_THIS_ONE => util_traverse_pop_array
+ implicit none
+
+ ! Arguments
+ !type(regolisttype),pointer :: regolayer
+ type(regodatatype),dimension(:),allocatable,intent(inout) :: regolayer
+ real(DP),intent(in) :: traverse_depth
+ !type(regolisttype),pointer :: poppedlist
+ type(regodatatype),dimension(:),allocatable,intent(out) :: poppedarray
+
+ ! Internal variables
+ real(DP) :: z,depth,dz
+ type(regodatatype) :: oldregodata
+ logical :: initstat
+ real(DP) :: recyratio
+ integer(I4B) :: i, N, maxi
+
+ N = size(regolayer)
+ depth = regolayer(N)%thickness
+ dz = 0._DP
+ z = traverse_depth
+
+
+
+ ! Initialize popped array
+ !call util_init_array(poppedarray,initstat)
+
+
+ !if (initstat) then
+ i = N
+ do
+ depth = depth + regolayer(i)%depth
+ if (depth > traverse_depth) then
+ maxi = i
+ exit
+ else
+ i = i - 1
+ end if
+ end do
+
+
+ allocate(poppedarray,source=regolayer(maxi:N))
+
+
+ depth = regolayer(maxi)%depth
+
+ ! if (z <= depth) then
+ ! dz = depth - z
+ oldregodata = regolayer(maxi)
+ oldregodata%thickness = z
+ oldregodata%age(:) = z / regolayer(maxi)%thickness * regolayer(maxi)%age(:)
+ recyratio = dz / regolayer(maxi)%thickness
+ regolayer(maxi)%age(:) = recyratio * regolayer(maxi)%age(:)
+ regolayer(maxi)%thickness = dz
+ call util_push_array(poppedarray,oldregodata)
+ ! else
+ ! z = z - regolayer%thickness
+ ! call util_pop_array(regolayer,oldregodata)
+ ! call util_push_array(poppedarray,oldregodata)
+ ! depth = regolayer%thickness
+ ! end if
+
+ return
+ end subroutine util_traverse_pop_array
+
\ No newline at end of file