Alpine3D

Alpine3D Svn Source Tree

Root/trunk/tools/snofilegenerator/create_snofiles.sh

1#!/bin/bash
2#
3# This script creates sno-files, from PREVAH land use codes.
4#
5# It is constructed as follows:
6# 1) Set default values
7# 2) Read command line parameters to overwrite default values when provided
8# 3) Reads file or stdin, to get list of land use codes where sno-files should be generated for.
9# 4) Cycle through all the land use codes and create sno-files
10# a- Prepare values for output to sno-files
11# b- Write actual sno-file.
12#
13# Examples (start with no arguments to get more help):
14# 1) bash create_snofiles.sh filename=lus.asc overwrite=Y Altitude=1256 BareSoil_z0=0.03 date=20070521 date_soillayers=20000101 time=1144 soillayermapfile=a.txt
15# 2) echo 12400 | bash create_snofiles.sh overwrite=Y Altitude=2000 BareSoil_z0=0.03 date=20070521 date_soillayers=20000101
16#
17# Author: Nander Wever (wever@slf.ch)
18#
19
20
21#Default values for script:
22filename="lus.asc"
23list_with_codes=""
24snofile="output_"
25stationinfofile=""
26canopymapfile="canopy_map.txt"
27soillayermapfile="soillayer_map.txt"
28overwrite="N"
29
30
31#Default values for sno file:
32date=19991001
33time=0000
34date_soillayers=${date}
35time_soillayers=${time}
36HS_Last=0.0
37Latitude=36.0
38Longitude=16.0
39Altitude=1500
40SlopeAngle=0
41SlopeAzi=0
42nSoilLayerData=19
43nSnowLayerData=0
44SoilAlbedo=0.2
45BareSoil_z0=0.02
46CanopyHeight=0.2
47CanopyLeafAreaIndex=0.2
48CanopyDirectThroughfall=0
49WindScalingFactor=1.00
50ErosionLevel=0
51TimeCountDeltaHS=0.00
52
53SurfaceHoarIndex=0.0
54DriftIndex=0.0
55ThreeHourNewSnow=0.0
56TwentyFourHourNewSnow=0.0
57
58Layer_Thick=0.5
59T=278.15
60Vol_Frac_I=0.00
61Vol_Frac_W=0.02
62Vol_Frac_V=0.01
63Vol_Frac_S=0.97
64Rho_S=2400.0
65Conduc_S=0.3
66HeatCapac_S=900.0
67rg=10000
68rb=0.0
69dd=0.0
70sp=0.0
71mk=0
72mass_hoar=0.0
73ne=1
74CDot=0.0
75metamo=0.0
76
77
78#Internal variables used by this script
79flagformissingstationinfofile=0#Flag for whether we warned that we cannot find the stationinfofile, so we only give warning once.
80flagformissingcanopymapfile=0#Flag for whether we warned that we cannot find the canopymapfile, so we only give warning once.
81flagformissingsoillayermapfile=0#Flag for whether we warned that we cannot find the soillayermapfile, so we only give warning once.
82
83
84#Check for command line parameters
85#if [ "$#" -eq "0" ]; then
86##No command line parameters provided.
87##Put code to deal with this situation here.
88#fi
89
90
91#Command line parameters overwrite default values:
92for var in $(echo $* | sed 's/\s/\n/g' |grep -e "="); do
93 eval $var
94done
95
96
97#Make backup of some variables, so we can overwrite them and restore them later on
98defLatitude=${Latitude}
99defLongitude=${Longitude}
100defAltitude=${Altitude}
101defSlopeAngle=${SlopeAngle}
102defSlopeAzi=${SlopeAzi}
103
104defSoilAlbedo=${SoilAlbedo}
105defCanopyHeight=${CanopyHeight}
106defCanopyLeafAreaIndex=${CanopyLeafAreaIndex}
107defCanopyDirectThroughfall=${CanopyDirectThroughfall}
108
109defnSoilLayerData=${nSoilLayerData}
110
111
112#Create list of codes from $filename or stdin
113if [ ! -z "${filename}" ]; then#If filename is provided, then read file ...
114list_with_codes=`cat ${filename} | grep ^[0-9] | tr ' \t' '\n' | sort -nu | tr '\n' ' '`
115# ^ put file in stream
116# ^ only select lines with numbers (header lines, etc, can be ignored this way)
117# ^ Make a vertical list
118# ^ sort by number
119# ^ take unique values (every code only once)
120#^ make horizontal list
121else#... else read stdin.
122stdin=''#Variable to store stdin
123if [ -t "0" ]; then#Stdin present? This test whether stdin is terminal. If so, quit script (we don't have stdin AND we don't have filename...)
124#echo "No filename given and no stdin detected."
125echo "Use:"
126echo "bash create_snofiles.sh filename= [option=...]"
127echo " where filename is GRID-file, or list with PREVAH-codes"
128echo "-or-"
129echo "bash create_snofiles.sh [option=...]"
130echo " and send PREVAH-codes by stdin."
131echo "note: this works slower than providing filename."
132echo ""
133echo "Options:"
134echo " filename=: give filename with land use codes."
135echo " snofile=: prefix for sno-files (example: snofile=RUN_, creates snofiles like: RUN_{land_use_code}.sno)"
136echo " stationinfofile=: file with station info, in format: [station_code Latitude Longitute Altitude SlopeAngle SlopeAzi]. Default: no station map."
137echo " canopymapfile=: file with soil albedo map file, in format: [lus-code albedo CanopyHeight LeafAreaIndex CanopyDirectThroughfall]. Default: canopy_map.txt"
138echo " soillayermapfile=: file with soil layers per land use class. [lus-code <soil layer info in format as in sno. files>. Default: soillayer_map.txt"
139echo " overwrite=: Y: overwrite existing snofiles without asking, N: never overwrite snofiles (skips over land use code)."
140echo " date=: profile date, in format YYYYMMDD."
141echo " time=: profile time, in format HHMM."
142echo " date_soillayers=: soil layer date, in format YYYYMMDD."
143echo " time_soillayers=: soil layer time, in format HHMM."
144echo ""
145echo "Options to override defaults of sno file (defaults are given as example):"
146echo " HS_Last=${HS_Last}"
147echo " Latitude=${Latitude}"
148echo " Longitude=${Longitude}"
149echo " Altitude=${Altitude}"
150echo " SlopeAngle=${SlopeAngle}"
151echo " SlopeAzi=${SlopeAzi}"
152echo " nSoilLayerData=${nSoilLayerData}"
153echo " nSnowLayerData=${nSnowLayerData}"
154echo " BareSoil_z0=${BareSoil_z0}"
155echo " CanopyHeight=${CanopyHeight}"
156echo " CanopyLeafAreaIndex=${CanopyLeafAreaIndex}"
157echo " CanopyDirectThroughfall=${CanopyDirectThroughfall}"
158echo " WindScalingFactor=${WindScalingFactor}"
159echo " ErosionLevel=${ErosionLevel}"
160echo " TimeCountDeltaHS=${TimeCountDeltaHS}"
161echo " SurfaceHoarIndex=${SurfaceHoarIndex} (repeated 48 times)"
162echo " DriftIndex=${DriftIndex} (repeated 48 times)"
163echo " ThreeHourNewSnow=${ThreeHourNewSnow} (repeated 144 times)"
164echo " TwentyFourHourNewSnow=${TwentyFourHourNewSnow} (repeated 144 times)"
165echo ""
166echo " T=${T}"
167echo " Vol_Frac_I=${Vol_Frac_I}"
168echo " Vol_Frac_W=${Vol_Frac_W}"
169echo " Vol_Frac_V=${Vol_Frac_V}"
170echo " Vol_Frac_S=${Vol_Frac_S}"
171echo " Rho_S=${Rho_S}"
172echo " Conduc_S=${Conduc_S}"
173echo " HeatCapac_S=${HeatCapac_S}"
174echo " rg=${rg}"
175echo " rb=${rb}"
176echo " dd=${dd}"
177echo " sp=${sp}"
178echo " mk=${mk}"
179echo " mass_hoar=${mass_hoar}"
180echo " ne=${ne}"
181echo " CDot=${CDot}"
182echo " metamo=${metamo}"
183echo ""
184echo "Usage example:"
185echo " bash create_snofiles.sh filename=lus.asc overwrite=Y Altitude=1600 BareSoil_z0=0.03 date=20070521 time=1144"
186echo "-or-"
187echo " bash create_snofiles.sh filename=lus.asc overwrite=Y Altitude=0 BareSoil_z0=0.03 date=20070521 date_soillayers=20000101 time=1144 soillayermapfile=a.txt"
188echo "-or-"
189echo " echo 12400 | bash create_snofiles.sh overwrite=Y Altitude=0 BareSoil_z0=0.03 date=20070521 date_soillayers=20000101"
190echo ""
191echo "Note 1: the script priority is always to use the information from stationinfofile, canopymapfile"
192echo "and soillayermapfile. When information is not available there, it will write out default values. By"
193echo "using for example stationinfofile=\"\", the script will always use default values for station info."
194echo "Note 2: the script priority is always to look for an input file with land use codes, before reading"
195echo "stdin."
196
197exit
198else#stdin is present, so read it.
199while read line
200do
201stdin=`echo ${stdin} ${line} | grep ^[0-9] | tr ' ' '\n' | sort -n | uniq | tr '\n' ' '`
202done
203list_with_codes=`echo ${stdin} | grep ^[0-9] | tr ' ' '\n' | sort -n | uniq | tr '\n' ' '`
204# ^ put file in stream
205# ^ only select lines with numbers (header lines, etc, can be ignored this way)
206# ^ Make a vertical list
207# ^ sort by number
208# ^ take unique values (every code only once)
209# ^ make horizontal list
210fi
211fi
212
213
214#Parse codes
215if [ -z "${list_with_codes}" ]; then#If list with codes is empty
216echo "No codes found..."
217echo "No sno files created, exiting."
218else
219for code in `echo ${list_with_codes} | tr ' ' '\n' | awk '{printf "%d\n", $1}' | tr '\n' ' '`#Cycle through all the codes in the list
220# ^ put list in stream ^ make list vertical ^ reformat ^ make list horizontal again
221do
222output_snofile=`echo ${snofile}${code}.sno`#Create output snofile name.
223if [ -e "${output_snofile}" ] && [ ${overwrite} != "Y" ]; then#If file exists, and we are not allowed to overwrite sno files, give error message and skip code.
224echo "Code [${code}]: ${output_snofile} already exists, doing nothing..."
225else
226#Check possibility to create sno-file:
227touch ${output_snofile}#Create file, when it doesn't exist.
228if [ ! -w "${output_snofile}" ]; then#Check if file is writable now.
229echo "Cannot write to file ${output_snofile}. Check permissions and disk space."
230exit
231fi
232#Read out code
233lus_prefix=`echo ${code} | awk '{print int($1/10000)}'`
234lus_code=`echo ${code} | awk '{print int(($1/100)%100)}'`
235soil_depth=`echo ${code} | awk '{print int(($1/10)%10)}'`
236soil_capacity=`echo ${code} | awk '{print int($1%10)}'`
237if [ ${lus_prefix} != "1" ]; then#If prefix is not "1", it is not a PREVAH code, so we better skip it...
238echo "Code [${code}] is not in correct format. Skipping..."
239else
240# # # # # # # # # # # # # # # # # # # # # #
241# Prepare data to go into sno file: #
242# # # # # # # # # # # # # # # # # # # # # #
243#Prepare datum
244YYYY=`echo ${date} | awk '{printf "%04d\n", int($1/10000)}'`
245MM=`echo ${date} | awk '{printf "%02d\n", int(($1%10000)/100)}'`
246DD=`echo ${date} | awk '{printf "%02d\n", int($1%100)}'`
247HH=`echo ${time} | awk '{printf "%02d\n", int($1/100)}'`
248mm=`echo ${time} | awk '{printf "%02d\n", int($1%100)}'`
249
250#Copy back defaults: (This is because for one point, defaults might be overwritten with ones from outside (mapping files). Therefore, in the next loop we have to reset these values).
251Latitude=${defLatitude}
252Longitude=${defLongitude}
253Altitude=${defAltitude}
254SlopeAngle=${defSlopeAngle}
255SlopeAzi=${defSlopeAzi}
256
257SoilAlbedo=${defSoilAlbedo}
258CanopyHeight=${defCanopyHeight}
259CanopyLeafAreaIndex=${defCanopyLeafAreaIndex}
260CanopyDirectThroughfall=${defCanopyDirectThroughfall}
261
262#Query stationinfofile for station details
263if [ -e "${stationinfofile}" ]; then#stationinfofile exists?
264stationinfo=`cat ${stationinfofile} | sed 's/^[ \t]*//' | grep -v ^# | grep ^${lus_code}`#Get line from stationinfofile
265if [ `echo ${stationinfo} | awk 'END {print NF}'` == "6" ]; then#Are there six column in it?
266#Then override defaults
267Latitude=`echo ${stationinfo} | awk '(NR==1) {print $2}'`
268Longitude=`echo ${stationinfo} | awk '(NR==1) {print $3}'`
269Altitude=`echo ${stationinfo} | awk '(NR==1) {print $4}'`
270SlopeAngle=`echo ${stationinfo} | awk '(NR==1) {print $5}'`
271SlopeAzi=`echo ${stationinfo} | awk '(NR==1) {print $6}'`
272else#Give warning
273echo "Station ${lus_code} not in station info file ${stationinfofile}, or station info is incomplete. Using defaults."
274fi
275else#stationinfofile does not exist
276if [ "${flagformissingstationinfofile}" == "0" ] && [ ! -z "${stationinfofile}" ]; then# Only do this when we have not given a warning yet AND there has been a stationinfofile specified
277echo "No station info file (${stationinfofile}) found, using default station values."
278flagformissingstationinfofile=1# Set flag to 1, so we only warn once.
279fi
280fi
281
282
283#Determine canopy values
284if [ -e "${canopymapfile}" ]; then
285canopyvalues=`cat ${canopymapfile} | sed 's/^[ \t]*//' | grep -v ^# | sort -nk1 | grep ^${lus_code} | awk '{print $1, $2, $3, $4, $5}' | head -1`
286if [ `echo ${canopyvalues} | awk 'END {print NF}'` == "5" ]; then#Are there enough column in it?
287SoilAlbedo=`echo ${canopyvalues} | awk '{print $2}'`
288CanopyHeight=`echo ${canopyvalues} | awk '{print $3}'`
289CanopyLeafAreaIndex=`echo ${canopyvalues} | awk '{print $4}'`
290CanopyDirectThroughfall=`echo ${canopyvalues} | awk '{print $5}'`
291else
292echo "No canopy values found for code: ${lus_code}. Using defaults."
293fi
294else
295if [ "${flagformissingcanopymapfile}" == "0" ]; then# Only do this when we have not given a warning yet
296echo "No canopy map file (${canopymapfile}) found, using default station values."
297flagformissingcanopymapfile=1# Set flag to 1, so we only warn once.
298fi
299fi
300
301
302#Determine soil layer values
303nSoilLayerData=${defnSoilLayerData}#Reset to default value
304if [ -e "${soillayermapfile}" ]; then#Check if soil layer map file exists
305nSoilLayersinFile=`cat ${soillayermapfile} | grep -v ^# | awk '($1=='${lus_code}') {print $0}' | wc -l`
306if [ "${nSoilLayersinFile}" -eq 0 ]; then
307nSoilLayersinFile=""#Make string empty, so it can be used in the check below.
308fi
309else
310if [ "${flagformissingsoillayermapfile}" == "0" ]; then# Only do this when we have not given a warning yet
311echo "No soil layer map file (${soillayermapfile}) found, using default station values."
312flagformissingsoillayermapfile=1# Set flag to 1, so we only warn once.
313fi
314nSoilLayersinFile=""#Make string empty, so it can be used in the check below.
315fi
316if [ -z "${nSoilLayersinFile}" ]; then#If empty, we have no soil layer values in map file, or the soil layer map file does not exist.
317if [ "${flagformissingsoillayermapfile}" -ne 1 ]; then#If this is not 1, the reason nSoilLayersinFile is empty is because the lus-code is not in the file, not because the file does not exist.
318echo "No soil layer values found for code: ${lus_code}. Using defaults."
319fi
320#Determine default values for soil layers
321for nSoilLayer in `seq 1 ${nSoilLayerData}`
322do
323#Note: the construction with eval creates the variables with index nSoilLayers (e.g. Vol_Frac_W14). This is an equal approach to having an array with values.
324#Make layer birth date and time equal to profile time
325eval YYYY_soil${nSoilLayer}=`echo ${date_soillayers} | awk '{printf "%04d\n", int($1/10000)}'`
326eval MM_soil${nSoilLayer}=`echo ${date_soillayers} | awk '{printf "%02d\n", int(($1%10000)/100)}'`
327eval DD_soil${nSoilLayer}=`echo ${date_soillayers} | awk '{printf "%02d\n", int($1%100)}'`
328eval HH_soil${nSoilLayer}=`echo ${time_soillayers} | awk '{printf "%02d\n", int($1/100)}'`
329eval mm_soil${nSoilLayer}=`echo ${time_soillayers} | awk '{printf "%02d\n", int($1%100)}'`
330#Set other soil properties
331eval Layer_Thick${nSoilLayer}=${Layer_Thick}
332eval T${nSoilLayer}=${T}
333eval Vol_Frac_I${nSoilLayer}=${Vol_Frac_I}
334eval Vol_Frac_W${nSoilLayer}=${Vol_Frac_W}
335eval Vol_Frac_V${nSoilLayer}=${Vol_Frac_V}
336eval Vol_Frac_S${nSoilLayer}=${Vol_Frac_S}
337eval Rho_S${nSoilLayer}=${Rho_S}
338eval Conduc_S${nSoilLayer}=${Conduc_S}
339eval HeatCapac_S${nSoilLayer}=${HeatCapac_S}
340eval rg${nSoilLayer}=${rg}
341eval rb${nSoilLayer}=${rb}
342eval dd${nSoilLayer}=${dd}
343eval sp${nSoilLayer}=${sp}
344eval mk${nSoilLayer}=${mk}
345eval mass_hoar${nSoilLayer}=${mass_hoar}
346eval ne${nSoilLayer}=${ne}
347eval CDot${nSoilLayer}=${CDot}
348eval metamo${nSoilLayer}=${metamo}
349done
350else
351nSoilLayerData=${nSoilLayersinFile}
352fi
353
354
355
356
357# # # # # # # # # # # # # # # # # # # # # #
358# Write out to sno file: #
359# # # # # # # # # # # # # # # # # # # # # #
360echo "[SNOWPACK_INITIALIZATION]" > ${output_snofile}
361echo "StationName=${lus_code}" >> ${output_snofile}
362echo "ProfileDate=${YYYY} ${MM} ${DD} ${HH} ${mm}" >> ${output_snofile}
363echo "HS_Last=${HS_Last}" >> ${output_snofile}
364echo "Latitude=${Latitude}" >> ${output_snofile}
365echo "Longitude=${Longitude}" >> ${output_snofile}
366echo "Altitude=${Altitude}" >> ${output_snofile}
367echo "SlopeAngle=${SlopeAngle}" >> ${output_snofile}
368echo "SlopeAzi=${SlopeAzi}" >> ${output_snofile}
369echo "nSoilLayerData=${nSoilLayerData}" >> ${output_snofile}
370echo "nSnowLayerData=${nSnowLayerData}" >> ${output_snofile}
371echo "SoilAlbedo=${SoilAlbedo}" >> ${output_snofile}
372echo "BareSoil_z0=${BareSoil_z0}" >> ${output_snofile}
373echo "CanopyHeight=${CanopyHeight}" >> ${output_snofile}
374echo "CanopyLeafAreaIndex=${CanopyLeafAreaIndex}" >> ${output_snofile}
375echo "CanopyDirectThroughfall=${CanopyDirectThroughfall}" >> ${output_snofile}
376echo "WindScalingFactor=${WindScalingFactor}" >> ${output_snofile}
377echo "ErosionLevel=${ErosionLevel}" >> ${output_snofile}
378echo "TimeCountDeltaHS=${TimeCountDeltaHS}" >> ${output_snofile}
379echo "YYYY MM DD HH MI Layer_Thick T Vol_Frac_I Vol_Frac_W Vol_Frac_V Vol_Frac_S Rho_S Conduc_S HeatCapac_S rg rb dd sp mk mass_hoar ne CDot metamo" >> ${output_snofile}
380#Use this, in combination with: cat *.sno | grep hhhhhh | sed 's/hhhhhhh //' > soillayer_map.txt to generate standard soillayer map.
381#for nSoilLayer in `seq 1 ${nSoilLayerData}`
382#do
383#eval "echo hhhhhhh \${lus_code} \$YYYY_soil${nSoilLayer} \$MM_soil${nSoilLayer} \$DD_soil${nSoilLayer} \$HH_soil${nSoilLayer} \$mm_soil${nSoilLayer} \$Layer_Thick${nSoilLayer} \$T${nSoilLayer} \$Vol_Frac_I${nSoilLayer} \$Vol_Frac_W${nSoilLayer} \$Vol_Frac_V${nSoilLayer} \$Vol_Frac_S${nSoilLayer} \$Rho_S${nSoilLayer} \$Conduc_S${nSoilLayer} \$HeatCapac_S${nSoilLayer} \$rg${nSoilLayer} \$rb${nSoilLayer} \$dd${nSoilLayer} \$sp${nSoilLayer} \$mk${nSoilLayer} \$mass_hoar${nSoilLayer} \$ne${nSoilLayer} \$CDot${nSoilLayer} \$metamo${nSoilLayer}" >> ${output_snofile}
384#done
385
386
387#Write out soil layers
388if [ ! -z "${nSoilLayersinFile}" ]; then#When we can read soil layers from file
389#Check that total volumetric content == 1:
390cat ${soillayermapfile} | grep -v ^# | awk '($1=='${lus_code}') {if ($9+$10+$11+$12!=1.0) {printf "Code ['${code}']: Warning: total volumetric content not 1 at line %d in file %s.\n", NR, "'${soillayermapfile}'"}}'
391#Then write out soil layer info:
392cat ${soillayermapfile} | grep -v ^# | awk '($1=='${lus_code}') {print $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24}' >> ${output_snofile}
393else#If not, write out default values
394for nSoilLayer in `seq 1 ${nSoilLayerData}`#Write out default values
395do
396#Check if total volumetric content is 1:
397if [ $(eval "echo \$Vol_Frac_I${nSoilLayer} \$Vol_Frac_W${nSoilLayer} \$Vol_Frac_V${nSoilLayer} \$Vol_Frac_S${nSoilLayer}" | awk '{print $1+$2+$3+$4==1}') != "1" ]; then
398echo "Code [${code}]: Warning: total volumetric content not 1 for nSoilLayer==${nSoilLayer}."
399fi
400#Write out soil layer info:
401eval "echo \$YYYY_soil${nSoilLayer} \$MM_soil${nSoilLayer} \$DD_soil${nSoilLayer} \$HH_soil${nSoilLayer} \$mm_soil${nSoilLayer} \$Layer_Thick${nSoilLayer} \$T${nSoilLayer} \$Vol_Frac_I${nSoilLayer} \$Vol_Frac_W${nSoilLayer} \$Vol_Frac_V${nSoilLayer} \$Vol_Frac_S${nSoilLayer} \$Rho_S${nSoilLayer} \$Conduc_S${nSoilLayer} \$HeatCapac_S${nSoilLayer} \$rg${nSoilLayer} \$rb${nSoilLayer} \$dd${nSoilLayer} \$sp${nSoilLayer} \$mk${nSoilLayer} \$mass_hoar${nSoilLayer} \$ne${nSoilLayer} \$CDot${nSoilLayer} \$metamo${nSoilLayer}" >> ${output_snofile}
402done
403fi
404
405echo "SurfaceHoarIndex" >> ${output_snofile}
406echo ${SurfaceHoarIndex} | awk '{ for(i=1;i<=48;i++) printf("%s ", $1) } {printf("\n")}' >> ${output_snofile}
407echo "DriftIndex" >> ${output_snofile}
408echo ${DriftIndex} | awk '{ for(i=1;i<=48;i++) printf("%s ", $1) } {printf("\n")}' >> ${output_snofile}
409echo "ThreeHourNewSnow" >> ${output_snofile}
410echo ${ThreeHourNewSnow} | awk '{ for(i=1;i<=144;i++) printf("%s ", $1) } {printf("\n")}' >> ${output_snofile}
411echo "TwentyFourHourNewSnow" >> ${output_snofile}
412echo ${TwentyFourHourNewSnow} | awk '{ for(i=1;i<=144;i++) printf("%s ", $1) } {printf("\n")}' >> ${output_snofile}
413echo "End" >> ${output_snofile}
414
415#Inform user
416echo "Code [${code}]: sno-file created"
417#echo " luscode = ${lus_code}"
418#echo " soil_depth = ${soil_depth}"
419#echo " soil_capacity = ${soil_capacity}"
420fi
421fi
422done
423fi

Archive Download this file

Revision: HEAD