libconv.pl
author A.M. Thurnherr <athurnherr@yahoo.com>
Tue, 07 Jun 2022 23:15:42 -0400
changeset 47 dde46143288c
parent 38 15c603bc4f70
child 50 4b59a02e6518
permissions -rw-r--r--
before 2022 P2 cruise
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     1
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     2
#                    L I B C O N V . P L 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     3
#                    doc: Sat Dec  4 13:03:49 1999
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
     4
#                    dlm: Wed Apr  6 18:41:02 2022
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     5
#                    (c) 1999 A.M. Thurnherr
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
     6
#                    uE-Info: 73 59 NIL 0 0 70 2 2 4 NIL ofnI
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     7
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     8
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     9
# HISTORY:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    10
#   Dec 12, 1999: - created for the Rainbow CM data as libdate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    11
#   Jul 07, 2000: - renamed to libconv and added lat/lon conversions
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    12
#   Aug 21, 2000: - added &s2d()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    13
#   Aug 24, 2000: - added &DDMMXh2d() and &DDDMMXh2d()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    14
#   Aug 28, 2000: - moved &DDMMXh2d() and &DDDMMXh2d() to [libNODC.pl]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    15
#   Sep 04, 2000: - added &GMT2d()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    16
#   Sep 20, 2000: - added &fmtdate(), &fmttime()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    17
#   Oct 16, 2000: - added &dmsh2d()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    18
#   Oct 31, 2000: - added &T90(), &T68()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    19
#   Jan 22, 2001: - BUG: &GMT2d() wrongly +ve-ized stuff like -00:05
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    20
#   Feb 28, 2001: - added &O2mlpl2umpkg()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    21
#   Aug  3, 2001: - made &O2mlpl2umpkg() return NaN on -ve input
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    22
#   Aug  7, 2001: - added &O2umpkg2mlpl()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    23
#                 - replaced temp_scale by ITS
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    24
#   Aug  8, 2001: - BUG: allowed for NaN O2 values
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    25
#   Aug 19, 2001: - change temp-conversions to allow nop; changed names
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    26
#   Sep  1, 2001: - BUG: allow for nan in addition to NaN
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    27
#	Dec 30, 2001: - generalized s2d()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    28
#				  - BUG: allow NaNs on temp conversions
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    29
#	Feb  4, 2002: - allow for -ve O2 values in conversions to handle offsets
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    30
#	Aug 14, 2002: - moved ITS checks in ITS_68() & ITS_90()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    31
#	Oct  9, 2002: - added &fmttime1(),&fmtdate1()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    32
#	Jan 23, 2003: - added more time conversion routines
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    33
#	Apr 14, 2003: - removed antsReplaceParam() call
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    34
#	May 21, 2004: - added ``-'' as a valid date separator
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    35
#	Jun 22, 2004: - added HSV2RGB()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    36
#	Jun 27, 2004: - renamed degree-conversion routines
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    37
#				  - added wraplon()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
#	Dec  1, 2005: - cosmetics
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
#	Dec  9, 2005: - Version 3.2 [HISTORY]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
#	Apr  4, 2006: - made epoch optional in &dayNo()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
#	Apr 28, 2006: - added &dn2date()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    42
#   Jul  1, 2006: - Version 3.3 [HISTORY]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    43
#	Nov  9, 2006: - added dec_time()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
#				  - added dn2date_time()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    45
#				  - moved year forward in dn2date()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    46
#	Oct 17, 2007: - dn2date -> Date
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    47
#				  - dn2date_time -> Time
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    48
#				  - adapted Date/Time to antsFunUsage() with default fields
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
#	Oct 19, 2007: - removed antsFunUsage() from non-UI funs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
#	Nov 17, 2007: - added "." as another legal date separator
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
#	Jul 10, 2008: - added support for month names in dayNo()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    52
#	Dec  1, 2008: - added dec_time_long()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    53
#	Dec  3, 2008: - renamed many of the date-conversion routines
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    54
#				  - added frac_day()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    55
#	Jan  8, 2009: - BUG: &Date() returned wrong date for any time after
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    56
#						 midnite on last day of a month
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    57
#	Oct 27, 2010: - added &day_secs()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    58
#	Jan  3, 2010: - extended frac_day() to allow a single string time-spec
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    59
#	Jul 19, 2011: - made epoch aptional in mmddyy2dec_time()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    60
#	Aug  2, 2011: - enhanced yymmdd2dec_time()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    61
#	Apr 17, 2012: - added space as another date separator in ddmmyy2dec_time
1
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    62
#	May 22, 2012: - BUG: illegal time spec error was also produced on missing seconds
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    63
#				  - BUG: mmddyy2dec_time() did not allow for optional epoch argument
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    64
#	Aug  7, 2014: - finally cleaned up date conversions
33
f891ea33a728 after Hamburg visit
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 30
diff changeset
    65
#	Jan 27, 2017: - BUG: dayNo() numeric month could have leading/trailing whitespace
f891ea33a728 after Hamburg visit
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 30
diff changeset
    66
#	Jul  6, 2017: - BUG: date conversion routines did not parse 1/5/12 correctly
35
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 33
diff changeset
    67
#	Dec 18, 2017: - removed ambiguous-date warning
36
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    68
#	May 22, 2018: - added NMEA2dec_time()
38
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
    69
#	Jan 17, 2019: - added ISO_Datetime()
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
    70
#	Feb 15, 2019: - added deg2lat, deg2lon
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
    71
#	Aug 27, 2021: - improved Date to take dn from %PARAMs
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
    72
#	Nov 15, 2021: - modified O2 coversion routines to return nan on missing press, temp, salin
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
    73
#	Apr  6, 2022: - made =Date work with %dn params as well
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
    74
# HISTORY END
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    75
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    76
require "$ANTS/libEOS83.pl";                        # &sigma()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    77
require "$ANTS/libPOSIX.pl";                        # &floor()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    78
require "$ANTS/libstats.pl";                        # &min(),&max()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    79
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    80
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    81
# Date Conversion
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    82
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    83
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    84
sub leapYearP(@)                                    # leap year?
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    85
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    86
    my($y) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    87
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    88
    $y += ($y < 50) ? 2000 : 1900 if ($y < 100);    # Y2K
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    89
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    90
    return 0 if ($y%4 != 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    91
    return 1 if ($y%100 != 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    92
    return 0 if ($y%400 > 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    93
    return 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    94
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    95
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    96
sub monthLength(@)                                  # #days in given month/year
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    97
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    98
    my($y,$m) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    99
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   100
    return 31 if ($m==1 || $m==3 || $m==5 || $m==7 ||
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   101
                  $m==8 || $m==10 || $m==12);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   102
    return 30 if ($m==4 || $m==6 || $m==9 || $m==11);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   103
    return 28 + &leapYearP($y) if ($m == 2);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   104
    croak("$0: &monthLength(): Illegal month\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   105
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   106
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   107
sub dayNo(@)										# day number, starting at 1
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   108
{
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   109
    my($y,$m,$d,$epoch) =
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   110
        &antsFunUsage(-3,"c..","year, month, day[, epoch]",@_);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   111
	$epoch = $y unless defined($epoch);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   112
30
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 13
diff changeset
   113
	$m =~ s/\s//g;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 13
diff changeset
   114
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   115
	unless (cardinalp($m)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   116
		$m = lc($m);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   117
		if    ($m =~ /^jan/) { $m = 1; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   118
		elsif ($m =~ /^feb/) { $m = 2; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   119
		elsif ($m =~ /^mar/) { $m = 3; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   120
		elsif ($m =~ /^apr/) { $m = 4; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   121
		elsif ($m =~ /^may/) { $m = 5; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   122
		elsif ($m =~ /^jun/) { $m = 6; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   123
		elsif ($m =~ /^jul/) { $m = 7; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   124
		elsif ($m =~ /^aug/) { $m = 8; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   125
		elsif ($m =~ /^sep/) { $m = 9; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   126
		elsif ($m =~ /^oct/) { $m = 10; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   127
		elsif ($m =~ /^nov/) { $m = 11; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   128
		elsif ($m =~ /^dec/) { $m = 12; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   129
		else { croak("$0: unknown month $m\n"); }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   130
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   131
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   132
    my($dn) = 0;        
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   133
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   134
    $epoch += ($epoch < 50) ? 2000 : 1900           # Y2K       
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   135
        if ($epoch < 100);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   136
    $y += ($y < 50) ? 2000 : 1900
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   137
        if ($y < 100);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   138
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   139
    croak("$0: &dayNo(): Error: epoch > year\n")        # only positive times
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   140
        if ($y < $epoch);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   141
    while ($epoch < $y) {                           # entire years
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   142
        $dn += 365 + &leapYearP($epoch);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   143
        $epoch++;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   144
    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   145
    
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   146
    croak("$0: &dayNo(): Error: day > #days of month\n")    # current month
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   147
        if ($d > &monthLength($y,$m));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   148
    $dn += $d;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   149
    $m--;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   150
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   151
    while ($m > 0) {                                # current year
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   152
        $dn += &monthLength($y,$m);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   153
        $m--;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   154
    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   155
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   156
    return $dn
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   157
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   158
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   159
sub frac_day(@)										# fractional day
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   160
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   161
	my($h,$m,$s);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   162
	if (@_ == 1) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   163
		($h,$m,$s) = split(':',$_[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   164
	} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   165
		($h,$m,$s) = &antsFunUsage(3,'ccf',"<h:m:s>|<hour> <min> <sec>",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   166
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   167
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   168
	croak("$0: &frac_day_long(): illegal time spec $h:$m:$s\n")
1
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   169
		unless ((defined($h) && $h>=0 && $h<24) &&
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   170
				(defined($m) && $m>=0 && $m<60) &&
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   171
				(!defined($s) || ($s>=0 && $s<60)));
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   172
	return $h/24 + $m/24/60 + $s/24/3600;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   173
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   174
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   175
sub day_secs(@)										# seconds since daystart
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   176
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   177
	my($h,$m,$s) = &antsFunUsage(3,'ccf',"<hour> <min> <sec>",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   178
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   179
	croak("$0: &frac_day_long(): illegal time spec $h:$m:$s\n")
1
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   180
		unless ((defined($h) && $h>=0 && $h<24) &&
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   181
				(defined($m) && $m>=0 && $m<60) &&
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   182
				(!defined($s) || ($s>=0 && $s<60)));
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   183
	return $h*3600 + $m*60 + $s;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   184
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   185
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   186
sub dec_time(@)										# decimal time
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   187
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   188
	my($epoch,$yy,$mm,$dd,$h,$m,$s) =
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   189
        &antsFunUsage(7,'ccccccf',"<epoch> <year> <month> <day> <hour> <min> <sec>",@_);
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   190
	return &dayNo($yy,$mm,$dd,$epoch) + &frac_day($h,$m,$s);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   191
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   192
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   193
#----------------------------------------------------------------------
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   194
# String to Decimal Time Conversion
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   195
#----------------------------------------------------------------------
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   196
36
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   197
sub NMEA2dec_time(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   198
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   199
	my($NMEA_string,$epoch) = &antsFunUsage(-1,'.','<NMEA string>[, epoch]',@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   200
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   201
	# Mar 17 2018 01:23:09
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   202
	my($month,$day,$year,$time) = split(/\s+/,$NMEA_string);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   203
	$epoch = $year unless defined($epoch);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   204
	return dayNo($year,$month,$day,$epoch) + frac_day(split(':',$time));
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   205
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   206
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   207
{ my($date_fmt); 
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   208
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   209
	sub str2dec_time(@) 									# heuristic
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   210
	{
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   211
		my($ds,$ts,$epoch) =
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   212
			&antsFunUsage(-2,"..","date, hh:mm[:ss][, epoch]",@_);
30
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 13
diff changeset
   213
		$ds =~ s/\s//g;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 13
diff changeset
   214
		$ts =~ s/\s//g;
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   215
	
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   216
		croak("$0 str2dec_time: date required\n") unless ($ds ne '');
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   217
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   218
		unless (defined($date_fmt)) {
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   219
			my($X,$Y,$Z) = split('[-/\.]',$ds);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   220
			if ($X > 31) {									# YY/MM//DD
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   221
				$date_fmt = 1;							    
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   222
			} elsif ($X > 12) { 							# DD/MM/YY
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   223
				$date_fmt = 2;
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   224
			} elsif ($Y > 12) { 							# MM/DD/YY
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   225
				$date_fmt = 3;
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   226
			} else {
35
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 33
diff changeset
   227
#				&antsInfo("str2dec_time: ambiguous date <$ds>; MM/DD/YY assumed");
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   228
				$date_fmt = 3;
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   229
	        }
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   230
	    }
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   231
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   232
	    if 	  ($date_fmt == 1) { return yymmdd2dec_time($ds,$ts,$epoch); }
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   233
	    elsif ($date_fmt == 2) { return ddmmyy2dec_time($ds,$ts,$epoch); }
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   234
	    else 				   { return mmddyy2dec_time($ds,$ts,$epoch); }
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   235
    }
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   236
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   237
}
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   238
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   239
sub mmddyy2dec_time(@)								
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   240
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   241
	my($ds,$ts,$epoch) =
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   242
        &antsFunUsage(-2,"..","MM/DD/[YY]YY, hh:mm[:ss][, epoch]",@_);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   243
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   244
	my($time) = 0;
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   245
	if ($ds ne '') {
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   246
		my($yy,$mm,$dd);
33
f891ea33a728 after Hamburg visit
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 30
diff changeset
   247
		if (length($ds) == 6 && $ds =~ m{^\d+$}) {
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   248
			$mm = substr($ds,0,2);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   249
			$dd = substr($ds,2,2);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   250
			$yy = substr($ds,4,2);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   251
		} else {
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   252
			($mm,$dd,$yy) = split('[-/\.]',$ds);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   253
		}
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   254
		$time = dayNo($yy,$mm,$dd,$epoch);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   255
	}
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   256
	if ($ts ne '') {
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   257
		my($h,$m,$s) = split(':',$ts);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   258
		$s = 0 unless defined($s);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   259
	    return $time + &frac_day($h,$m,$s);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   260
	}
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   261
	return $time;
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   262
}
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   263
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   264
sub ddmmyy2dec_time(@)
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   265
{
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   266
	my($ds,$ts,$epoch) =
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   267
        &antsFunUsage(-2,"..","DD/MM/[YY]YY, hh:mm[:ss][, epoch]",@_);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   268
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   269
	my($time) = 0;
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   270
	if ($ds ne '') {
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   271
		my($yy,$mm,$dd);
33
f891ea33a728 after Hamburg visit
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 30
diff changeset
   272
		if (length($ds) == 6 && $ds =~ m{^\d+$}) {
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   273
			$dd = substr($ds,0,2);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   274
			$mm = substr($ds,2,2);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   275
			$yy = substr($ds,4,2);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   276
		} else {
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   277
			($dd,$mm,$yy) = split('[-/\.]',$ds);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   278
		}
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   279
		$time = dayNo($yy,$mm,$dd,$epoch);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   280
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   281
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   282
	if ($ts ne '') {
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   283
		my($h,$m,$s) = split(':',$ts);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   284
		$s = 0 unless defined($s);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   285
	    return $time + &frac_day($h,$m,$s);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   286
	}
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   287
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   288
	return $time;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   289
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   290
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   291
sub yymmdd2dec_time(@)								
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   292
{
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   293
	my($ds,$ts,$epoch) =
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   294
        &antsFunUsage(-2,"..","[YY]YY/MM/DD, hh:mm[:ss][, epoch]",@_);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   295
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   296
	my($time) = 0;
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   297
	if ($ds ne '') {								
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   298
		my($yy,$mm,$dd);
33
f891ea33a728 after Hamburg visit
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 30
diff changeset
   299
		if (length($ds) == 6 && $ds =~ m{^\d+$}) {
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   300
			$yy = substr($ds,0,2);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   301
			$mm = substr($ds,2,2);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   302
			$dd = substr($ds,4,2);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   303
		} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   304
			($yy,$mm,$dd) = split('[-/\.]',$ds);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   305
		}
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   306
		$time = dayNo($yy,$mm,$dd,$epoch);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   307
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   308
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   309
	if ($ts ne '') {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   310
		my($h,$m,$s) = split(':',$ts);
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   311
		$s = 0 unless defined($s);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   312
	    return $time + &frac_day($h,$m,$s);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   313
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   314
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   315
	return $time;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   316
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   317
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   318
#----------------------------------------------------------------------
38
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   319
# Decimal Time to String Conversion
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   320
#----------------------------------------------------------------------
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   321
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   322
{ my(@fc);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   323
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   324
	sub Date(@) 										# day number -> date
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   325
	{
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   326
	
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   327
		my($dnf);										# find std dn field & epoch
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   328
		if (@_ == 0) {
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   329
			for (my($i)=0; $i<@antsLayout; $i++) {
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   330
				next unless ($antsLayout[$i] =~ /^dn(\d\d)$/);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   331
				$dnf = $antsLayout[$i]; push(@_,$1);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   332
				last;
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   333
	        }
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   334
	    }
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   335
	    
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   336
	    unless (defined($dnf)) {
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   337
	    	foreach my $p (keys(%P)) {
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   338
	    		next unless ($p =~ /^dn(\d\d)$/);
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   339
	    		$year = ($1 > 70) ? 1900 + $1 : 2000 + $1;
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   340
	    		$day = int($P{$p});
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   341
				while ($day > 365+&leapYearP($year)) {			# adjust year
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   342
					$day -= 365 + &leapYearP($year);
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   343
					$year++;
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   344
		        }
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   345
				my($month) = 1;
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   346
				while ($day > &monthLength($year,$month)) {
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   347
					$day -= &monthLength($year,$month);
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   348
					$month++;
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   349
		        }
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   350
				return sprintf('%04d/%02d/%02d',$year,$month,$day);
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   351
	    	}
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   352
	    }
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   353
	    
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   354
		my($year,$day) = &antsFunUsage(2,"cf","epoch, dayNo",\@fc,undef,$dnf,@_);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   355
	
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   356
		$year += ($year < 50) ? 2000 : 1900 			# Y2K
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   357
			if ($year < 100);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   358
	
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   359
		$day = int($day);								# prevent runover on last day of month
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   360
		while ($day > 365+&leapYearP($year)) {			# adjust year
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   361
			$day -= 365 + &leapYearP($year);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   362
			$year++;
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   363
		}
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   364
	
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   365
		my($month) = 1;
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   366
		while ($day > &monthLength($year,$month)) {
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   367
			$day -= &monthLength($year,$month);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   368
			$month++;
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   369
		}
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   370
	
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   371
		return sprintf('%04d/%02d/%02d',$year,$month,$day);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   372
	}
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   373
}
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   374
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   375
{ my(@fc);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   376
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   377
	sub Time(@) 										# day number -> date/time
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   378
	{
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   379
		my($dnf);										# find standard dn field
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   380
		for (my($i)=0; $i<@antsLayout; $i++) {
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   381
			next unless ($antsLayout[$i] =~ /^dn\d\d$/);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   382
			$dnf = $antsLayout[$i];
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   383
			last;
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   384
		}
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   385
	    
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   386
	    unless (defined($dnf)) {
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   387
	    	foreach my $p (keys(%P)) {
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   388
	    		next unless ($p =~ /^dn(\d\d)$/);
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   389
	    		my($fday) = $P{$p};
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   390
				my($day) = int($fday);
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   391
				$fday -= $day;
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   392
		    
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   393
				my($hour) = int(24*$fday);
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   394
				$fday -= $hour/24;
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   395
				my($min) = int(24*60*$fday);
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   396
				$fday -= $min/24/60;
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   397
				my($sec) = round(24*3600*$fday);
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   398
				$min++,$sec=0 if ($sec == 60);
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   399
				$hour++,$min=0 if ($min == 60);
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   400
				$day++,$hour=0 if ($hour == 24);
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   401
		    
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   402
		        return sprintf('%02d:%02d:%02d',$hour,$min,$sec);
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   403
		    }
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   404
	    }
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   405
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   406
		my($fday) = &antsFunUsage(1,"f","dayNo",\@fc,$dnf,@_);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   407
		my($day) = int($fday);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   408
		$fday -= $day;
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   409
	
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   410
		my($hour) = int(24*$fday);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   411
		$fday -= $hour/24;
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   412
		my($min) = int(24*60*$fday);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   413
		$fday -= $min/24/60;
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   414
		my($sec) = round(24*3600*$fday);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   415
		$min++,$sec=0 if ($sec == 60);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   416
		$hour++,$min=0 if ($min == 60);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   417
		$day++,$hour=0 if ($hour == 24);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   418
	
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   419
		return sprintf('%02d:%02d:%02d',$hour,$min,$sec);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   420
	}
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   421
}
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   422
38
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   423
{ my(@fc);
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   424
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   425
	sub ISO_Datetime(@)									# day number -> ISO 8601
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   426
	{
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   427
	
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   428
		my($dnf);										# find std dn field & epoch
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   429
		if (@_ == 0) {
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   430
			for (my($i)=0; $i<@antsLayout; $i++) {
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   431
				next unless ($antsLayout[$i] =~ /^dn(\d\d)$/);
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   432
				$dnf = $antsLayout[$i]; push(@_,$1);
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   433
				last;
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   434
	        }
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   435
	    }
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   436
	    
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   437
		my($year,$fday) = &antsFunUsage(2,"cf","epoch, dayNo",\@fc,undef,$dnf,@_);
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   438
	
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   439
		$year += ($year < 50) ? 2000 : 1900 			# Y2K
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   440
			if ($year < 100);
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   441
	
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   442
		$day = int($fday);								# prevent runover on last day of month
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   443
		$fday -= $day;
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   444
		
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   445
		while ($day > 365+&leapYearP($year)) {			# adjust year
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   446
			$day -= 365 + &leapYearP($year);
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   447
			$year++;
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   448
		}
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   449
	
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   450
		my($month) = 1;
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   451
		while ($day > &monthLength($year,$month)) {
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   452
			$day -= &monthLength($year,$month);
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   453
			$month++;
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   454
		}
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   455
	
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   456
		my($hour) = int(24*$fday);
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   457
		$fday -= $hour/24;
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   458
		my($min) = int(24*60*$fday);
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   459
		$fday -= $min/24/60;
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   460
		my($sec) = round(24*3600*$fday);
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   461
		$min++,$sec=0 if ($sec == 60);
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   462
		$hour++,$min=0 if ($min == 60);
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   463
		$day++,$hour=0 if ($hour == 24);
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   464
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   465
		return sprintf('%04d-%02d-%02dT%02d:%02d:%02d',$year,$month,$day,$hour,$min,$sec);
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   466
	}
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   467
}
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   468
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   469
#----------------------------------------------------------------------
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   470
# Other Misc Date Conversions
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   471
#----------------------------------------------------------------------
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   472
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   473
sub date2str(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   474
{
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   475
    my($MM,$DD,$YYYY) = &antsFunUsage(3,'ccc','month, day, year',@_);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   476
    $YYYY += 2000 if ($YYYY < 50);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   477
    $YYYY += 1900 if ($YYYY < 100);
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   478
    return sprintf('%02d',$MM) . '/' .
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   479
           sprintf('%02d',$DD) . '/' . $YYYY;
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   480
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   481
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   482
sub card_date2str(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   483
{
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   484
    my($DDMMYY) = &antsFunUsage(1,'c','ddmmyy',@_);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   485
    $DDMMYY = sprintf('%06d',$DDMMYY);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   486
    return &fmtdate(substr($DDMMYY,2,2),substr($DDMMYY,0,2),substr($DDMMYY,4,2));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   487
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   488
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   489
sub time2str(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   490
{
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   491
    my($HH,$MM) = &antsFunUsage(2,'cc','hr, min',@_);
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   492
    return sprintf('%02d',$HH) . ':' . sprintf('%02d',$MM);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   493
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   494
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   495
sub card_time2str(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   496
{
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   497
    my($HHMM) = &antsFunUsage(1,'c','hrmin',@_);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   498
    return &fmttime(int($HHMM/100),$HHMM%100);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   499
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   500
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   501
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   502
# Lat/Lon Conversion
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   503
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   504
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   505
sub wraplon(@)		# get sign of longitudes right
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   506
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   507
	my($deg) = &antsFunUsage(1,'f','deg',@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   508
	return ($deg > 180) ? $deg - 360 : $deg;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   509
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   510
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   511
sub dmh2deg(@)		# dd mm.m NSEW -> dd.d
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   512
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   513
    my($deg,$min,$hemisph) =
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   514
        &antsFunUsage(3,'ff1','deg, min, hemisphere',@_);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   515
    croak("$0 dmh2d(): <deg> may not be -ve\n") if ($deg < 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   516
    croak("$0 dmh2d(): <min> may not be -ve\n") if ($min < 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   517
    $deg += $min/60;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   518
    $_ = $hemisph;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   519
    SWITCH: {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   520
        $deg = -$deg, last SWITCH if (/[sSwW]/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   521
        last SWITCH if (/[nNeE]/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   522
        croak("$0 dmh2d(): $hemisph is an invalid hemisphere id\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   523
    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   524
    return $deg;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   525
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   526
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   527
sub dmsh2deg(@)   # dd mm ss NSEW -> dd.d
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   528
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   529
    my($deg,$min,$sec,$hemisph) =
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   530
        &antsFunUsage(4,'fff1','deg, min, sec, hemisphere',@_);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   531
    croak("$0 dmsh2d(): <deg> may not be -ve\n") if ($deg < 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   532
    croak("$0 dmsh2d(): <min> may not be -ve\n") if ($min < 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   533
    croak("$0 dmsh2d(): <sec> may not be -ve\n") if ($sec < 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   534
    $deg += $min/60 + $sec/3600;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   535
    $_ = $hemisph;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   536
    SWITCH: {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   537
        $deg = -$deg, last SWITCH if (/[sSwW]/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   538
        last SWITCH if (/[nNeE]/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   539
        croak("$0 dmh2d(): $hemisph is an invalid hemisphere id\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   540
    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   541
    return $deg;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   542
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   543
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   544
sub str2deg(@)      # string containing dd [mm.m] [NSEW] -> dd.d
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   545
{
13
bdd925186562 laptop version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
   546
    my($s) = &antsFunUsage(1,'.',"'deg[ :][min][ ]hemisphere'",@_);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   547
    my($deg,$a,$b) = ($s =~ m{^([-\d]+)[\s:]([\d\.]+)\s*([NSEW])$});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   548
#    print(STDERR "--> $deg, $a, $b\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   549
	return ($b eq "") ? &dmh2d($deg,0,$a) : &dmh2d($deg,$a,$b);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   550
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   551
38
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   552
sub GMT2deg(@)	    # GMT degree format to decimal
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   553
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   554
	my($GMT) = &antsFunUsage(1,".","GMT-degs ",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   555
	return (substr($1,0,1) eq "-") ? $1-$2/60.0 : $1+$2/60.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   556
		if ($GMT =~ /\s*([^:]+):([^:]+)/);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   557
	return $GMT;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   558
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   559
38
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   560
sub deg2lat(@)		# decimal latitude to degrees:min.xx NS
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   561
{
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   562
	my($deg) = &antsFunUsage(1,'f','decimal latitude',@_);
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   563
	return sprintf("%02d:%06.3f'%s",abs(int($deg)),
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   564
								 (abs($deg)-abs(int($deg)))*60,
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   565
	   							 $deg>=0 ? "N" : "S");
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   566
}
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   567
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   568
sub deg2lon(@)		# decimal longitude to degrees:min.xx EW
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   569
{
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   570
	my($deg) = &antsFunUsage(1,'f','decimal longitude',@_);
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   571
	return sprintf("%03d:%06.3f'%s",abs(int($deg)),
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   572
								 (abs($deg)-abs(int($deg)))*60,
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   573
	   							 $deg>=0 ? "E" : "W");
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   574
}
15c603bc4f70 after UK cruise
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 36
diff changeset
   575
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   576
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   577
# Temp-Scale Conversion
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   578
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   579
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   580
{ my($ITS);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   581
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   582
sub ITS_68(@)		  # T90|T68 -> T68
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   583
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   584
	unless (defined($ITS)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   585
		$ITS = &antsRequireParam('ITS');
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   586
		croak("$0 ITS_68(): ITS == $ITS???\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   587
			unless ($ITS == 68 || $ITS ==90);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   588
		unless ($ITS == 68)	{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   589
			croak("$0 ITS_68(): can't change %ITS after flushing header\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   590
				if ($antsHeadersPrinted);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   591
			&antsAddParams('ITS',68);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   592
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   593
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   594
	my($temp) = &antsFunUsage(1,".","temp",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   595
	return nan unless (numberp($temp));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   596
	return($temp) if ($ITS == 68);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   597
    return $temp * 1.00024;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   598
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   599
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   600
} # static scope
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   601
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   602
{ my($ITS);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   603
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   604
sub ITS_90(@)		  # T90|T68 -> T90
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   605
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   606
	unless (defined($ITS)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   607
		$ITS = &antsRequireParam('ITS');
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   608
		croak("$0 ITS_90(): ITS == $ITS???\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   609
			unless ($ITS == 68 || $ITS ==90);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   610
		unless ($ITS == 90)	{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   611
			croak("$0 ITS_90(): can't change %ITS after flushing header\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   612
				if ($antsHeadersPrinted);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   613
			&antsAddParams('ITS',90);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   614
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   615
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   616
	my($temp) = &antsFunUsage(1,".","temp",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   617
	return nan unless (numberp($temp));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   618
	return($temp) if ($ITS == 90);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   619
	return $temp / 1.00024;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   620
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   621
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   622
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   623
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   624
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   625
# Oxygen Unit Conversion
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   626
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   627
# - old units (e.g. sd2) are ml/l
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   628
# - new units (e.g. WOCE) are umol/kg => independent of pressure!
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   629
# - conversion (from [http://sea-mat.whoi.edu/robbins/ox_units.m]; Paul
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   630
#	Robbins) uses potential density ref'd to surface --- makes sense
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   631
#	because titration is presumably done at atmospheric pressure
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   632
# - constant divisor is volume of one mole derived from gas law
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   633
#   (PV = nRT) in the right units (whatever)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   634
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   635
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   636
{ my(@fc);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   637
	sub O2mlpl2umpkg(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   638
	{
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   639
#		return nan if isnan($_[3]);
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   640
		return nan
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   641
			if (@_ == 4 && !numberp($_[0]+$_[1]+$_[2]+$_[3]));
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   642
		my($S,$T,$P,$mlpl) =
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   643
			&antsFunUsage(4,'ffff','[S, T, P [dbar], O2 [ml/l]]',
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   644
						  \@fc,'salin','temp','press','O2',@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   645
		return $mlpl * 1000/(1000+sigma($S,$T,$P,0)) / .022403;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   646
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   647
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   648
		
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   649
{ my(@fc);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   650
	sub O2umpkg2mlpl(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   651
	{
47
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   652
#		return nan if isnan($_[3]);
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   653
		return nan
dde46143288c before 2022 P2 cruise
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 38
diff changeset
   654
			if (@_ == 4 && !numberp($_[0]+$_[1]+$_[2]+$_[3]));
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   655
		my($S,$T,$P,$umpkg) =
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   656
			&antsFunUsage(4,'ffff','[S, T, P [dbar], O2 [ml/l]]',
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   657
						  \@fc,'salin','temp','press','O2',@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   658
		return .022403 * $umpkg * (1000+sigma($S,$T,$P,0))/1000;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   659
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   660
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   661
		
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   662
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   663
# Color Conversion
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   664
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   665
# - algorithms taken from the web; source given alternatively as ACM 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   666
#	and Foley and VanDam
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   667
# - from the available GMT default cpt files, it looks like
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   668
#	the range for hue is 0 - 359 (angles on a circle)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   669
# - ACM implementation uses a hue range of 0-6 with pure red being 0 or 6
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   670
# - ACM implementation uses range of 0-1 for R,G,B
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   671
# - in HSV, gray scales are not uniquely defined; I extended the 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   672
#   algorithms to behave like matlab in this case, i.e. return a hue of
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   673
#	pure red (0)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   674
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   675
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   676
sub HSV2RGB(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   677
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   678
    my($H,$S,$V) = &antsFunUsage(3,"fff","H (0-360), S (0-1), V (0-1), ",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   679
	my($m,$n,$f,$i);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   680
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   681
	$H = 0 if ($H < 0 && $H >= -$PRACTICALLY_ZERO);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   682
	croak("$0 HSV2RGB(): H=$H out of range\n") if ($H < 0 || $H > 360);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   683
	croak("$0 HSV2RGB(): S=$S out of range\n") if ($S < 0 || $S > 1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   684
	croak("$0 HSV2RGB(): V=$V out of range\n") if ($V < 0 || $V > 1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   685
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   686
	$i = POSIX::floor($H/60);	# ACM implementation uses [0-6] with red = 0 = 6
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   687
	$f = $H/60 - $i;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   688
	$f = 1 - $f if (!($i & 1));	# if i is even
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   689
	$m = $V * (1 - $S);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   690
	$n = $V * (1 - $S * $f);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   691
	return (int(255*$V+0.5),int(255*$n+0.5),int(255*$m+0.5)) if ($i==0 || $i==6);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   692
	return (int(255*$n+0.5),int(255*$V+0.5),int(255*$m+0.5)) if ($i == 1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   693
	return (int(255*$m+0.5),int(255*$V+0.5),int(255*$n+0.5)) if ($i == 2);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   694
	return (int(255*$m+0.5),int(255*$n+0.5),int(255*$V+0.5)) if ($i == 3);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   695
	return (int(255*$n+0.5),int(255*$m+0.5),int(255*$V+0.5)) if ($i == 4);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   696
	return (int(255*$V+0.5),int(255*$m+0.5),int(255*$n+0.5)) if ($i == 5);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   697
	croak("$0 HSV2RGB(): implementation error");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   698
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   699
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   700
sub RGB2HSV(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   701
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   702
	my($R,$G,$B) = &antsFunUsage(3,"cc","R, G, B",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   703
	my($V,$x,$f,$i,$H);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   704
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   705
	$R /= 255; $G /= 255; $B /= 255;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   706
	croak("$0 RGB2HSV(): R out of range\n") if ($R < 0 || $R > 1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   707
	croak("$0 RGB2HSV(): G out of range\n") if ($G < 0 || $G > 1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   708
	croak("$0 RGB2HSV(): B out of range\n") if ($B < 0 || $B > 1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   709
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   710
	$x = min($R,$G,$B);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   711
	$V = max($R,$G,$B);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   712
	return (0,0,$V) if ($V == $x);	# any hue is valid
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   713
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   714
	$f = ($R == $x) ? $G - $B : (($G == $x) ? $B - $R : $R - $G);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   715
	$i = ($R == $x) ? 3 : (($G == $x) ? 5 : 1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   716
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   717
	$H = 60 * ($i - $f / ($V - $x));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   718
	$H = 0 if ($H == 360);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   719
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   720
	return ($H, ($V - $x)/$V, $V);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   721
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   722
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   723
1;