#----------------------------------------------------------------------- # some constants #----------------------------------------------------------------------- $secsPerDay = 86400; $secsPer5Min = 300; $secsPerTimeStep = 600; #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ # # #////////////////////////////////////////////////////////////////////////////// sub openNc { $ncID = NetCDF::open( $ncFile, NetCDF::WRITE ); @varNames = ("oasisTime", "air", "sst", "temperature", "pressure", "humidity", "windSpeed", "windDir", "windU", "windV", "compass", "vane", "rawDir", "rawSpeed", "ctd_sst", "salt", "transmiss", "fluor"); foreach $var( @varNames ) { $varID = NetCDF::varid( $ncID, $var ); $varID{ $var } = $varID; } $inRecDimID = NetCDF::dimid( $ncID, "oasisTime" ); NetCDF::diminq( $ncID, $inRecDimID, $junk, $ncNumRecs ); } #---openNc---# #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ # # #////////////////////////////////////////////////////////////////////////////// sub setNcOffset { #-------------------------------------------------------------------- # if epoch time is greater than 5 min from current ncTime, # try the next time. # if still greater than 5 min, # do a binary search #-------------------------------------------------------------------- if( abs( $ncTime - $epochSecs ) > $secsPer5Min ) { if( $ncOffset < $ncNumRecs ) { $ncOffset++; @ndx = $ncOffset; NetCDF::varget1($ncID, $varID{"oasisTime"}, \@ndx, $ncTime); } if( abs( $ncTime - $epochSecs ) > $secsPer5Min ) { $ncOffset = findNcOffset( $epochSecs ); } } } #---setNcOffset---# #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ # # #////////////////////////////////////////////////////////////////////////////// sub findNcOffset { my( $secs ) = $_[0]; my( $ndx, @ndx ); my( $lo, $mid, $hi ) = ( 0, 0, $ncNumRecs ); while( $lo <= $hi ) { $mid = int(($lo+$hi)/2); @ndx = $mid; NetCDF::varget1($ncID, $varID{"oasisTime"}, \@ndx, $ncTime); if( $secs < $ncTime ) { $hi = $mid - 1; } elsif( $secs > $ncTime ) { $lo = $mid + 1; } else { last; } } if( $secs == $ncTime ) { $ndx = $mid; } elsif( $secs < $ncTime ) { if( ( $ncTime - $secs) < $secsPer5Min ) { $ndx = $mid; } else { $ndx = $mid-1; } } else { if( ($secs - $ncTime) < $secsPer5Min ) { $ndx = $mid; } else { $ndx = $mid+1; } } $ndx; } #---findOffset---# #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ # # set Epoch seconds for beginning of deployment year # #////////////////////////////////////////////////////////////////////////////// sub setBegYearSecs { my( $yy ) = $_[0]; $holdTime = 0; timegm( 0, 0, 0, 1, 0, $yy ); } #---setBegYearSecs---# #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ # # If we cross a year boundary, increment beginning of year epoch secs # #////////////////////////////////////////////////////////////////////////////// sub checkYearBndy { my( $nextTime ) = @_; if( $nextTime < $holdTime ) { print "Time jump : $holdTime --> $nextTime "; print "... changing year from $yy to ", $yy+1, "\n"; $holdTime = $nextTime; $yy++; timegm( 0, 0, 0, 1, 0, $yy ); } else { $holdTime = $nextTime; $begYearSecs; } } #---checkYearBndy---# #------------------------------------------------------------------------------ # require needs to evaluate a final TRUE statement #------------------------------------------------------------------------------ 1;