sub calculate_anomalies { my $Year; my @Count=(); my @Result=(); my @normals=(); # # zero counters # for ( my $k =0; $k <12; $k++) { for ( my $i = 0 ; $i < 36 ; $i++ ) { for ( my $j = 0 ; $j < 72 ; $j++ ) { $normals[$k][$i][$j] = 0.0; $Count[$k][$i][$j] = 0; } } } for ( my $i = 0 ; $i < scalar(@_) ; $i++ ) { my $Field = $_[$i]; if ( $Field->{month} != 1 && !defined($Year) ) { next; } # if ( $Field->{month} == 1 ) { $Year = dclone($Field); # @Count = undef; for ( my $i = 0 ; $i < $Year->{rows} ; $i++ ) { for ( my $j = 0 ; $j < $Year->{columns} ; $j++ ) { if ( ${ $Year->{data} }[$i][$j] == $Year->{missing} ) { next; } my $l = $Year->{month}-1; # print $l." \n"; if (defined($Year->{data}[$i][$j])) { $normals[$l][$i][$j] = $normals[$l][$i][$j]+$Year->{data}[$i][$j]; $Count[$l][$i][$j]++; } } } } for ( my $k =0; $k <12; $k++) { for ( my $i =0; $i <36; $i++) { for (my $j=0; $j<72; $j++) { # if (!defined($Count[$k][$i][$j])) { $Count[$k][$i][$j] = 0;} if ($Count[$k][$i][$j] > 0) { $normals[$k][$i][$j] = $normals[$k][$i][$j]/$Count[$k][$i][$j]; } else { $normals[$k][$i][$j] = 0; } # print $normals[$k][$i][$j],' '; } } } for ( my $i = 0 ; $i < scalar(@_) ; $i++ ) { my $Field = $_[$i]; if ( $Field->{month} != 1 && !defined($Year) ) { next; } # $Year = dclone($Field); my $imonth = $Field->{month}-1; for ( my $i = 0 ; $i < $Field->{rows} ; $i++ ) { for ( my $j = 0 ; $j < $Field->{columns} ; $j++ ) { if ( ${ $Field->{data} }[$i][$j] == $Field->{missing} ) { next; } $Field->{data}[$i][$j] = $Field->{data}[$i][$j] - $normals[$imonth][$i][$j]; } } push @Result, $Field; } return @Result; }