source: trunk/UTIL/PYTHON/mcd/proto/martian_time.js @ 812

Last change on this file since 812 was 812, checked in by aslmd, 12 years ago

UTIL PYTHON
MCD interface and online version.

  • corrected a bug introduced recently for fixed / not fixed LT
  • clearer location for the fixed LT / not fixed LT option
  • submitting with a button on the beginner's column automatically reset the form with default values so that no risk to make mistake
  • now the button reset is a real reset. clicking on the Mars panorama also reset
  • display MCD version, coordinates etc... for values-only output
  • the plot is shown on a new window
  • added Ls or julian date in the title (automatic)
  • made the title to be on two lines
  • displayed values on colorbars are now adapted. e.g. if the unit is K then we use the format "%.0f"
  • clearer mention of vertical coordinates on the webpage. removed the possibility for above 3396 km from Mars Center
  • more points on vertical profiles and sections
  • added separator : and rewrote this part of the code so that it is easy to add othe separators
  • added a protection so that slightly negative values from the MCD are set to 0 (apply to mol/mol, kg/kg, kg/m2, W/m2 quantities)
  • better naming for RMS values

TODO (from easier to more difficult i.e. requiring more work)

  • more color palettes
  • fix ugly spacing when asking for 4 sections
  • zonal means
  • alert to user rather than modulo or bounds for time and coordinates
  • Hovmoller plots
  • test to prevent user to use a bad separator (for instance -)
File size: 12.5 KB
Line 
1function DefaultDateValues(){
2
3var rightnow= new Date();
4
5//document.calendar.year.value=2000;
6document.calendar.year.value=rightnow.getFullYear();
7//document.calendar.month.value=1;
8document.calendar.month.value=rightnow.getMonth()+1;
9//document.calendar.day.value=1;
10document.calendar.day.value=rightnow.getDate();
11}
12
13function DefaultTimeValues(){
14
15var rightnow= new Date();
16
17document.calendar.hours.value=rightnow.getUTCHours();
18//document.calendar.hours.value=0;
19document.calendar.minutes.value=rightnow.getUTCMinutes();
20//document.calendar.minutes.value=0;
21document.calendar.seconds.value=rightnow.getUTCSeconds();
22//document.calendar.seconds.value=0;
23}
24
25function DateValues(y,m,d){
26var y;
27var m;
28var d;
29document.calendar.year.value=y;
30document.calendar.month.value=m;
31document.calendar.day.value=d;
32}
33
34function TimeValues(h,m,s){
35var h;
36var m;
37var s;
38document.calendar.hours.value=h;
39document.calendar.minutes.value=m;
40document.calendar.seconds.value=s;
41}
42
43function DateAndTimeValues(year,month,day,hours,minutes,seconds){
44var year,month,day,hours,minutes,seconds;
45DateValues(year,month,day);
46TimeValues(hours,minutes,seconds);
47}
48
49function CheckGivenYear(){
50var bissextil; // bissextil year ? (0==no, 1==yes) (returned value)
51var val=document.calendar.year.value;
52
53while ((val!=Math.round(val))||(val<1583)) {
54  if (val!=Math.round(val)) {
55    val=prompt("Year must be an integer! e.g.:",Math.round(val));
56  }
57  if (val<1583) {
58    val=prompt("Sorry, Year must not be less than 1583 \n (in order to stick to the Gregorian calendar)",1583);
59  }
60}
61
62document.calendar.year.value=val;
63
64// check if it is a bissextil year
65/* a year is bissextil if it is a multiple of 4 but not of 100,
66or if it is a multiple of 400 */
67if ((((val%4)==0)&&((val%100)!=0))||((val%400)==0)) {
68  bissextil=1;
69}
70else {
71  bissextil=0; // not a bissextil year
72}
73
74return bissextil;
75}
76
77function CheckGivenMonth(){
78var val=document.calendar.month.value;
79
80while((val<=0)||(val>12)||(val!=Math.round(val))) {
81 val=prompt("Month must be an integer between 1 and 12!",Math.round(val));
82}
83
84document.calendar.month.value=val;
85}
86
87function CheckGivenDay(year,bissextil,month){
88var year;
89var bissextil; // bissextil year ? (0==no, 1==yes)
90var month;
91var dayval;
92
93dayval=document.calendar.day.value;
94
95if (month==1) {
96  while (((dayval<=0)||(dayval>31))||(dayval!=Math.round(dayval))){
97    dayval=prompt("Invalid day! (must be an integer ranging from 1 to 31)",dayval);
98  }
99}
100if (month==2) {
101  if (bissextil==0){
102    while (((dayval<=0)||(dayval>28))||(dayval!=Math.round(dayval))){
103      dayval=prompt("Invalid day! (must be an integer ranging from 1 to 28)",dayval);
104    }
105  }
106  else {
107    while (((dayval<=0)||(dayval>29))||(dayval!=Math.round(dayval))){
108      dayval=prompt("Invalid day! (must be an integer ranging from 1 to 29)",dayval);
109    }
110  }
111}
112if (month==3) {
113  while (((dayval<=0)||(dayval>31))||(dayval!=Math.round(dayval))){
114    dayval=prompt("Invalid day! (must be an integer ranging from 1 to 31)",dayval);
115  }
116}
117if (month==4) {
118  while (((dayval<=0)||(dayval>30))||(dayval!=Math.round(dayval))){
119    dayval=prompt("Invalid day! (must be an integer ranging from 1 to 30)",dayval);
120  }
121}
122if (month==5) {
123  while (((dayval<=0)||(dayval>31))||(dayval!=Math.round(dayval))){
124    dayval=prompt("Invalid day! (must be an integer ranging from 1 to 31)",dayval);
125  }
126}
127if (month==6) {
128  while (((dayval<=0)||(dayval>30))||(dayval!=Math.round(dayval))){
129    dayval=prompt("Invalid day! (must be an integer ranging from 1 to 30)",dayval);
130  }
131}
132if (month==7) {
133  while (((dayval<=0)||(dayval>31))||(dayval!=Math.round(dayval))){
134    dayval=prompt("Invalid day! (must be an integer ranging from 1 to 31)",dayval);
135  }
136}
137if (month==8) {
138  while (((dayval<=0)||(dayval>31))||(dayval!=Math.round(dayval))){
139    dayval=prompt("Invalid day! (must be an integer ranging from 1 to 31)",dayval);
140  }
141}
142if (month==9) {
143  while (((dayval<=0)||(dayval>30))||(dayval!=Math.round(dayval))){
144    dayval=prompt("Invalid day! (must be an integer ranging from 1 to 30)",dayval);
145  }
146}
147if (month==10) {
148  while (((dayval<=0)||(dayval>31))||(dayval!=Math.round(dayval))){
149    dayval=prompt("Invalid day! (must be an integer ranging from 1 to 31)",dayval);
150  }
151}
152if (month==11) {
153  while (((dayval<=0)||(dayval>30))||(dayval!=Math.round(dayval))){
154    dayval=prompt("Invalid day! (must be an integer ranging from 1 to 30)",dayval);
155  }
156}
157if (month==12) {
158  while (((dayval<=0)||(dayval>31))||(dayval!=Math.round(dayval))){
159    dayval=prompt("Invalid day! (must be an integer ranging from 1 to 31)",dayval);
160  }
161}
162
163
164document.calendar.day.value=dayval;
165}
166
167function CheckGivenTime(){
168var hours;
169var minutes;
170var seconds;
171
172// Check value of hours
173hours=document.calendar.hours.value;
174while (((hours<0)||(hours>=24))||(hours!=Math.round(hours))) {
175  hours=prompt("Invalid Time (hh) value! (must be an integer ranging from 0 to 23)",hours);
176  document.calendar.hours.value=hours;
177}
178
179// Check value of minutes
180minutes=document.calendar.minutes.value;
181while (((minutes<0)||(hours>=60))||(minutes!=Math.round(minutes))) {
182  minutes=prompt("Invalid Time (mm) value! (must be an integer ranging from 0 to 59)",minutes);
183  document.calendar.minutes.value=minutes;
184}
185
186//Check value of seconds
187seconds=document.calendar.seconds.value;
188while((seconds<0)||(seconds>=60)) {
189  seconds=prompt("Invalid Time (ss) value! (must range from 0 to 60)",seconds);
190  document.calendar.seconds.value=seconds;
191}
192
193}
194
195/*--------------------------------------------------------------------------*/
196
197function CheckGivenDate(){
198var bissextil; // bissextil year ? (0==no, 1==yes)
199
200bissextil=CheckGivenYear();
201CheckGivenMonth();
202CheckGivenDay(document.calendar.year.value,bissextil,document.calendar.month.value);
203CheckGivenTime();
204//alert("OK");
205return bissextil;
206}
207
208/*--------------------------------------------------------------------------*/
209
210function Convert2Julian(){
211var bissextil; // bissextil year ? (0==no, 1==yes)
212var year;
213var month;
214var day;
215var i;
216var hours,minutes,seconds;
217var ref_year=1968;
218var ref_jdate=2.4398565e6; // Julian date for 01/01/1968 00:00:00
219var edays = new Array(0,31,59,90,120,151,181,212,243,273,304,334);
220// edays = number of elapsed days during previous monthes of same year
221var nday=0.0; // number of days
222
223// start by checking validity of given date
224bissextil=CheckGivenDate();
225
226year=document.calendar.year.value;
227month=document.calendar.month.value;
228day=document.calendar.day.value;
229
230// compute number of days due to years
231if(year>ref_year) {
232  for(i=ref_year;i<year;i++){
233    nday=nday+365.0;
234    if ((((i%4)==0)&&((i%100)!=0))||((i%400)==0)) { // bissextil year
235      nday++;
236    }
237  }
238}
239else {
240  for(i=year;i<ref_year;i++){
241    nday=nday-365.0;
242    if ((((i%4)==0)&&((i%100)!=0))||((i%400)==0)) { // bissextil year
243      nday--;
244    }
245  }
246}
247
248// add number of days due to elapsed monthes
249nday=nday+edays[month-1];
250//alert(nday)
251
252//add 1 if year is bissextil and month >=3
253if((bissextil==1)&&(month>=3)){
254  nday=nday+1;
255}
256// add reference year offset and day
257//jdate=ref_jdate+nday+day;
258jdate=nday*1.0+day*1.0+ref_jdate*1.0-1.0;
259
260// add time (hours+minutes+seconds)
261hours=document.calendar.hours.value;
262minutes=document.calendar.minutes.value;
263seconds=document.calendar.seconds.value;
264jdate=jdate+hours/24.0+minutes/1440.0+seconds/86400.0;
265
266document.calendar.julian.value=jdate;
267}
268
269/*--------------------------------------------------------------------------*/
270
271function Convert2Ls(){
272// Convert a Julian date to corresponding "sol" and "Ls"
273var jdate;
274var sol;
275var ls;
276var martianyear;
277var martianmonth;
278
279var jdate_ref=2.442765667e6; // 19/12/1975 4:00:00, such that Ls=0
280// jdate_ref is also the begining of Martian Year "12"
281var martianyear_ref=12;
282var earthday=86400.0;
283var marsday=88775.245;
284var marsyear=668.60; // number of sols in a martian year
285
286// Start by converting given date to Julian date
287Convert2Julian();
288
289// Convert julian days to sol date
290jdate=document.calendar.julian.value;
291
292sol=(jdate-jdate_ref)*earthday/marsday;
293
294martianyear=martianyear_ref;
295// Compute Martian Year #, along with sol value
296// sol being computed modulo the number of sols in a martian year
297while (sol>=marsyear){
298  sol=sol-marsyear;
299  martianyear=martianyear+1;
300}
301while (sol<0.0){
302  sol=sol+marsyear;
303  martianyear=martianyear-1;
304}
305
306//document.dummy.dummy1.value=sol;
307
308// convert sol number to Ls
309ls=Sol2Ls(sol);
310
311// Knowing Ls compute martian month
312martianmonth=1+Math.floor(ls/30.);
313
314//Display value with a maximum of 2 decimal digits
315document.calendar.martianyear.value=martianyear;
316document.calendar.martianmonth.value=martianmonth;
317document.calendar.ls.value=Math.round(ls*10)/10;
318//document.calendar.sol.value=Math.round(sol*10)/10;
319document.calendar.sol.value=1+Math.floor(sol);
320}
321
322/*--------------------------------------------------------------------------*/
323
324function Sol2Ls(sol) {
325var sol;
326var ls;
327
328var year_day=668.6; // number of sols in a martian year
329var peri_day=485.35; // perihelion date
330var e_ellip=0.09340; // orbital ecentricity
331var timeperi=1.90258341759902 // 2*Pi*(1-Ls(perihelion)/360); Ls(perihelion)=250.99
332var rad2deg=180./Math.PI;
333
334var i;
335var zz,zanom,zdx=10;
336var xref,zx0,zteta;
337// xref: mean anomaly, zx0: eccentric anomaly, zteta: true anomaly
338
339zz=(sol-peri_day)/year_day;
340zanom=2.*Math.PI*(zz-Math.round(zz));
341xref=Math.abs(zanom);
342
343// Solve Kepler equation zx0 - e *sin(zx0) = xref
344// Using Newton iterations
345zx0=xref+e_ellip*Math.sin(xref);
346do {
347  zdx=-(zx0-e_ellip*Math.sin(zx0)-xref)/(1.-e_ellip*Math.cos(zx0));
348  zx0=zx0+zdx;
349}while (zdx>1.e-7);
350if (zanom<0) zx0=-zx0;
351
352// Compute true anomaly zteta, now that eccentric anomaly zx0 is known
353zteta=2.*Math.atan(Math.sqrt((1.+e_ellip)/(1.-e_ellip))*Math.tan(zx0/2.));
354
355// compute Ls
356ls=zteta-timeperi;
357if(ls<0) ls=ls+2.*Math.PI;
358if(ls>2.*Math.PI) ls=ls-2.*Math.PI;
359// convert Ls into degrees
360ls=rad2deg*ls;
361
362return ls;
363}
364
365
366function PlaceValues(lon,lat){
367var lon;
368var lat;
369var savlon;
370var savlat;
371var yeah;
372savlon=document.calendar.longitude.value;
373savlat=document.calendar.latitude.value;
374document.calendar.longitude.value=lon;
375document.calendar.latitude.value=lat;
376yeah=document.calendar.toto.value;
377// to be improved. lon and lat should be separated. but for the moment
378// only mapping capabilities exist as 2D plots which means if lon is all
379// lat is all and vice versa.
380if ( document.calendar.longitude.value == "all") {
381 if ( document.calendar.altitude.value == "all") {
382    alert("Not allowed! Altitude and time must be fixed in mapping mode.");
383    document.calendar.longitude.value=savlon;
384    document.calendar.latitude.value=savlat;
385    document.calendar.toto.value=yeah;
386 }
387 if ( document.calendar.localtime.value == "all") {
388    alert("Not allowed! Altitude and time must be fixed in mapping mode.");
389    document.calendar.longitude.value=savlon;
390    document.calendar.latitude.value=savlat;
391    document.calendar.toto.value=yeah;
392 }
393}
394}
395
396function PlaceVar(var1,var2,var3,var4){
397var var1;
398var var2;
399var var3;
400var var4;
401document.calendar.var1.value=var1;
402document.calendar.var2.value=var2;
403document.calendar.var3.value=var3;
404document.calendar.var4.value=var4;
405}
406
407function DefaultSpaceTime(){
408document.calendar.localtime.value = 9
409document.calendar.altitude.value = 2
410}
411
412// this is separated from PlaceValues because
413// allows easier determination through earth time
414// if needed (e.g. example case with rovers)
415function PlaceValues2(localtime){
416var localtime;
417var savlocaltime;
418savlocaltime=document.calendar.localtime.value
419document.calendar.localtime.value=localtime;
420if ( document.calendar.localtime.value == "all" ) {
421 if ( document.calendar.altitude.value == "all" ) {
422    alert("Not allowed! Now choose either a fixed altitude or a fixed time.");
423    //document.calendar.localtime.value=savlocaltime;
424 }
425}
426if ( document.calendar.localtime.value == "all" ) {
427 if ( document.calendar.longitude.value == "all" ) {
428    alert("Not allowed! Now choose either a lander or a fixed time.");
429    //document.calendar.localtime.value=savlocaltime;
430 }
431}
432}
433function PlaceValues3(altitude){
434var altitude;
435var savaltitude;
436savaltitude=document.calendar.altitude.value
437document.calendar.altitude.value=altitude;
438if ( document.calendar.altitude.value == "all" ) {
439 if ( document.calendar.localtime.value == "all") {
440    alert("Not allowed! Now choose either a fixed time or a fixed altitude.");
441    //document.calendar.altitude.value=savaltitude;
442 }
443}
444if ( document.calendar.altitude.value == "all" ) {
445 if ( document.calendar.longitude.value == "all") {
446    alert("Not allowed! Now choose either a lander or a fixed altitude.");
447    //document.calendar.altitude.value=savaltitude;
448 }
449}
450}
451
452
453function submit_form_beginner() {
454document.calendar.submit();
455document.calendar.reset();
456DefaultDateValues();
457DefaultTimeValues();
458Convert2Ls();
459PlaceValues(0.,0.);
460DefaultSpaceTime()
461}
462
Note: See TracBrowser for help on using the repository browser.