Opened 5 years ago

Last modified 5 months ago

#2606 new defect

Bugs in r.sun

Reported by: ojni0001 Owned by: grass-dev@…
Priority: normal Milestone: 7.4.5
Component: Raster Version: unspecified
Keywords: r.sun Cc:
CPU: x86-64 Platform: MSWindows 7

Description

I am new to this, so some things I write here may not be how it should be. My environment: Win7 x64 GRASS Version (7beta and RC1) and hence 32 bit binary (although I mentioned GRASS7, but it may be present in GRASS 6, and earlier versions)

I have 2 issues, probably needs 2 tickets but I am mentioning here both.

I used a virtual landscape with elevation = constant (i.e. flat)

Issue 1.

I found that if I am using the aspect raster, zero degree is East and 270 is South (as mentioned in the help). But if I am using a single value for aspect, zero or 360 degrees is North and 180 degree is South. I don't know if 90 degree is East or West. So, either help document has to be changed or the algorithm.

Issue 2.

When the slope is more than 60 degrees (probably from 45 degrees) facing North (northwards from east or west and North), the global radiation values are increasing

i.e. the radiation value for slope of 70 degrees is more than when the slope is 60 degrees

the radiation value for slope of 90 degrees is more than when the slope is 80 degrees

Here, is a small table for demonstration (aspect of 0 or 360 is North, as mentioned in issue 1 above) Jan->17 (day=17), Feb->16 (day=47), Mar->16 (day=75) April->15 (day=105), May->15 (day=135)

slope aspect Jan Feb Mar Apr May

10 345 1.61 2.45 3.59 5.24 6.52

20 345 0.93 1.73 2.93 4.70 6.18

30 345 0.36 1.04 2.21 4.03 5.67

40 345 0.13 0.46 1.49 3.26 5.01

50 345 0.12 0.15 0.85 2.42 4.22

60 345 0.11 0.16 0.85 2.38 4.17

70 345 0.10 0.59 1.63 3.38 5.12

80 345 0.54 1.29 2.47 4.30 5.94

90 345 1.20 2.05 3.28 5.11 6.62

10 360 1.59 2.42 3.57 5.23 6.52

20 360 0.87 1.66 2.87 4.67 6.17

30 360 0.27 0.91 2.11 3.99 5.66

40 360 0.13 0.26 1.30 3.21 5.00

50 360 0.12 0.14 0.47 2.36 4.21

60 360 0.11 0.13 0.56 2.48 4.35

70 360 0.10 0.35 1.51 3.49 5.32

80 360 0.38 1.12 2.42 4.41 6.15

90 360 1.08 1.97 3.28 5.22 6.81

For testing I have attached a zipped file (simulation for slope 0 to 90, step 10 degrees and for aspect 0 to 360, step 15 degrees) with the script and sample elevation (flat landscape) file. The table may look a bit different but the pattern will be similar.

Thank you.

Nirmal

Attachments (1)

ForTest.zip (136.1 KB) - added by ojni0001 5 years ago.
test elevation, script and output (r.info) files

Download all attachments as: .zip

Change History (14)

Changed 5 years ago by ojni0001

Attachment: ForTest.zip added

test elevation, script and output (r.info) files

comment:1 Changed 5 years ago by martinl

Component: DefaultRaster
Keywords: r.sun added
Milestone: 7.0.1

comment:2 in reply to:  description ; Changed 5 years ago by wenzeslaus

Replying to ojni0001:

For testing I have attached a zipped file (simulation for slope 0 to 90, step 10 degrees and for aspect 0 to 360, step 15 degrees) with the script and sample elevation (flat landscape) file. The table may look a bit different but the pattern will be similar.

Can you create a test which would be able to run in a fully automated way? Something like:

General information about writing tests is here:

comment:3 in reply to:  2 Changed 4 years ago by ojni0001

I can try creating a test, but it will take some time. I haven't really used Python before and I created the shell script first time for testing above simulation. However, by looking at the page you provided, I may be able to create one.

---

Nirmal

Replying to wenzeslaus:

Replying to ojni0001:

For testing I have attached a zipped file (simulation for slope 0 to 90, step 10 degrees and for aspect 0 to 360, step 15 degrees) with the script and sample elevation (flat landscape) file. The table may look a bit different but the pattern will be similar.

Can you create a test which would be able to run in a fully automated way? Something like:

General information about writing tests is here:

comment:4 Changed 4 years ago by ojni0001

Creating Python script is not possible for me at the moment. I have created a shell script running in Windows7 OS. So, I guess it also runs on Linux machine. The script does not assume that data is present. It will create a raster data with 1 cell and runs the test.

I cannot find a way to attach the code. Please see the script below:

function fcomp() {
    awk -v n1=$1 -v n2=$2 'BEGIN{ if (n1<n2) exit 0; exit 1}'
}
echo "running test for ticket no. 2606" > test_2606.txt
g.mapset PERMANENT
g.proj -c epsg=2449
g.region s=-83700 n=-83600 w=-23200 e=-23100 res=100
r.mapcalc --overwrite "const_elev = 15.0"
days=( 17 47 75 105 135 162 198 228 258 288 318 344)
month=( jan feb mar apr may jun jul aug sep oct nov dec)
aspect=( 0.0 15.0 30.0 45.0 60.0 75.0 90.0 105.0 120.0 135.0 150.0 165.0 180.0 195.0 210.0 225.0 240.0 255.0 270.0 285.0 300.0 315.0 330.0 345.0 360.0)
slope=( 0.0 10.0 20.0 30.0 40.0 50.0 60.0 70.0 80.0 90.0)
for k in {0..11}
do 
        for i in {0..24}
        do
                for j in {0..9}
                do              
                        CMD="r.sun --overwrite --quiet elevation=const_elev aspect_value=${aspect[$i]} slope_value=${slope[$j]} linke_value=1.0 glob_rad=at1-g_${month[$k]}_${slope[$j]}_${aspect[$i]} day=${days[$k]} step=0.5" 
                        $CMD
                done
        done    
done

fail1=0
fail2=0
fail3=0
fail4=0
count1=0
count2=0
count3=0
for k in {0..11}
do 
        #for i in {0..24}
        #lets check at aspect 0 and 180 degrees, the radiation value should be equal if 270 is south
        for i in 0 12
        do
                ((i2=i+12))
                for j in {0..9}
                do
                        x1=`r.info -r at1-g_${month[$k]}_${slope[$j]}_${aspect[$i]} | grep "max" | cut -d =  -f 2 `
                        x2=`r.info -r at1-g_${month[$k]}_${slope[$j]}_${aspect[$i2]} | grep "max" | cut -d =  -f 2 `
                        diff_val=`awk "BEGIN {print $x1-$x2; exit}"`
                        echo "  month: ${month[$k]}     aspect: ${aspect[$i]}; ${aspect[$i2]}   slope=${slope[$j]}" >> test_2606.txt
                        echo "          x1=$x1  x2=$x2  difference: $diff_val" >> test_2606.txt
                        ((count1=count1+1))
                        if [ $diff_val = 0 ];then
                                echo "          test passed" >> test_2606.txt
                        else
                                echo "          test failed; bug remaining, east/west is not 0/180, south is not 270 degrees" >> test_2606.txt
                                ((fail1=fail1+1))
                        fi
                done
        done
        wait
done
wait
for k in {0..11}
do 
        #for i in {0..24}
        #lets check at aspect 90 and 270 degrees to check whether 90/270 is east/west or west/east
        for i in 6
        do
                ((i2=i+12))
                for j in {0..9}
                do
                        x1=`r.info -r at1-g_${month[$k]}_${slope[$j]}_${aspect[$i]} | grep "max" | cut -d =  -f 2 `
                        x2=`r.info -r at1-g_${month[$k]}_${slope[$j]}_${aspect[$i2]} | grep "max" | cut -d =  -f 2 `
                        diff_val=`awk "BEGIN {print $x1-$x2; exit}"`
                        ((count2=count2+1))
                        echo "  month: ${month[$k]}     aspect: ${aspect[$i]}; ${aspect[$i2]}   slope=${slope[$j]}" >> test_2606.txt
                        echo "          x1=$x1  x2=$x2  difference: $diff_val" >> test_2606.txt
                        if [ $diff_val = 0 ];then
                                echo "          values are equal at 90/270 bug remaining, east/west is 90/270 degrees" >> test_2606.txt
                                ((fail2=fail2+1))
                        fi
                done
        done
        wait
done
wait
for k in {0..11}
do 
        for i in {0..24}
        #for i in 6
        do
                #for j in {0..9}
                for j in 7
                do
                        ((j2=j+1))
                        ((j3=j+2))
                        x1=`r.info -r at1-g_${month[$k]}_${slope[$j]}_${aspect[$i]} | grep "max" | cut -d =  -f 2 `
                        x2=`r.info -r at1-g_${month[$k]}_${slope[$j2]}_${aspect[$i]} | grep "max" | cut -d =  -f 2 `
                        x3=`r.info -r at1-g_${month[$k]}_${slope[$j3]}_${aspect[$i]} | grep "max" | cut -d =  -f 2 `
                        diff_val1=`awk "BEGIN {print $x1-$x2; exit}"`
                        diff_val2=`awk "BEGIN {print $x2-$x3; exit}"`
                        ((count3=count3+1))
                        echo "  month: ${month[$k]}     aspect: ${aspect[$i]}   slope=${slope[$j]}      ${slope[$j2]}   ${slope[$j3]}" >> test_2606.txt
                        echo "          x1=$x1  x2=$x2  x3=$x3  differences: $diff_val1 $diff_val2" >> test_2606.txt
                        #if [ $diff_val1 > 0 ];then
                        if fcomp 0 $diff_val1; then
                                echo "          $diff_val1 > 0; OK" >> test_2606.txt
                        else
                                echo "          $diff_val1 < 0;bug remaining, ${slope[$j]} has less radiance than ${slope[$j2]}" >> test_2606.txt
                                ((fail3=fail3+1))
                        fi
                        #if [ $diff_val2 > 0 ];then
                        if fcomp 0 $diff_val2; then
                                echo "          $diff_val2 > 0; OK" >> test_2606.txt
                        else
                                echo "          $diff_val2 < 0;bug remaining, ${slope[$j2]} has less radiance than ${slope[$j3]}" >> test_2606.txt
                                ((fail4=fail4+1))
                        fi
                done
        done
        wait
done
wait
echo "e-w test fail:$fail1 of $count1;  south test fail:$fail2 of $count2" >> test_2606.txt
echo "e-w test fail:$fail1 of $count1;  south test fail:$fail2 of $count2"
echo "values for slope 70 and 80 fail:$fail3 of $count3;        values for slope 80 and 90 fail:$fail4 of $count3" >> test_2606.txt
echo "values for slope 70 and 80 fail:$fail3 of $count3;        values for slope 80 and 90 fail:$fail4 of $count3"



comment:5 Changed 4 years ago by neteler

Milestone: 7.0.17.0.2

Ticket retargeted after 7.0.1 milestone closed

comment:6 Changed 4 years ago by neteler

Milestone: 7.0.27.0.3

Ticket retargeted after milestone closed

comment:7 Changed 4 years ago by neteler

Milestone: 7.0.3

Ticket retargeted after milestone closed

comment:8 Changed 4 years ago by neteler

Milestone: 7.0.4

Ticket retargeted after 7.0.3 milestone closed

comment:9 Changed 3 years ago by martinl

Milestone: 7.0.47.0.5

comment:10 Changed 3 years ago by neteler

Milestone: 7.0.57.0.6

comment:11 Changed 19 months ago by neteler

Milestone: 7.0.67.0.7

comment:12 Changed 5 months ago by martinl

Still relevant?

comment:13 Changed 5 months ago by neteler

Milestone: 7.0.77.4.5

see also #498

Note: See TracTickets for help on using tickets.