function:RenderSidePart pageleftbodycaption pageleftbody sidenote Main.Astronomy-SideNote Main.SideNote Site.SideNote

# moonset.php5

<?php
class MiniMoon
{
public $time=0; public$RA=0;
public $dec=0; public function __construct($t){

$this->setTime($t);
}
public function setTime($t){$P2=2*pi();
$cosEPS=0.91748;// cos(obliquity ecliptic)$sinEPS=0.39778;// sin(obliquity ecliptic)
$arc = 206264.8062;$this->time = $t; // mean elements of lunar orbit$l0 = frac(0.606433+1336.855225*$t); // mean longitude of moon in rev$l = $P2*frac(0.374897+1325.552410*$t);	// mean anomaly of the Moon
$ls =$P2*frac(0.993133+99.997361*$t); // mean anomaly of the Sun$d = $P2*frac(0.827361+1236.853086*$t);	// diff longitude Moon-Sun
$f =$P2*frac(0.259086+1342.227825*$t); // mean argument of latitude$dl = 22640*sin($l) - 4586*sin($l-2*$d) + 2370* sin(2*$d) + 769*sin(2*$l) -668*sin($ls) - 412*sin(2*$f) - 212*sin(2*$l-2*$d) - 206*sin($l+$ls-2*$d) + 192*sin($l+2*$d) - 165*sin($ls-2*$d) - 125*sin($d) - 110*sin($l+$ls) + 148*sin($l-$ls) -55*sin(2*$f-2*$d);$s = $f + ($dl+412*sin(2*$f)+541*sin($ls))/$arc;$h = $f-2*$d;
$n = -516*sin($h) + 44*sin($l+$h) - 31*sin($h-$l) - 23*sin($ls+$h) +11*sin($h-$ls) - 25*sin($f-2*$l) + 21*sin($f-$l);
$bMoon = (18520.0*sin($s) + $n) /$arc;  	// in radians
$lMoon =$P2 * frac( $l0 +$dl/1296E3) ;		// in radians
//echo "bMoon=".$bMoon." lMoon=".$lMoon."<br>";
// equatorial coords
$cb = cos($bMoon);
$x =$cb*cos($lMoon);$v = $cb*sin($lMoon);
$w = sin($bMoon);
$y =$cosEPS*$v-$sinEPS*$w;$z = $sinEPS*$v+$cosEPS*$w;
$rho = sqrt(1.0-$z*$z); //echo "rho=".$rho." z*z=".sqrt(1.0-$z*$z)."<br>";
$this->dec = (360.0/$P2)*atan($z/$rho);
$r = (48.0/$P2)*atan($y/($x+$rho)); //echo "sinEPS=".$sinEPS."<br>";
if ($r<0)$r=$r+24; if ($r>24) $r=$r-24;
$this->RA =$r;
}
}
public $nz;//number of roots public$z1;
public $z2;//the roots public$xe; // x extreme
public $ye; // y extreme public function __construct($yMinus, $y0,$yPlus){
$this->nz=0;$this->z1=0;
$this->z2=0;$c = $y0;$a = 0.5*($yPlus+$yMinus)-$c;$b = 0.5*($yPlus-$yMinus);
$this->xe = -1*$b/(2.0*$a);$this->ye = ($a*$this->xe*$this->xe)+ ($b * $this->xe) +$c;
$discriminant =$b*$b - (4.0*$a*$c); if ($discriminant >=0) { //parabola above x axis
$dx = .5*sqrt($discriminant)/abs($a);$this->z1=$this->xe-$dx;
$this->z2=$this->xe+$dx; if (abs($this->z1)<= 1.0) $this->nz++; if (abs($this->z2)<= 1.0) $this->nz++; if ($this->z1 < -1.0) $this->z1=$this->z2;

}
}
}
class moonRiseSet
{
public $risesAt="-------"; public$setsAt="-------";
public function __construct($year,$month, $day,$longitude, $latitude,$timeZone)
{
$datum=mjd($year,$month,$day)-$timeZone/24.0;$sphi=sinD($latitude);$cphi=cosD($latitude);$hour=1.0;
$angSize=(8.0/60.0)*pi()/180.0; //echo "datum=".$datum."<br>";
$yMinus = sinAltMoon($datum, $hour-1,$longitude, $cphi,$sphi) - sin($angSize); //echo "yMinus=".$yMinus."<br>";
$rise = false;$sset = false;
$utRise=0;$utSet=0;
// loop over search   intervals from [0h-2h] to [22h-24h]
// go thru the day, stop if you find both rise and set
while ( ($hour < 25) && !($rise && $sset)){$y0=sinAltMoon( $datum,$hour, $longitude,$cphi, $sphi) - sin($angSize);
$yPlus=sinAltMoon ($datum, $hour+1,$longitude, $cphi,$sphi) - sin($angSize);$x = new Quad($yMinus,$y0,$yPlus); if (($x->nz==1)&&($yMinus < 0)){$utRise= $hour+$x->z1;
$rise = true; } if (($x->nz==1)&&($yMinus >=0)) {$utSet= $hour +$x->z1;
$sset = true; } if (($x->nz==2) &&($x->ye <0)) {$utRise=$hour+$x->z2;
$utSet=$hour+$x->z1;$rise = true;
$sset = true; } if (($x->nz==2) && ($x->ye>=0)){$utRise=$hour+$x->z1;
$utSet=$hour+$x->z2;$rise = true;
$sset = true; }$yMinus = $yPlus;$hour = $hour + 2; }//end of while loop //Now report moon, phase, sun and twilight times for the day if ($rise) {
$this->risesAt=ut2String($utRise);
//echo "utRise=".$utRise."<br>"; } if ($sset) {
$this->setsAt=ut2String($utSet);
}
}
}
function sinAltMoon($mjd0,$hr, $lambda,$cphi, $sphi){$mjd=$mjd0+$hr/24.0;
$t= ($mjd-51544.5)/36525.0;
//echo "lmst=".LMST($mjd,$lambda)."<br>";
$obj=new MiniMoon($t);
$tau = 15.0 * (LMST($mjd, $lambda) -$obj->RA);
//echo "RA=".$obj->RA." dec=".$obj->dec."<br>";
return $sphi*sinD($obj->dec) + $cphi*cosD($obj->dec)*cosD($tau); } function LMST($mjd, $lambda) {$mjd0 = trunc($mjd);$ut= ($mjd-$mjd0)*24;
$t = ($mjd0-51544.5)/36525.0;
$gmst = 6.697374558 + 1.0027379093*$ut + (8640184.812866+(0.093104-0.0000062*$t)*$t)*$t/3600.0; return 24.0*frac(($gmst+$lambda/15.0)/24.0); } function frac($a){
$a1 =$a - trunc($a); if ($a1<0) $a1=$a1+1;
return $a1; } function trunc($t){
if ($t<0) { return ceil($t);
}
return floor($t); } function div($q, $d){ return floor($q/$d); } function modulo($q, $d){ return ($q-$d*floor($q/$d)); } function sinD($a){
return sin(pi()*$a/180.0); } function cosD($a){
return cos(pi()*$a/180.0); } function ut2String($ut){
$result="am"; while($ut<=0){
$ut=$ut+24.0;
}
$h=floor($ut);
$min=round( ($ut-round($ut))*60); while ($min<=0){
$min=$min+60;
}
if ($min==60){$min=0;}
if ($h>11){$result="pm";
}
$h=($h)%12;
if($h==0){$h=12;
}
if ($min>9){$result=$h.":".$min.$result; } else {$result=$h.":0".$min.$result; } return$result;
}
function mjd2String($mjd) {$result="am";
$min=round(24*60*($mjd-floor($mjd)));$h= div($min,60);$min=$min % 60; if ($h > 11)
$result="pm";$h = $h%12; if ($h==0)
$h = 12; if ($min>9) {
$result=$h.":".$min.$result;
} else {
$result=$h.":0".$min.$result;
}
return $result; } function mjd($year, $month,$day)
{
$julianDay=jd($year, $month,$day,0,0,0);
return $julianDay-2400000.5; } function jd($year, $month,$day, $hour,$min, $sec) { return jdn($year, $month,$day)+($hour-12)/24.0+$min/1440.0+$sec/86400.0; } function jdn($year, $month,$day){
$a1=div((14-$month),12);
$y=$year+4800-$a1;$m=$month+12*$a1-3;

return $day+div((153*$m+2),5)+365*$y+div($y,4)-div($y,100)+div($y,400)-32045;
}
function jdUnix($unix){$sinceNoon=($unix-43200)%86400;$jdn= 2440588+($unix-43200)/86400; return$jdn+$sinceNoon/86400.0; } function mjdUnix($unix){
return jdUnix($unix)-2400000.5; } function jdnUnixTime($unix){
$u=$unix-43200;
$days=div($u,86400);
return 2440588+$days; } // diff of 1/1/1970 and new moon of 1/4/2011 9:03 UTC // average lunation is 2551443 seconds function moonAgeDaysUnix($unix){
return round((($unix-1294131780) % 2551443)/86400,2); } function moonAgeDays($year, $month,$day){
$unix=43200+86400*(mjd($year,$month,$day)-mjd(1970,1,1) );
return round((($unix-1294131780) % 2551443)/86400,2); } function moonPhase($mjd){
$t=($mjd-51544.5)/36525.0;
$d = 297.85020420 + 445267.1115168*$t - .00163*$t*$t + $t*$t*$t/545868 -$t*$t*$t*$t/113065000; // Moon's mean elongation$m = 357.5291092 + 35999.0502909*$t - .0001536*$t*$t +$t*$t*$t/24490000; // Sun's mean anomaly
$m1 = 134.9634114 + 477198.8676313*$t + .0089970*$t*$t + $t*$t*$t/69699 -$t*$t*$t*$t/14712000; //Moon's mean anomaly$i= 180 - $d - 6.289*sinD($m1) + 2.1*sinD($m) - 1.274*sinD(2*$d-$m1) - 0.658*sinD(2*$d) - .214*sinD(2*$m1) - .11*sinD($d);
return round(50*(1+cosD($i)),2); } echo "jdn of April 9 , 2011 is (should be 2455661)".jdn(2011,4,9)."<br>"; echo "JD of Noon April 9, 2001 is (2455661.0)".jd(2011,4,9,12,0,0)."<br>"; echo "JDN For April 9, 2011 11:59:59 AM UTC (should be 2455660)".jdnUnixTime(1302350399)."<br>"; echo "MJD of 9/27/1995 should be 49987 is ".mjd(1995,9,27)."<br>"; echo "MJD of 4/9/1995 should be 55660 is ".mjd(2011,4,9)."<br>"; echo "Age of Moon now ".moonAgeDaysUnix(time())." days<br>"; echo "Age of 4/12/2011 ".moonAgeDays(2011,4,12)." days<br>"; echo "Illumination ".moonPhase(mjdUnix(time()))." %<br>"; echo "MJD from unix time ".mjdUnix(time())."<br>"; echo "JD from unix time ".jdUnix(time())."<br>"; echo "1. MJD2 string from unix time ".mjd2String(mjdUnix(time()))."<br>"; echo "2. MJD from unix time should be 8:27 is ".mjd2String(55664.18560)."<br>"; echo "3. 4/13/2011 4:27am utc testing mjd2String : ".mjd2String(2455664.685417-2400000.5)."<br><P>";$m = new moonRiseSet(2011,1,1,-118.2,34.2,-8);
echo "1/1 2011 Moon rise (4:36am rise, 2:37pm set) ".$m->risesAt." set ".$m->setsAt."<br>";
$m = new moonRiseSet(2011,4,13,-118.2,34.2,-8); echo "4/13 2011 Moon rise (1:43pm rise, 2:15pm set PST) ".$m->risesAt." set ".$m->setsAt."<br>";$m = new moonRiseSet(2011,3,24,-118.2,34.2,-8);
echo "3/24 2011 Moon rise (no rise, 9:16am set PST) ".$m->risesAt." set ".$m->setsAt."<br>";
$m = new moonRiseSet(2011,1,11,-118.2,34.2,-8); echo "1/11 2011 Moon rise (10:43pm rise, no set PST) ".$m->risesAt." set ".$m->setsAt."<br>"; for ($i=1;$i<32;$i++){
$m = new moonRiseSet(2011,1,$i,-118.2,34.2,-8);
echo "1/".$i."/2011 ".$m->risesAt."  ".\$m->setsAt."<br>";
}
?>