HMS Paramore (1699-1700)¶
in 1699 Edmond Halley was granted a commission as captain in the Royal Navy, and he commanded HMS Paramour on an expedition into the South Atlantic to investigate the variation of the compass. He took with him examples of those two exciting modern scientific instruments: the thermometer and the barometer.
His observations were published by Alexander Dalyrmple, in 1775, as part of A collection of voyages chiefly in the Southern Atlantick Ocean
Transcribed observations¶
Conversion script¶
These thermometer observations pre-date the Farenheit scale, so they are in ideosyncratic units. The conversion here is based on the recommendations given in Middleton - the temperatures should be regarded as very uncertain.
#!/usr/bin/perl
# Process digitised logbook data from the Paramour into
# IMMA records.
use strict;
use warnings;
use IMMA;
use FindBin;
use Date::Calc qw(Add_Delta_Days Delta_Days Delta_DHMS Add_Delta_DHMS);
use IO::File;
use MarineOb::lmrlib
qw(rxltut ixdtnd rxnddt fxtftc fxtrtc fxmmmb fxeimb fwbptc fwbpgv fxbfms ix32dd);
use MarineOb::declination qw(magnetic_to_true);
use MarineOb::WindTerms qw(WordsToBeaufort);
# Load the obs and convert to IMMA
my $Ship_name = 'Paramore';
my $Last_lat = 49;
my $Last_lon = -5;
while ( my $Line = <> ) {
unless ( $Line =~ /^Paramore/ ) { next; }
my $Ob = new IMMA;
$Ob->clear(); # Why is this necessary?
push @{ $Ob->{attachments} }, 0;
my @Fields = split /\t/, $Line;
foreach my $Fi (@Fields) {
if ( $Fi =~ /\.\d*½/ ) { $Fi =~ s/½/5/; }
$Fi =~ s/½/\.5/;
if ( $Fi =~ /\.\d*¼/ ) { $Fi =~ s/¼/25/; }
$Fi =~ s/¼/\.25/;
}
if ( defined( $Fields[1] )
&& $Fields[1] =~ /\d/
&& defined( $Fields[2] )
&& $Fields[2] =~ /\d/
&& defined( $Fields[3] )
&& $Fields[3] =~ /\d/ )
{
$Ob->{YR} = $Fields[1];
$Ob->{MO} = $Fields[2];
$Ob->{DY} = $Fields[3];
# Convert from Julian to Gregorian calendar
if ( $Ob->{YR} == 1700 && $Ob->{MO} == 2 && $Ob->{DY} == 29 ) {
( $Ob->{YR}, $Ob->{MO}, $Ob->{DY} ) =
Add_Delta_Days( $Ob->{YR}, $Ob->{MO}, 28, +11 );
}
elsif (
Delta_Days( $Ob->{YR}, $Ob->{MO}, $Ob->{DY}, 1700, 2, 28 ) <= 0 )
{
( $Ob->{YR}, $Ob->{MO}, $Ob->{DY} ) =
Add_Delta_Days( $Ob->{YR}, $Ob->{MO}, $Ob->{DY}, +11 );
}
else {
( $Ob->{YR}, $Ob->{MO}, $Ob->{DY} ) =
Add_Delta_Days( $Ob->{YR}, $Ob->{MO}, $Ob->{DY}, +10 );
}
}
# Position
if ( defined( $Fields[4] ) && $Fields[4] =~ /\d/ ) {
$Ob->{LAT} = $Fields[4];
if ( defined( $Fields[5] ) && $Fields[5] =~ /\d/ ) {
$Ob->{LAT} += $Fields[5] / 60;
}
if ( defined( $Fields[6] ) && $Fields[6] =~ /[sS]/ ) {
$Ob->{LAT} *= -1;
}
$Last_lat = $Ob->{LAT};
}
if ( defined( $Fields[7] ) && $Fields[7] =~ /(\d+)/ ) {
$Ob->{LON} = $1;
if ( defined( $Fields[8] ) && $Fields[8] =~ /(\d+)/ ) {
$Ob->{LON} += $1 / 60;
}
if ( defined( $Fields[9] ) && $Fields[9] =~ /[wW]/ ) {
$Ob->{LON} *= -1;
}
$Last_lon = $Ob->{LON};
}
# Assume noon
$Ob->{HR} = 12;
# Convert to UTC - lmrlib methods don't work pre 1770
if ( defined($Last_lon)
&& defined( $Ob->{YR} )
&& defined( $Ob->{MO} )
&& defined( $Ob->{DY} ) )
{
my $dhr = int( $Last_lon / 15 );
my $Null = undef;
( $Ob->{YR}, $Ob->{MO}, $Ob->{DY}, $Ob->{HR}, $Null, $Null ) =
Add_Delta_DHMS( $Ob->{YR}, $Ob->{MO}, $Ob->{DY}, $Ob->{HR}, 0, 0, 0,
$dhr, 0, 0 );
}
else { $Ob->{HR} = undef; }
# Pressure converted from inches
if ( defined( $Fields[17] ) && $Fields[17] =~ /\d/ ) {
$Ob->{SLP} = fxeimb( $Fields[17] );
}
# No attached thermometer, so no temperature correction
# Gravity correction
if ( defined( $Ob->{SLP} ) && defined($Last_lat) ) {
$Ob->{SLP} += fwbpgv( $Ob->{SLP}, $Last_lat, 2 );
}
# Middleton suggests Halley's thermometer units were 0.238C
if ( defined( $Fields[16] ) && $Fields[16] =~ /\d/ ) {
$Ob->{AT} = $Fields[16] * 0.238;
# Also suggests 0H=0C, but this is clearly wrong here - assume 0H=-4C
$Ob->{AT} += 4;
}
# Wind force
if ( defined( $Fields[15] ) && $Fields[15] =~ /(\w+)/ ) {
my $WindE = $Fields[15];
my $Force;
if ( $WindE =~ /(\w+)\s+(\w+)/ ) {
$Force = WordsToBeaufort( $1, $2 );
}
else {
$Force = WordsToBeaufort($WindE);
}
if ( defined($Force) ) {
if ( $Force == -1 ) {
warn "Unknown wind force term $Fields[15]";
}
else {
$Ob->{W} = fxbfms($Force); # Beaufort -> m/s
$Ob->{WI} = 5; # Beaufort force
}
}
}
# Wind direction
if ( defined( $Fields[14] ) && $Fields[14] =~ /\S/ ) {
my @F2 = split /[\s\-]+/, $Fields[14];
my $Dirn = $F2[$#F2]; # Last entry - closest to noon
$Dirn =~ s/[bB][yY]*/x/;
$Dirn = sprintf "%-4s", uc($Dirn);
if ( $Dirn eq 'CALM' || $Dirn eq 'CALMS' ) {
$Ob->{D} = 361;
}
else {
( $Ob->{D}, undef ) = ix32dd($Dirn);
if ( defined( $Ob->{D} ) ) {
$Ob->{DI} = 1; # 32-point compass
}
else {
warn "Unknown wind direction $Dirn - $Fields[14]";
}
}
}
# Fill in extra metadata
$Ob->{IM} = 0;
$Ob->{ATTC} = 1; # supd
$Ob->{TI} = 0; # Nearest hour time precision
$Ob->{DS} = undef; # Unknown course
$Ob->{VS} = undef; # Unknown speed
$Ob->{NID} = undef; #
$Ob->{II} = 10; #
$Ob->{ID} = $Ship_name;
$Ob->{C1} = '03'; # UK recruited
if ( defined( $Ob->{AT} )
|| defined( $Ob->{WBT} )
|| defined( $Ob->{DPT} )
|| defined( $Ob->{SST} ) )
{
$Ob->{IT} = undef; # Unknown temp units
}
# Add the original record as a supplemental attachment
push @{ $Ob->{attachments} }, 99;
$Ob->{ATTE} = undef;
chomp($Line);
chop($Line);
$Ob->{SUPD} = $Line;
# Discard obs with no data
unless ( defined( $Ob->{LAT} )
|| defined( $Ob->{LON} )
|| defined( $Ob->{AT} )
|| defined( $Ob->{SLP} )
|| defined( $Ob->{WS} ) )
{
next;
}
$Ob->write( \*STDOUT );
}