From 7e24e2173947b2b6c765a481a27556502d28c179 Mon Sep 17 00:00:00 2001 From: Austin Blevins Date: Wed, 30 Nov 2022 17:34:39 -0500 Subject: [PATCH] Still doesn't compile. Replaced 'list' files with 'array', and removed io_write_age and io_write_age_depth as they're not called --- config/depcomp | 537 ++++++++++++++-------- src/Makefile.am | 6 +- src/io/io_write_age.f90 | 17 +- src/io/io_write_regotrack.f90 | 8 +- src/regolith/module_regolith.f90 | 2 +- src/regolith/regolith_streamtube_head.f90 | 33 +- src/regolith/regolith_superdomain.f90 | 2 +- src/util/module_util.f90 | 44 +- src/util/util_init_array.f90 | 61 +++ src/util/util_pop_array.f90 | 8 +- src/util/util_push_array.f90 | 9 +- src/util/util_traverse_pop.f90 | 21 +- src/util/util_traverse_pop_array.f90 | 87 ++++ 13 files changed, 584 insertions(+), 251 deletions(-) create mode 100644 src/util/util_init_array.f90 create mode 100644 src/util/util_traverse_pop_array.f90 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