bin/epw2wea.pl
author Axel Jacobs <axel@jaloxa.eu>
Tue, 08 Apr 2014 22:56:02 +0100
changeset 65 f10a54c3213d
parent 49 66e192fe711e
permissions -rwxr-xr-x
ltpict: IES input works now
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
49
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
     1
#!/usr/bin/perl
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
     2
#
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
     3
# Convert EnergyPlus EPW weather file to DaySim wea format or CSV
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
     4
#
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
     5
# Axel Jacobs, 15 Dec 2013
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
     6
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
     7
use strict;
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
     8
use warnings;
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
     9
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    10
my $output;           # Default output is to STDOUT
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    11
my $csv = 0;          # Output CSV file, not DaySim wea format
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    12
my $delimiter = ' ';  # Delimiter. Default is ' ' which is for DaySim wea
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    13
my $delim = ' ';
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    14
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    15
while (@ARGV) {
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    16
	$_ = $ARGV[0];
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    17
	if (m/-o/) {         # Output file. Default is STDOUT
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    18
		$output = $ARGV[1];
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    19
		shift @ARGV;
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    20
	} elsif (m/-c/) {    # Output CSV file, not DaySim wea format
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    21
		$csv = 1;
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    22
	} elsif (m/-d/) {    # Delimiter for CSV output
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    23
		$delim = $ARGV[1];
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    24
		shift @ARGV;
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    25
	} elsif (m/^-\w/) {
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    26
		die("epw2wea: Bad option: $_\n");
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    27
	} else {
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    28
		last;
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    29
	}
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    30
	shift @ARGV;
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    31
}
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    32
if ($csv == 1) {
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    33
	$delimiter = $delim;     # Delimiter for CSV output
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    34
}
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    35
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    36
if ($output) {
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    37
   open(OUTPUT, '>', $output)
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    38
			or die("Cannot open file '$output' for writing: $!\n");
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    39
} else {
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    40
   *OUTPUT = *STDOUT;
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    41
}
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    42
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    43
# Extract latitude, longitude etc from first input line
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    44
my $line = <>;
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    45
#$line =~ s/\r//;    # Remove DOS line ending
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    46
chomp $line;
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    47
my @fields = split(/,/, $line);
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    48
my $city = $fields[1];
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    49
my $country = $fields[3];
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    50
my $lat = $fields[6];
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    51
my $lon = -1 * $fields[7];
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    52
my $mer = -15 * $fields[8];
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    53
my $ele = $fields[9];
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    54
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    55
if ($csv == 1) {
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    56
	my @epw_header = ('Year', 'Month', 'Day', 'Hour', 'Minute',
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    57
			'Uncertainty', 'DryBulb', 'DewPoint', 'RelHum', 'Press',
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    58
			'Ees0', 'Eesn0', 'Eird', 'Eeg', 'Eesn', 'Eed',
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    59
			'Evg', 'Evsn', 'Evd', 'Lz',
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    60
			'WindDir', 'WindSpeed',
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    61
			'TotalSkyCover', 'OpaqueSkyCover', 'Visibility', 'Ceiling',
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    62
			'PresentObs', 'PresentCode',
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    63
			'PrecWater', 'AerosolOpticalDepth', 'SnowDepth', 'LastSnowfall'
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    64
	);
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    65
	print OUTPUT join($delimiter, @epw_header) . "\n";
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    66
} else {
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    67
	print OUTPUT <<EndOfHeader;
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    68
place ${city}_$country
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    69
latitude $lat
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    70
longitude $lon
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    71
time_zone $mer
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    72
site_elevation $ele
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    73
weather_data_file_units 1
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    74
EndOfHeader
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    75
}
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    76
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    77
# Get rid of remaining header rows
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    78
for (my $i = 7; $i >= 1; $i--) {
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    79
	$line = <>;
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    80
}
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    81
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    82
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    83
# Process body
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    84
while (<>) {
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    85
	my $line = $_;
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    86
	$line =~ s/\r//g;    # Remove DOS line ending
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    87
	chomp $line;
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    88
	@fields = split(/,/, $line);
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    89
	my $month = $fields[1];
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    90
	my $day   = $fields[2];
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    91
	my $hour  = $fields[3];
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    92
	my $hour2 = sprintf '%.3f', $hour - .5;
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    93
	# Ignore minute column.
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    94
	my $Eeg   = $fields[13];
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    95
	my $Eesn  = $fields[14];
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    96
	my $Eed   = $fields[15];
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    97
	my $Evg   = $fields[16];
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    98
	my $Evsn  = $fields[17];
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
    99
	my $Evd   = $fields[18];
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
   100
	my @columns = ();
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
   101
	if ($csv == 1) {
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
   102
		# Output all columns if CSV output is requested
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
   103
		@columns = @fields;
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
   104
	} else {
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
   105
		# Only output the columns relevant to DaySim wea format
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
   106
		@columns = (
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
   107
			$month,
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
   108
			$day,
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
   109
			$hour2,
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
   110
			$Eesn,
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
   111
			$Eed
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
   112
		);
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
   113
	}
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
   114
	print OUTPUT join($delimiter, @columns) . "\n";
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
   115
}
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
   116
close(OUTPUT);
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
   117
66e192fe711e epw2wea: New file converter for EnergyPlus weather to DaySim
Axel Jacobs <axel@jaloxa.eu>
parents:
diff changeset
   118
#EOF