a = new Array(); a[1] = new Array("./Calendar/caldat.html", "caldat.pro", "", " file_comments Return the calendar date and time given julian date This is the inverse of the function julday 3 calendars are available according to the value of key_caltype variable of the common file cm_4cal : greg 360d noleap categories Calendar param julian in required type long integer or double precision floating point contains the Julian Day Number which begins at noon of the specified calendar date param month out type longword integer Number of the desired month 1 January 12 December param day out type longword integer Number of day of the month param year out type longword integer Number of the desired year param hour out type longword integer Hour of the day param minute out type longword integer Minute of the day param second out type double precision floating point Second and fractions of the day keyword NDAYSPM type integer default 30 To use a calendar with fixed number of days per month see also the use of key_caltype variable of the common file cm_4cal uses cm_4cal restrictions Accuracy using IEEE double precision numbers is approximately 1 10000th of a second history Translated from Numerical Recipes in C by William H Press Brian P Flannery Saul A Teukolsky and William T Vetterling Cambridge University Press 1988 second printing DMS July 1992 DMS April 1996 Added HOUR MINUTE and SECOND keyword AB 7 December 1997 Generalized to handle array input Eric Guilyardi June 1999 Added key_work ndayspm for fixed number of days per months AB 3 January 2000 Make seconds output as DOUBLE in array output Sebastien Masson May 2006 add different calendar with key_caltype variable of the common file cm_4cal version Id: caldat pro 371 2008 08 07 09:32:02Z pinsard PRO caldat julian month day year hour minute second NDAYSPM ndayspm compile_opt idl2 strictarrsubs cm_4cal ON_ERROR 2 Return to caller if errors IF n_elements key_caltype EQ 0 THEN key_caltype greg if keyword_set ndayspm then key_caltype 360d nParam N_PARAMS IF nParam LT 1 THEN ras report Incorrect number of arguments CASE key_caltype OF greg :BEGIN min_julian 1095 max_julian 1827933925 minn MIN julian MAX maxx IF minn LT min_julian OR maxx GT max_julian THEN ras report Value of Julian date is out of allowed range igreg 2299161L Beginning of Gregorian calendar julLong FLOOR julian 0 5d Better be long minJul MIN julLong IF minJul GE igreg THEN BEGIN all are Gregorian jalpha LONG julLong 1867216L 0 25d 36524 25d ja julLong 1L jalpha long 0 25d jalpha ENDIF ELSE BEGIN ja julLong gregChange WHERE julLong ge igreg ngreg IF ngreg GT 0 THEN BEGIN jalpha long julLong gregChange 1867216L 0 25d 36524 25d ja gregChange julLong gregChange 1L jalpha long 0 25d jalpha ENDIF ENDELSE jalpha 1 clear memory jb TEMPORARY ja 1524L jc long 6680d jb 2439870L 122 1d0 365 25d jd long 365d jc 0 25d jc je long jb jd 30 6001d day TEMPORARY jb TEMPORARY jd long 30 6001d je month TEMPORARY je 1L month TEMPORARY month 1L MOD 12L 1L year TEMPORARY jc 4715L year TEMPORARY year month GT 2 year year year LE 0 END 360d :BEGIN IF keyword_set ndayspm THEN BEGIN IF ndayspm EQ 1 THEN ndayspm 30 ENDIF ELSE ndayspm 30 ndayspm long ndayspm julLong FLOOR julian 0 5d Better be long year julLong 12 ndayspm 1 month julLong 12 ndayspm year 1 ndayspm 1 day julLong 12 ndayspm year 1 ndayspm month 1 WHILE total day LT 1 GT 0 DO BEGIN tochange where day LT 1 month tochange month tochange 1 day tochange day tochange ndayspm ENDWHILE WHILE total month LT 1 GT 0 DO BEGIN tochange where month LT 1 year tochange year tochange 1 month tochange month tochange 12 ENDWHILE year 0 does not exist neg where year LT 0 IF neg 0 NE 1 THEN year neg year neg 1 END noleap :BEGIN julLong FLOOR julian 0 5d Better be long year julLong 365 1 day julLong MOD 365L zero where day EQ 0 month 1 day GT 31 day GT 59 day GT 90 day GT 120 day GT 151 day GT 181 day GT 212 day GT 243 day GT 273 day GT 304 day GT 334 month long month day day 31L day GT 31 28L day GT 59 31L day GT 90 30L day GT 120 31L day GT 151 30L day GT 181 31L day GT 212 31L day GT 243 30L day GT 273 31L day GT 304 30L day GT 334 IF zero 0 NE 1 THEN BEGIN year zero year zero 1 month zero 12L day zero 31L ENDIF END ELSE:BEGIN ng report only 3 types of calendar are accepted: greg 360d and noleap return END ENDCASE zero where year ge 600000L cnt IF cnt NE 0 THEN year zero year zero 654321L see if we need to do hours minutes seconds IF nParam GT 4 THEN BEGIN fraction julian 0 5d TEMPORARY julLong hour floor fraction 24d fraction TEMPORARY fraction hour 24d minute floor fraction 1440d second TEMPORARY fraction minute 1440d 86400d ENDIF if julian is an array reform all output to correct dimensions IF SIZE julian N_DIMENSION GT 0 THEN BEGIN dimensions SIZE julian DIMENSION month REFORM month dimensions overwrite day REFORM day dimensions overwrite year REFORM year dimensions overwrite IF nParam GT 4 THEN BEGIN hour REFORM hour dimensions overwrite minute REFORM minute dimensions overwrite second REFORM second dimensions overwrite ENDIF ENDIF return END"); a[2] = new Array("./Calendar/date2jul.html", "date2jul.pro", "", " file_comments gives Julian day equivalent of a date given in yyyymmdd format This is the inverse of the function jul2date categories Calendar param date in required type long or double scalar or array longword integer with yyyymmdd format or double precision floating point with yyyymmdd xx where xx is the fraction of the day xx 0 at 0am and 5 at 12am keyword GRADS if 1 year 2000 year if 50 year 1900 year keyword MONTH Set this keyword equal to a named variable that will receive a longword integer or longword integer array representing the number of the desired month 1 January 12 December keyword DAY Set this keyword equal to a named variable that will receive a longword integer or longword integer array representing the number of the day of the month 1 31 keyword YEAR Set this keyword equal to a named variable that will receive a longword integer or longword integer array representing the number of the desired year e g 1994 keyword HOUR Set this keyword equal to a named variable that will receive a longword integer or longword integer array representing the number of the hour of the day 0 23 keyword MINUTE Set this keyword equal to a named variable that will receive a longword integer or longword integer array representing the number of the minute of the hour 0 59 keyword SECOND Set this keyword equal to a named variable that will receive a double precision floating point value or a double precision floating point array representing the number of the second of the minute 0 59 returns Julian day with the same format long or double as the input parameter restrictions Input param must be longword integer or double precision floating point examples IDL jday juldate 19930124 IDL print date2jul 19931205 EQ julday 12 5 1993 1 IDL print date2jul 931205 grads EQ julday 12 5 1993 1 IDL print date2jul 19931205 5d EQ julday 12 5 1993 12 0 0 1 IDL print date2jul 19931205 0d EQ julday 12 5 1993 0 0 0 1 history Sebastien Masson smasson lodyc jussieu fr June 2005 version Id: date2jul pro 371 2008 08 07 09:32:02Z pinsard FUNCTION date2jul date GRADS grads MONTH month DAY day YEAR year HOUR hour MINUTE minute SECOND second compile_opt idl2 strictarrsubs check parameters if N_PARAMS EQ 0 then return report ERROR No input parameter Usage : res date2jul date GRADS grads MONTH month DAY day YEAR year HOUR hour MINUTE minute SECOND second sztype size date type IF sztype NE 3 AND sztype NE 5 AND sztype LT 13 THEN BEGIN dummy report Beware of input type date must be long or double stop ENDIF year long date 10000 month long abs date 100 MOD 100 day long abs date MOD 100 if keyword_set grads then year year 1900L year GE 50 AND year LE 99 2000L year GE 1 AND year LE 49 IF sztype NE 5 THEN return julday month day year fraction date long date hour floor fraction 24d fraction temporary fraction hour 24d minute floor fraction 1440d second temporary fraction minute 1440d 86400d return julday month day year hour minute second end "); a[3] = new Array("./Calendar/date2string.html", "date2string.pro", "", " file_comments create a nice and readable format to print a date categories Calendar String param yyyymmdd in required type scalor or array the date in the format yyyymmdd keyword _EXTRA Used to pass keywords to STRING function returns a string containing the date in a easy readable format with the same number of elements than yyyymmdd examples IDL print date2string 19900123 Jan 23 1990 IDL print date2string 19900123 format C CMOA JAN 23 1990 history Sebastien Masson smasson lodyc jussieu fr Creation update review June 2005 Sebastien Masson version Id: date2string pro 378 2008 08 12 12:35:46Z pinsard FUNCTION date2string yyyymmdd _EXTRA ex compile_opt idl2 strictarrsubs sday strtrim long yyyymmdd MOD 100 1 smonth strtrim long yyyymmdd 100 MOD 100 2 syear strtrim long yyyymmdd 10000 2 res string format C CMoa 31 fix smonth 1 _EXTRA ex sday syear return res end"); a[4] = new Array("./Calendar/daysinmonth.html", "daysinmonth.pro", "", " file_comments give the number of days in a specific month categories Calendar param MONTH in optional type integer month number param YEAR in optional default from time common variable of cm_4cal To specify the year of the month Used only if the common variable key_caltype greg In that case month and year must have the same number of elements returns number of days in a month or 1 in case of error uses cm_4cal updatenew examples IDL ndays daysinmonth 2 2000 history Sebastien Masson smasson lodyc jussieu fr 2 7 98 update review english new commons: June 2005 Sebastien Masson version Id: daysinmonth pro 371 2008 08 07 09:32:02Z pinsard function daysinmonth month year compile_opt idl2 strictarrsubs cm_4cal IF NOT keyword_set key_forgetold THEN BEGIN updatenew ENDIF IF n_elements key_caltype EQ 0 THEN key_caltype greg CASE key_caltype OF 360d : if n_elements month GT 1 THEN return replicate 30 n_elements month ELSE return 30 noleap :BEGIN days_in_mth 31 28 31 30 31 30 31 31 30 31 30 31 IF n_elements month EQ 0 THEN caldat time month return days_in_mth month 1 END greg :BEGIN CASE n_params OF 0:caldat time month day year 2:IF n_elements month NE n_elements year THEN return report month and year must have the same number of elements ELSE:return report daysinmonth accept 0 or 2 input parameters ENDCASE days_in_mth 31 28 31 30 31 30 31 31 30 31 30 31 return days_in_mth month 1 leapyr year month EQ 2 END ELSE:return report only 3 types of calendar are accepted: greg 360d and noleap ENDCASE END"); a[5] = new Array("./Calendar/jul2date.html", "jul2date.pro", "", " file_comments gives yyyymmdd date equivalent of a Julian day This is the inverse of the function date2jul categories Calendar param jday in required type long or double scalar or array Julian day keyword MONTH Set this keyword equal to a named variable that will receive a longword integer or longword integer array representing the number of the desired month 1 January 12 December keyword DAY Set this keyword equal to a named variable that will receive a longword integer or longword integer array representing the number of the day of the month 1 31 keyword YEAR Set this keyword equal to a named variable that will receive a longword integer or longword integer array representing the number of the desired year e g 1994 keyword HOUR Set this keyword equal to a named variable that will receive a longword integer or longword integer array representing the number of the hour of the day 0 23 keyword MINUTE Set this keyword equal to a named variable that will receive a longword integer or longword integer array representing the number of the minute of the hour 0 59 keyword SECOND Set this keyword equal to a named variable that will receive a double precision floating point value or a double precision floating point array representing the number of the second of the minute 0 59 returns the date: longword integer with yyyymmdd format or double precision floating point with yyyymmdd xx where xx is the fraction of the day xx 0 at 0am and 5 at 12am restrictions Input param must be longword integer or double precision floating point examples IDL print jul2date julday 12 23 1999 19991223 IDL print jul2date julday 12 23 1999 12 0 0 19991224 IDL print jul2date julday 12 23 1999 12 0 0 format f11 2 19991223 50 IDL print jul2date julday 12 23 1999 0 0 0 format f11 2 19991223 00 history Sebastien Masson smasson lodyc jussieu fr June 2005 version Id: jul2date pro 371 2008 08 07 09:32:02Z pinsard function jul2date jday MONTH month DAY day YEAR year HOUR hour MINUTE minute SECOND second compile_opt idl2 strictarrsubs sztype size jday type IF sztype NE 3 AND sztype NE 5 AND sztype LT 13 THEN BEGIN dummy report Beware of input type julian date must be long or double stop ENDIF caldat jday month day year hour minute second res 10000L year 100L month day year GE 0 10000L year 100L month day year LT 0 IF sztype NE 5 THEN return long res ELSE return double res hour 24 0d0 minute 1440 0d0 second 86400 0d0 end"); a[6] = new Array("./Calendar/julday.html", "julday.pro", "", " file_comments Calculate the Julian Day Number for a given month day and year This is the inverse of the library function caldat 3 calendars are available according to the value of key_caltype variable of the common file cm_4cal : greg 360d noleap categories Calendar param month in optional type scalar integer or double or array of scalars Number of the desired month 1 January 12 December param day in optional type scalar integer or double or array of scalars Number of day of the month param yearin in optional type scalar integer or double or array of scalars Number of the desired year Year parameters must be valid values from the civil calendar Years B C E are represented as negative integers Years in the common era are represented as positive integers In particular note that there is no year 0 in the civil calendar 1 B C E 1 is followed by 1 C E 1 Change: However for climatological year we do accept the year 0 but we change it for year 654321L the same trick is done in caldat so caldat julday 1 1 0 gives you back Jan 1st of year 0 param hour in optional type scalar integer or double or array of scalars default 12 Number of the hour of the day param minute in optional type scalar integer or double or array of scalars default 0 Number of the minute of the hour param second in optional type scalar integer or double or array of scalars default 0 Number of the second of the minute restrictions The result will have the same dimensions as the smallest array or will be a scalar if all arguments are scalars keyword NDAYSPM default 30 type integer To use a calendar with fixed number of days per month see also the use of key_caltype variable of the common file cm_4cal returns the Julian Day Number which begins at noon of the specified calendar date If Hour Minute and Second are not specified then the result will be a long integer otherwise the result is a double precision floating point number uses cm_4cal restrictions Accuracy using IEEE double precision numbers is approximately 1 10000th of a second with higher accuracy for smaller earlier Julian dates history Translated from Numerical Recipes in C by William H Press Brian P Flannery Saul A Teukolsky and William T Vetterling Cambridge University Press 1988 second printing AB September 1988 DMS April 1995 Added time of day Eric Guilyardi June 1999 Added key_work ndayspm for fixed number of days per months CT April 2000 Now accepts vectors or scalars Sebastien Masson Aug 2003 fix bug for negative and large values of month values eg julday 349 1 1970 Sebastien Masson May 2006 add different calendat with key_caltype variable of the common file cm_4cal version Id: julday pro 396 2009 04 08 16:14:31Z smasson FUNCTION julday month day yearin hour minute second NDAYSPM ndayspm compile_opt idl2 strictarrsubs cm_4cal ON_ERROR 2 Return to caller if errors IF n_elements key_caltype EQ 0 THEN key_caltype greg if keyword_set ndayspm then key_caltype 360d NP n_params Process the input if all are missing use today s date IF np EQ 0 THEN RETURN SYSTIME JULIAN IF np LT 3 THEN ras report Incorrect number of arguments YEAR long yearin zero where year EQ 0 cnt IF cnt NE 0 THEN YEAR zero 654321L CASE key_caltype OF greg :BEGIN Gregorian Calender was adopted on Oct 15 1582 skipping from Oct 4 1582 to Oct 15 1582 GREG 2299171L incorrect Julian day for Oct 25 1582 Find the dimensions of the Result: 1 Find all of the input arguments that are arrays ignore scalars 2 Out of the arrays find the smallest number of elements 3 Find the dimensions of the smallest array Step 1: find all array arguments nDims SIZE month N_DIMENSIONS SIZE day N_DIMENSIONS SIZE year N_DIMENSIONS SIZE hour N_DIMENSIONS SIZE minute N_DIMENSIONS SIZE second N_DIMENSIONS arrays WHERE nDims GE 1 nJulian 1L assume everything is a scalar IF arrays 0 GE 0 THEN BEGIN Step 2: find the smallest number of elements nElement N_ELEMENTS month N_ELEMENTS day N_ELEMENTS year N_ELEMENTS hour N_ELEMENTS minute N_ELEMENTS second nJulian MIN nElement arrays whichVar step 3: find dimensions of the smallest array CASE arrays whichVar OF 0: julianDims SIZE month DIMENSIONS 1: julianDims SIZE day DIMENSIONS 2: julianDims SIZE year DIMENSIONS 3: julianDims SIZE hour DIMENSIONS 4: julianDims SIZE minute DIMENSIONS 5: julianDims SIZE second DIMENSIONS ENDCASE ENDIF d_Second 0d defaults d_Minute 0d d_Hour 0d convert all Arguments to appropriate array size type SWITCH np OF use switch so we fall thru all arguments 6: d_Second SIZE second N_DIMENSIONS GT 0 second 0:nJulian 1 : second 5: d_Minute SIZE minute N_DIMENSIONS GT 0 minute 0:nJulian 1 : minute 4: d_Hour SIZE hour N_DIMENSIONS GT 0 hour 0:nJulian 1 : hour 3: BEGIN convert m d y to type LONG L_MONTH SIZE month N_DIMENSIONS GT 0 LONG month 0:nJulian 1 : LONG month L_DAY SIZE day N_DIMENSIONS GT 0 LONG day 0:nJulian 1 : LONG day L_YEAR SIZE year N_DIMENSIONS GT 0 LONG year 0:nJulian 1 : LONG year END ENDSWITCH min_calendar 4716 max_calendar 5000000 minn MIN l_year MAX maxx IF minn LT min_calendar OR maxx GT max_calendar THEN ras report Value of Julian date is out of allowed range change to accept year 0 if MAX L_YEAR eq 0 NE 0 then message There is no year zero in the civil calendar by seb Aug 2003 tochange where L_MONTH LT 0 IF tochange 0 NE 1 THEN BEGIN L_YEAR tochange L_YEAR tochange L_MONTH tochange 12 1 L_MONTH tochange 12 L_MONTH tochange MOD 12 ENDIF tochange where L_MONTH GT 12 IF tochange 0 NE 1 THEN BEGIN L_YEAR tochange L_YEAR tochange L_MONTH tochange 12 L_MONTH tochange L_MONTH tochange MOD 12 ENDIF by seb Aug 2003 end bc L_YEAR LT 0 L_YEAR TEMPORARY L_YEAR TEMPORARY bc inJanFeb L_MONTH LE 2 JY L_YEAR inJanFeb JM L_MONTH 1b 12b TEMPORARY inJanFeb JUL floor 365 25d JY floor 30 6001d TEMPORARY JM L_DAY 1720995L Test whether to change to Gregorian Calendar IF MIN JUL GE GREG THEN BEGIN change all dates JA long 0 01d TEMPORARY JY JUL TEMPORARY JUL 2L JA long 0 25d JA ENDIF ELSE BEGIN gregChange WHERE JUL ge GREG ngreg IF ngreg GT 0 THEN BEGIN JA long 0 01d JY gregChange JUL gregChange JUL gregChange 2L JA long 0 25d JA ENDIF ENDELSE hour minute second IF np GT 3 THEN BEGIN yes compute the fractional Julian date Add a small offset so we get the hours minutes seconds back correctly if we convert the Julian dates back This offset is proportional to the Julian date so small dates a long long time ago will be more accurate eps MACHAR DOUBLE eps eps eps ABS jul eps For Hours divide by 24 then subtract 0 5 in case we have unsigned integers jul TEMPORARY JUL TEMPORARY d_Hour 24d 0 5d TEMPORARY d_Minute 1440d TEMPORARY d_Second 86400d eps ENDIF check to see if we need to reform vector to array of correct dimensions IF N_ELEMENTS julianDims GT 1 THEN JUL REFORM TEMPORARY JUL julianDims RETURN jul END 360d :BEGIN Fixed number of days per month default 30 : IF keyword_set ndayspm THEN BEGIN IF ndayspm EQ 1 THEN ndayspm 30 ENDIF ELSE ndayspm 30 L_MONTH LONG MONTH L_DAY LONG DAY L_YEAR LONG YEAR neg where L_YEAR LT 0 IF neg 0 NE 1 THEN L_YEAR neg L_YEAR neg 1 JUL L_YEAR 1 12 L_MONTH 1 ndayspm L_DAY if n_elements Hour n_elements Minute n_elements Second eq 0 then return JUL if n_elements Hour eq 0 then Hour 12 if n_elements Minute eq 0 then Minute 0 if n_elements Second eq 0 then Second 0 IF np LE 3 THEN return JUL ELSE return JUL Hour 24 0d0 0 5d Minute 1440 0d0 Second 86400 0d0 END noleap :BEGIN L_MONTH LONG MONTH L_DAY LONG DAY L_YEAR LONG YEAR tochange where L_MONTH LE 0 IF tochange 0 NE 1 THEN BEGIN tmp L_MONTH tochange 12L L_YEAR tochange L_YEAR tochange tmp 12L L_MONTH tochange temporary tmp MOD 12L 12L ENDIF tochange where L_MONTH GT 12L IF tochange 0 NE 1 THEN BEGIN tmp L_MONTH tochange 1L L_YEAR tochange L_YEAR tochange tmp 12L L_MONTH tochange temporary tmp MOD 12L 1L ENDIF L_YEAR L_YEAR 1 daysyear long total 0 0 31 28 31 30 31 30 31 31 30 31 30 cumulative JUL 365 L_YEAR daysyear L_MONTH L_DAY if n_elements Hour n_elements Minute n_elements Second eq 0 then return JUL if n_elements Hour eq 0 then Hour 12 if n_elements Minute eq 0 then Minute 0 if n_elements Second eq 0 then Second 0 IF np LE 3 THEN return JUL ELSE return JUL Hour 24 0d0 0 5d Minute 1440 0d0 Second 86400 0d0 END ELSE:return report only 3 types of calendar are accepted: greg 360d and noleap ENDCASE END"); a[7] = new Array("./Calendar/leapyr.html", "leapyr.pro", "", " file_comments determine whether the input year is a leap year or not Very useful for finding number of days in a year eg NUM_DAYS_IN_YR 365 leapyr year categories Calendar param year in required type scalar or array year to be tested as a leap year returns 0 then not a leap year 1 then year is a leap year with the same number of elements than year uses cm_4cal examples IDL result leapyr 2000 history Originally Written by: Trevor Harris Physics Dept University of Adelaide 20 09 88 November 2004: correction for century years S Masson Every year divisible by 4 is a leap year But every year divisible by 100 is NOT a leap year Unless the year is also divisible by 400 then it is still a leap year This means that year 1800 1900 2100 2200 2300 and 2500 are NOT leap years while year 2000 and 2400 are leap years supress the automatic change 89 1989 June 2005 update for new commons Sebastien Masson version Id: leapyr pro 371 2008 08 07 09:32:02Z pinsard FUNCTION leapyr year compile_opt idl2 strictarrsubs cm_4cal yr long year IF n_elements key_caltype EQ 0 THEN key_caltype greg IF key_caltype NE greg THEN BEGIN sd size yr dimensions IF sd 0 EQ 0 THEN return 0b ELSE return bytarr size yr dimensions ENDIF ELSE return yr MOD 4 EQ 0 yr MOD 100 NE 0 yr MOD 400 EQ 0 end"); a[8] = new Array("./Calendar/monthname.html", "monthname.pro", "", " file_comments gives the name of a month categories Calendar String param month in required type scalar or array the month number from 1 to 12 keyword _EXTRA Used to pass keywords to STRING function returns the month names a string with the same number of elements than month examples IDL print monthname 2 3 February March IDL print monthname 2 format C CMOA0 FEBRUARY IDL print monthname 2 format C CmoA03 : feb history Sebastien Masson smasson lodyc jussieu fr 1 October 2001 version Id: monthname pro 378 2008 08 12 12:35:46Z pinsard FUNCTION monthname month _EXTRA ex compile_opt idl2 strictarrsubs return string format C CMoA0 31 month 1 _EXTRA ex end"); a[9] = new Array("./Colors/color24.html", "color24.pro", "", " file_comments The purpose of this function is to convert a RGB color triple into the equivalent 24 big long integer This routine was written to be used with routines like or getcolor categories Graphics Color param rgb_triple in required type byte A three element array A color triple The values of the elements must be between 0 and 255 returns type long integer a 24 bit long integer that is equivalent the input color The color is described in terms of a hexadecimal number e g FF206A where the left two digits represent the blue color the middle two digits represent the green color and the right two digits represent the red color examples To convert the color triple for the color YELLOW 255 255 0 to the hexadecimal value 00FFFF x or the decimal number 65535 type: IDL color COLOR24 255 255 0 history Written by: David Fanning 3 February 96 version Id: color24 pro 371 2008 08 07 09:32:02Z pinsard FUNCTION color24 rgb_triple compile_opt idl2 strictarrsubs ON_ERROR 1 IF N_ELEMENTS rgb_triple NE 3 THEN ras report Argument must be a three element vector IF MAX rgb_triple GT 255 OR MIN rgb_triple LT 0 THEN ras report Argument values must be in range of 0 255 base16 1L 16L 256L 4096L 65536L 1048576L num24bit 0L FOR j 0 2 DO num24bit num24bit rgb_triple j MOD 16 base16 0 j Fix rgb_triple j 16 base16 1 j RETURN num24bit END"); a[10] = new Array("./Colors/colorbar.html", "colorbar.pro", "", " file_comments The purpose of this routine is to add a color bar to the current graphics window categories Graphics keyword BOTTOM default 0B The lowest color index of the colors to be loaded in the bar keyword CB_CHARSIZE default 1 0 The character size of the color bar annotations keyword CB_CHARTHICK default 1 0 The character thick of the color bar annotations keyword CB_COLOR default ncolors 1 bottom The color index of the bar outline and characters keyword CB_LOG to get logarithmic scale for the colorbar keyword CB_TITLE default This is title for the color bar keyword DISCRETE Vector which contain color s indexes to trace in a color bar Therefore we obtain a discrete colorbar which contains only the specified colors in the order they appear in the vector keyword DIVISIONS default 2 The number of divisions to divide the bar into There will be divisions 1 annotations keyword FORMAT default F6 2 The format of the bar annotations keyword CB_LABEL type vector A vector to specify sticks values of the color bar It allows when we use DISCRETE to have colors that don t increase by increments in a regular way keyword MAX default NCOLORS 1 The maximum data value for the bar annotation keyword MIN default 0 The minimum data value for the bar annotation keyword NCOLORS default D N_COLORS This is the number of colors in the color bar keyword NOTITLE Force to don t write title even if CB_TITLE is declared keyword POSITION default see below A four element array of normalized coordinates in the same form as the POSITION keyword on a plot Default is 0 88 0 15 0 95 0 95 for a vertical bar and 0 15 0 88 0 95 0 95 for a horizontal bar keyword PSCOLOR This keyword is only applied if the output is being sent to a Postscript file It indicates that the Postscript device is configured for color output If this keyword is set then the annotation is drawn in the color specified by the COLOR keyword If the keyword is not set the annotation is drawn in the color specified by the P COLOR system variable usually this will be the color black In general this gives better looking output on non color or gray scale printers If you are not specifically setting the annotation color with the COLOR keyword it will probably be better NOT to set this keyword either even if you are outputting to a color Postscript printer keyword RIGHT This puts the labels on the right hand side of a vertical color bar It applies only to vertical color bars keyword TOP This puts the labels on top of the bar rather than under it The keyword only applies if a horizontal color bar is rendered keyword VERTICAL default 0 horizontal color bar Setting this keyword give a vertical color bar keyword _EXTRA pass any keyword to colorbar restrictions The number of colors available on the display device not the Postscript device is used unless the NCOLORS keyword is used examples To display a horizontal color bar above a contour plot type: IDL LOADCT 5 NCOLORS 100 IDL CONTOUR DIST 31 41 POSITION 0 15 0 15 0 95 0 75 IDL C_COLORS INDGEN 25 4 NLEVELS 25 IDL COLORBAR NCOLORS 100 history Written by: David Fanning 10 JUNE 96 10 27 96: Added the ability to send output to PostScript DWF 11 04 96: Substantially rewritten to go to screen or PostScript file without having to know much about the PostScript device or even what the current graphics device is DWF 01 27 97: Added the RIGHT and TOP keywords Also modified the way the TITLE keyword works DWF 07 15 97: Fixed a problem some machines have with plots that have no valid data range in them DWF 03 03 98: Add DISCRETE keyword sebastien masson smasson lodyc jussieu fr version Id: colorbar pro 400 2009 07 17 10:27:52Z smasson PRO colorbar BOTTOM bottom CB_CHARSIZE cb_charsize CB_CHARTHICK cb_charthick CB_COLOR cb_color DIVISIONS divisions DISCRETE discrete CB_LABEL cb_label FORMAT format POSITION position MAX max MIN min NCOLORS ncolors PSCOLOR pscolor CB_TITLE cb_title VERTICAL vertical TOP top RIGHT right CB_LOG CB_log NOTITLE notitle _EXTRA ex compile_opt idl2 strictarrsubs Is the PostScript device selected postScriptDevice D NAME EQ PS Check and define keywords IF N_ELEMENTS ncolors EQ 0 THEN BEGIN Most display devices to not use the 256 colors available to the PostScript device This presents a problem when writing general purpose programs that can be output to the display or to the PostScript device This problem is especially bothersome if you don t specify the number of colors you are using in the program One way to work around this problem is to make the default number of colors the same for the display device and for the PostScript device Then the colors you see in PostScript are identical to the colors you see on your display Here is one way to do it IF postScriptDevice THEN BEGIN oldDevice D NAME What kind of computer are we using SET_PLOT to appropriate display device thisOS VERSION OS_FAMILY thisOS STRMID thisOS 0 3 thisOS STRUPCASE thisOS CASE thisOS of MAC : SET_PLOT thisOS WIN : SET_PLOT thisOS ELSE: SET_PLOT X ENDCASE p BACKGROUND d n_colors 1 255 p color 0 if d n_colors gt 256 then p background ffffff x Open a window to make sure D N_COLORS is accurate WINDOW FREE PIXMAP XSIZE 10 YSIZE 10 WDELETE D WINDOW Here is how many colors we should use ncolors D N_COLORS SET_PLOT oldDevice IF oldDevice EQ X OR oldDevice EQ MAC OR oldDevice EQ WIN then BEGIN p BACKGROUND d n_colors 1 255 p color 0 if d n_colors gt 256 then p background ffffff x ENDIF ENDIF ELSE ncolors D N_COLORS ENDIF IF N_ELEMENTS bottom EQ 0 THEN bottom 0B IF N_ELEMENTS cb_charsize EQ 0 THEN cb_charsize 1 0 IF N_ELEMENTS cb_charthick EQ 0 THEN cb_charthick 1 0 IF N_ELEMENTS format EQ 0 THEN format F6 2 IF N_ELEMENTS cb_color EQ 0 THEN cb_color ncolors 1 bottom IF N_ELEMENTS min EQ 0 THEN min 0 0 IF N_ELEMENTS max EQ 0 THEN max FLOAT ncolors 1 IF N_ELEMENTS divisions EQ 0 THEN divisions 2 IF N_ELEMENTS cb_title EQ 0 THEN cb_title IF N_ELEMENTS notitle EQ 1 THEN cb_title pscolor KEYWORD_SET pscolor IF KEYWORD_SET vertical THEN BEGIN IF KEYWORD_SET discrete THEN begin facteur 256 n_elements discrete discrete reform replicate 1 facteur discrete facteur n_elements discrete overwrite bar REPLICATE 1B 10 discrete endif else bar REPLICATE 1B 10 BINDGEN 256 IF N_ELEMENTS position EQ 0 THEN position 0 88 0 15 0 95 0 95 ENDIF ELSE BEGIN IF KEYWORD_SET discrete THEN begin facteur 256 n_elements discrete discrete reform replicate 1 facteur discrete facteur n_elements discrete overwrite bar discrete REPLICATE 1B 10 endif else bar BINDGEN 256 REPLICATE 1B 10 IF N_ELEMENTS position EQ 0 THEN position 0 15 0 88 0 95 0 95 ENDELSE Scale the color bar IF NOT KEYWORD_SET discrete THEN bar BYTSCL bar TOP ncolors 1 bottom Get starting locations in DEVICE coordinates xstart position 0 D X_VSIZE ystart position 1 D Y_VSIZE Get the size of the bar in DEVICE coordinates xsize position 2 position 0 D X_VSIZE ysize position 3 position 1 D Y_VSIZE For PostScript output only draw the annotation in P COLOR unless pscolor is set This makes better output on grayscale printers IF postScriptDevice AND pscolor NE 1 THEN BEGIN oldcolor cb_color cb_color P COLOR ENDIF Display the color bar in the window Sizing is different for PostScript and regular display IF postScriptDevice THEN BEGIN TV bar xstart ystart XSIZE xsize YSIZE ysize ENDIF ELSE BEGIN IF CEIL xsize LT 0 OR CEIL ysize LT 0 THEN return bar CONGRID bar CEIL xsize CEIL ysize INTERP TV bar xstart ystart ENDELSE Annotate the color bar if keyword_set cb_label then begin divisions n_elements cb_label 1 for i 0 divisions DO cb_label string cb_label FORMAT format format ENDIF ELSE cb_label IF KEYWORD_SET vertical THEN BEGIN IF KEYWORD_SET right THEN BEGIN PLOT min max min max NODATA XTICKS 1 YTICKS divisions XSTYLE 1 YSTYLE 9 POSITION position COLOR cb_color CHARSIZE cb_charsize CHARTHICK cb_charthick NOERASE YTICKFORMAT A1 XTICKFORMAT A1 YTICKLEN 0 1 YRANGE min max YTITLE cb_title AXIS YAXIS 1 YRANGE min max YTICKFORMAT format YTICKS divisions YTICKLEN 0 1 YSTYLE 1 COLOR cb_color CHARTHICK cb_charthick CHARSIZE cb_charsize ytickname cb_label ylog cb_log ENDIF ELSE BEGIN PLOT min max min max NODATA XTICKS 1 YTICKS divisions XSTYLE 1 YSTYLE 9 POSITION position COLOR cb_color CHARSIZE cb_charsize CHARTHICK cb_charthick NOERASE YTICKFORMAT format XTICKFORMAT A1 YTICKLEN 0 1 YRANGE min max ytickname cb_label AXIS YAXIS 1 YRANGE min max YTICKFORMAT A1 YTICKS divisions YTICKLEN 0 1 YTITLE cb_title YSTYLE 1 COLOR cb_color CHARSIZE cb_charsize CHARTHICK cb_charthick ylog cb_log ENDELSE ENDIF ELSE BEGIN IF KEYWORD_SET top THEN BEGIN PLOT min max min max NODATA XTICKS divisions YTICKS 1 XSTYLE 9 YSTYLE 1 POSITION position COLOR cb_color CHARSIZE cb_charsize CHARTHICK cb_charthick NOERASE YTICKFORMAT A1 XTICKFORMAT A1 XTICKLEN 0 1 XRANGE min max XTITLE cb_title AXIS XTICKS divisions XSTYLE 1 COLOR cb_color CHARSIZE cb_charsize CHARTHICK cb_charthick XTICKFORMAT format XTICKLEN 0 1 XRANGE min max XAXIS 1 xtickname cb_label xlog cb_log ENDIF ELSE BEGIN PLOT min max min max NODATA XTICKS divisions YTICKS 1 XSTYLE 1 YSTYLE 1 POSITION position COLOR cb_color CHARSIZE cb_charsize CHARTHICK cb_charthick NOERASE YTICKFORMAT A1 XTICKFORMAT format XTICKLEN 0 1 XRANGE min max TITLE cb_title xtickname cb_label xlog cb_log ENDELSE ENDELSE Restore color variable if changed for PostScript IF postScriptDevice AND pscolor NE 1 THEN cb_color oldcolor return END"); a[11] = new Array("./Colors/getcolor.html", "getcolor.pro", "", " file_comments The original purpose of this function was to enable the user to specify one of the 16 colors supported by the McIDAS color map by name Over time however the function has become a general purpose function for handling and supporting drawing colors in a device independent way In particular I have been looking for ways to write color handling code that will work transparently on both 8 bit and 24 bit machines On 24 bit machines the code should work the same where color decomposition is turned on or off The 16 supported colors in GETCOLOR come from the McIDAS color table offered on the IDL newsgroup by Liam Gumley categories Graphics Color param thiscolor in optional A string with the name of the color Valid names are: black magenta cyan yellow green red blue navy gold pink aqua orchid gray sky beige white The color YELLOW is returned if the color name can t be resolved Case is unimportant param index in optional The color table index where the specified color should be loaded returns If no positional parameter is present then the return value is either a 16 by 3 byte array containing the RGB values of all 16 colors or it is a 16 element long integer array containing color values that can be decomposed into colors The 16 by 3 array is appropriate for loading color tables with the TVLCT command: Device Decomposed 0 colors GetColor TVLCT colors 100 If function is called with just this single input parameter the return value is either a 1 by 3 array containing the RGB values of that particular color or a 24 bit integer that can be decomposed into that particular color depending upon the state of the TRUE keyword and upon whether color decomposition is turned on or off The state of color decomposition can ONLY be determined if the program is being run in IDL 5 2 or higher If index parameter is passed then the return value of the function is the index number and not the color triple If color decomposition is turned on AND the user specifies an index parameter the color is loaded in the color table at the proper index but a 24 bit value is returned to the user in IDL 5 2 and higher keyword NAMES If this keyword is set the return value of the function is a 16 element string array containing the names of the colors These names would be appropriate for example in building a list widget with the names of the colors If the NAMES keyword is set the COLOR and INDEX parameters are ignored listID Widget_List baseID Value GetColor Names YSize 16 keyword LOAD If this keyword is set all 16 colors are automatically loaded starting at the color index specified by the START keyword Note that setting this keyword means that the return value of the function will be a structure with each field of the structure corresponding to a color name The value of each field will be an index number set by the START keyword corresponding to the associated color or a 24 bit long integer value that creates the color on a true color device What you have as the field values is determined by the TRUE keyword or whether color decomposition is on or off in the absence of the TRUE keyword It will either be a 1 by 3 byte array or a long integer value keyword START default D TABLE_SIZE 17 The starting color index number if the LOAD keyword is set This keyword value is ignored unless the LOAD keyword is also set The keyword is also ignored if the TRUE keyword is set or if color decomposition in on in IDL 5 2 and higher keyword TRUE If this keyword is set the specified color triple is returned as a 24 bit integer equivalent The lowest 8 bits correspond to the red value the middle 8 bits to the green value and the highest 8 bits correspond to the blue value In IDL 5 2 and higher if color decomposition is turned on it is as though this keyword were set restrictions The TRUE keyword causes the START keyword to be ignored The NAMES keyword causes the COLOR INDEX START and TRUE parameters to be ignored The COLOR parameter is ignored if the LOAD keyword is used On systems where it is possible to tell the state of color decomposition i e IDL 5 2 and higher a 24 bit value or values is automatically returned if color decomposition is ON examples To load a yellow color in color index 100 and plot in yellow type: IDL yellow GETCOLOR yellow 100 IDL PLOT data COLOR yellow or IDL PLOT data COLOR GETCOLOR yellow 100 To do the same thing on a 24 bit color system with decomposed color on type: IDL PLOT data COLOR GETCOLOR yellow TRUE or in IDL 5 2 and higher IDL DEVICE Decomposed 1 IDL PLOT data COLOR GETCOLOR yellow To load all 16 colors into the current color table starting at color index 200 type: IDL TVLCT GETCOLOR 200 To add the color names to a list widget: IDL listID Widget_List baseID Value GetColor Names YSize 16 To load all 16 colors and have the color indices returned in a structure: IDL DEVICE Decomposed 0 IDL colors GetColor Load Start 1 IDL HELP colors Structure IDL PLOT data COLOR colors yellow To get the direct color values as 24 bit integers in color structure fields: IDL DEVICE Decomposed 1 IDL colors GetColor Load IDL PLOT data COLOR colors yellow Note that the START keyword value is ignored if on a 24 bit device so it is possible to write completely device independent code by writing code like this: IDL colors GetColor Load IDL PLOT data Color colors yellow IDL DEVICE Decomposed 0 IDL colors GetColor Load Start 1 IDL HELP colors Structure IDL PLOT data COLOR colors yellow To get the direct color values as 24 bit integers in color structure fields: IDL DEVICE Decomposed 1 IDL colors GetColor Load IDL PLOT data COLOR colors yellow Note that the START keyword value is ignored if on a 24 bit device so it is possible to write completely device independent code by writing code like this: IDL colors GetColor Load IDL PLOT data Color colors yellow history Written by: David Fanning 10 February 96 Fixed a bug in which N_ELEMENTS was spelled wrong 7 Dec 96 DWF Added the McIDAS colors to the program 24 Feb 99 DWF Added the INDEX parameter to the program 8 Mar 99 DWF Added the NAMES keyword at insistence of Martin Schultz 10 Mar 99 DWF Reordered the colors so black is first and white is last 7 June 99 DWF Added automatic recognition of DECOMPOSED 1 state 7 June 99 DWF Added LOAD AND START keywords 7 June 99 DWF version Id: getcolor pro 371 2008 08 07 09:32:02Z pinsard FUNCTION getcolor thiscolor index TRUE truecolor NAMES colornames LOAD load START start compile_opt idl2 strictarrsubs Set up the color vectors names Black Magenta Cyan Yellow Green rvalue 0 255 0 255 0 gvalue 0 0 255 255 255 bvalue 0 255 255 0 0 names names Red Blue Navy Gold Pink rvalue rvalue 255 0 0 255 255 gvalue gvalue 0 0 0 187 127 bvalue bvalue 0 255 115 0 127 names names Aqua Orchid Gray Sky Beige White rvalue rvalue 112 219 127 0 255 255 gvalue gvalue 219 112 127 163 171 255 bvalue bvalue 147 219 127 255 127 255 Did the user ask for a specific color If not return all the colors If the user asked for a specific color find out if a 24 bit value is required Return to main IDL level if an error occurs ON_Error 1 np N_Params IF Keyword_Set start EQ 0 THEN start D TABLE_SIZE 17 User ask for the color names IF Keyword_Set colornames THEN RETURN names ELSE names StrUpCase names If no positional parameter return all colors IF np EQ 0 THEN BEGIN Did the user want a 24 bit value If so call COLOR24 IF Keyword_Set trueColor THEN BEGIN returnColor LonArr 16 FOR j 0 15 DO returnColor j Color24 rvalue j gvalue j bvalue j If LOAD keyword set return a color structure IF Keyword_Set load THEN BEGIN returnValue Create_Struct black returnColor 0 FOR j 1 15 DO returnValue Create_Struct returnValue names j returnColor j returnColor returnValue ENDIF RETURN returnColor ENDIF If color decomposition is ON return 24 bit values IF Float Version Release GE 5 2 THEN BEGIN IF D Name EQ X OR D Name EQ WIN OR D Name EQ MAC THEN BEGIN Device Get_Decomposed decomposedState ENDIF ELSE decomposedState 0 IF decomposedState EQ 1 THEN BEGIN returnColor LonArr 16 FOR j 0 15 DO returnColor j Color24 rvalue j gvalue j bvalue j IF Keyword_Set load THEN BEGIN returnValue Create_Struct black returnColor 0 FOR j 1 15 DO returnValue Create_Struct returnValue names j returnColor j RETURN returnValue ENDIF RETURN returnColor ENDIF IF Keyword_Set load THEN BEGIN TVLCT Reform rvalue gvalue bvalue 16 3 start returnValue Create_Struct black start FOR j 1 15 DO returnValue Create_Struct returnValue names j start j RETURN returnValue ENDIF returnColor REFORM rvalue gvalue bvalue 16 3 RETURN returnColor ENDIF IF Keyword_Set load THEN BEGIN TVLCT Reform rvalue gvalue bvalue 16 3 start returnValue Create_Struct black start FOR j 1 15 DO returnValue Create_Struct returnValue names j start j RETURN returnValue ENDIF returnColor REFORM rvalue gvalue bvalue 16 3 RETURN returnColor ENDIF Check synonyms of colors IF StrUpCase thisColor EQ GREY THEN thisColor GRAY IF StrUpCase thisColor EQ CHARCOAL THEN thisColor GRAY IF StrUpCase thisColor EQ AQUAMARINE THEN thisColor AQUA IF StrUpCase thisColor EQ SKYBLUE THEN thisColor SKY Make sure the parameter is an uppercase string varInfo SIZE thisColor IF varInfo varInfo 0 1 NE 7 THEN ras report The color name must be a string thisColor STRUPCASE thisColor Get the color triple for this color colorIndex WHERE names EQ thisColor If you can t find it Issue an informational message set the index to a YELLOW color and continue IF colorIndex 0 LT 0 THEN BEGIN ras report Can t find color Returning YELLOW INFORMATIONAL colorIndex 3 ENDIF Get the color triple r rvalue colorIndex g gvalue colorIndex b bvalue colorIndex returnColor REFORM r g b 1 3 Did the user want a 24 bit value If so call COLOR24 IF KEYWORD_SET trueColor THEN BEGIN returnColor COLOR24 returnColor RETURN returnColor ENDIF If color decomposition is ON return 24 bit value IF Float Version Release GE 5 2 THEN BEGIN IF D Name EQ X OR D Name EQ WIN OR D Name EQ MAC THEN BEGIN Device Get_Decomposed decomposedState ENDIF ELSE decomposedState 0 IF decomposedState EQ 1 THEN BEGIN Before you change return color load index if requested IF N_Elements index NE 0 THEN BEGIN index 0 index index D Table_Size 1 TVLCT returnColor index returnColor index ENDIF RETURN returnColor END"); a[12] = new Array("./Colors/lct.html", "lct.pro", "", " file_comments Fastest than type loadct file palette tbl categories Graphics Color param numpal in optional number of the color palette we want to select in the file palette tbl keyword LIGHTNESS a scalar used to change the Lightness of the color palette to be able to adjust according to the printer we use the media paper or slide lightness 1 to get darker colors keyword FILE default palette tbl The file containing the color palette It can be in any directory of the path keyword GET_NAME Set this keyword to a named variable in which the names of the color tables are returned as a string array No changes are made to the color table keyword _EXTRA Used to pass keywords to LOADCT history Sebastien Masson smasson lodyc jussieu fr 30 3 1999: add extra 6 7 1999: mac windows compatibility version Id: lct pro 327 2007 12 13 16:22:35Z pinsard PRO lct numpal FILE file GET_NAME get_name LIGHTNESS lightness _EXTRA ex compile_opt idl2 strictarrsubs definition of the name of the file containing colors palettes if keyword_set file then nametbl file ELSE nametbl palette tbl look for nametbl file nametbl find nametbl firstfound nopro if nametbl NE NOT FOUND then BEGIN if n_elements ex NE 0 then if where tag_names ex EQ FILE 0 NE 1 then ex FILE nametbl if we are in POSTSCRIPT mode we have to pass in X mode in order to change the color palette oldname d name if d name EQ PS OR d name EQ Z then BEGIN thisOS VERSION OS_FAMILY thisOS STRMID thisOS 0 3 thisOS STRUPCASE thisOS CASE thisOS of MAC : SET_PLOT thisOS WIN : SET_PLOT thisOS ELSE: SET_PLOT X ENDCASE p BACKGROUND d n_colors 1 255 p color 0 if d n_colors gt 256 then p background ffffff x ENDIF if arg_present get_name then begin if n_elements numpal EQ 0 then loadct file nametbl GET_NAME get_name _EXTRA ex ELSE loadct numpal file nametbl silent GET_NAME get_name _EXTRA ex ENDIF ELSE BEGIN if n_elements numpal EQ 0 then loadct file nametbl _EXTRA ex ELSE loadct numpal file nametbl silent _EXTRA ex ENDELSE if oldname EQ PS AND keyword_set lightness then palit lightness set_plot oldname IF oldname EQ X OR oldname EQ MAC OR oldname EQ WIN then BEGIN p BACKGROUND d n_colors 1 255 p color 0 if d n_colors gt 256 then p background ffffff x ENDIF ENDIF ELSE ras report The file containing the color palettes doesn t exist return end"); a[13] = new Array("./Colors/newpalette.html", "newpalette.pro", "", " file_comments Allows to save the palette which is on the screen in a same type file than the one given by default in IDL colors1 tbl categories Color param namepal in required type string the name of the new palette we want to write keyword OVER the number of the palette we want to replace keyword FILE default palette tbl The file containing the color palettes It can be in any directory of the path keyword _EXTRA Used to pass keywords to MODIFYCT history Guillaume Roullet gr lodyc jussieu fr 30 3 1999 s masson add _extra research of the full name OVER 5 5 1999 s masson version Id: newpalette pro 327 2007 12 13 16:22:35Z pinsard PRO newpalette namepal FILE file OVER over _EXTRA ex compile_opt idl2 strictarrsubs cm_general homedir isadirectory homedir title select MyIDL directory definition of the name of the file containing colors palettes if keyword_set file then nametbl file ELSE nametbl palette tbl look for nametbl file namesave nametbl nametbl find nametbl firstfound nopro no file nametbl found do we create one if nametbl EQ NOT FOUND then BEGIN nametbl file_basename namesave get back the original nametbl noanswer report The file nametbl was not found path directories Do you want to create such a file in your MyIDL directory: homedir default_no question if NOT noanswer then return nameorg filepath colors1 tbl subdir resource colors nametbl homedir file_basename nametbl update its name file_copy nameorg nametbl copy the file file_chmod nametbl u_write make sure we have write access ENDIF do we have write access IF file_test nametbl write EQ 0 THEN BEGIN noanswer report You have no write access on file nametbl Do you want to copy nameshort in your MyIDL directory: homedir default_no question IF noanswer THEN return ELSE BEGIN nametbl homedir file_basename nametbl update its name file_copy nametbl homedir allow_same copy the file file_chmod nametbl u_write make sure we have write access ENDELSE ENDIF make sure that we will really use nametbl name even if _EXTRA keyword is used if n_elements ex NE 0 then if where tag_names ex EQ FILE 0 NE 1 then ex FILE nametbl tvlct r g b get r congrid r 256 g congrid g 256 b congrid b 256 IF n_elements over EQ 0 then over 255 modifyct over namepal r g b file nametbl _extra ex return end"); a[14] = new Array("./Colors/xlct.html", "xlct.pro", "", " hidden PRO xlct_psave Save Restore our plotting state Swaps our state with the current state each time its called compile_opt idl2 strictarrsubs COMMON xlct_com r0 g0 b0 tfun state filename cps psave pnt top bot silent chop lock g_lbl vbot vtop g_slider gamma color use_values ncolors cbot siz w_height show_win updt_callback updt_cb_data tmp xlct_psave win: d window x: x s y: y s xtype: x type ytype: y type clip: p clip wset psave win x type psave xtype y type psave ytype x s psave x y s psave y p clip psave clip psave tmp end hidden pro xlct_alert_caller compile_opt idl2 strictarrsubs COMMON xlct_com r0 g0 b0 tfun state filename cps psave pnt top bot silent chop lock g_lbl vbot vtop g_slider gamma color use_values ncolors cbot siz w_height show_win updt_callback p_updt_cb_data ErrorStatus 0 CATCH ErrorStatus if ErrorStatus NE 0 then begin CATCH CANCEL v DIALOG_MESSAGE Unexpected error in XLCT: ERR_STRING ERR_STRING ERROR return endif if STRLEN updt_callback gt 0 then begin if PTR_VALID p_updt_cb_data then begin CALL_PROCEDURE updt_callback DATA p_updt_cb_data endif else begin CALL_PROCEDURE updt_callback endelse endif end Redraw the ramp image hidden PRO xlct_show compile_opt idl2 strictarrsubs COMMON xlct_com r0 g0 b0 tfun state filename cps psave pnt top bot silent chop lock g_lbl vbot vtop g_slider gamma color use_values ncolors cbot siz w_height show_win updt_callback p_updt_cb_data cur_win D WINDOW WSET show_win TV BYTE FLOAT ncolors FINDGEN siz FLOAT siz 1 REPLICATE 1 w_height BYTE cbot WSET cur_win Let the caller of XLCT know that the color table was modified xlct_alert_caller END hidden param i param c PRO xlct_draw_cps i c compile_opt idl2 strictarrsubs COMMON colors r_orig g_orig b_orig r_curr g_curr b_curr COMMON xlct_com r0 g0 b0 tfun state filename cps psave pnt top bot silent chop lock g_lbl vbot vtop g_slider gamma color use_values ncolors cbot tc color if n_elements c gt 0 then begin tc c if c ne 0 then color c endif if i 0 eq 1 then j indgen n_elements cps else j i plots cps j tfun j noclip color tc plots cps j tfun j noclip psym 6 color tc end hidden keyword UPDATE PRO xlct_transfer UPDATE update compile_opt idl2 strictarrsubs COMMON colors r_orig g_orig b_orig r_curr g_curr b_curr COMMON xlct_com r0 g0 b0 tfun state filename cps psave pnt top bot silent chop lock g_lbl vbot vtop g_slider gamma color use_values ncolors cbot l lonarr ncolors Subscripts m n_elements cps for i 0 m 2 do begin n cps i 1 cps i Interval b tfun i 1 tfun i float n l cps i findgen n b tfun i cbot endfor l ncolors 1 tfun m 1 Last point if use_values then begin r_curr cbot r l r_orig g_curr cbot g l g_orig b_curr cbot b l b_orig endif else begin r_curr cbot r r_orig l g_curr cbot g g_orig l b_curr cbot b b_orig l endelse tvlct r g b cbot if keyword_set update then xlct_show end hidden param event PRO xlct_event event compile_opt idl2 strictarrsubs COMMON colors r_orig g_orig b_orig r_curr g_curr b_curr COMMON xlct_com r0 g0 b0 tfun state filename cps psave pnt top bot silent chop lock g_lbl vbot vtop g_slider gamma color use_values ncolors cbot siz w_height show_win updt_callback p_updt_cb_data IF event id eq state draw THEN BEGIN PROCESS DRAWABLE EVENTS if event press ne 0 then begin Pressed button dmin 1 0e8 Find closest control pnt xlct_psave Remove old p convert_coord event x event y TO_DATA DEVICE xlct_psave Restore old x fix p 0 y fix p 1 for i 0 n_elements cps 1 do begin d p 0 cps i 2 p 1 tfun i 2 dist 2 if d lt dmin then begin dmin d pnt i endif endfor return endif if event release ne 0 then begin Released button pnt 1 xlct_transfer update return endif if pnt lt 0 then return Don t care here xlct_psave Remove old For visuals with static colormaps erase plot before drawing new if COLORMAP_APPLICABLE redrawRequired GT 0 and redrawRequired GT 0 then begin ERASE color 0 endif p convert_coord event x event y TO_DATA DEVICE Coord of mouse n ncolors 1 Into range m n_elements cps 1 x fix p 0 0 cps pnt 1 1 0 0 0 0 0 else s findgen nc s nc int nc 0 0 gamma nc if chop ne 0 then begin too_high where s ge nc n if n gt 0 then s too_high 0L endif if use_values then begin s s 1 cps cps keep tfun tfun keep goto interp_cps ENDIF ENDCASE ADDCP : BEGIN xlct_psave xlct_draw_cps 1 0 igap 0 Find largest gap for i 0 n_elements cps 2 do if cps i 1 cps i gt cps igap 1 cps igap then igap i cps cps 0:igap cps igap cps igap 1 2 cps igap 1: tfun tfun 0:igap tfun igap tfun igap 1 2 tfun igap 1: interp_cps: xlct_draw_cps 1 Redraw new xlct_transfer update xlct_psave Restore old points if n_elements reset_all then goto reset_all ENDCASE ENDCASE END file_comments Like XLOADCT but fastest to write and call by default the palette palette tbl which can be in any directory categories Widget Color keyword FILE default palette tbl If this keyword is set the file by the given name is used instead of the file colors1 tbl in the IDL directory This allows multiple IDL users to have their own color table file keyword GROUP The widget ID of the widget that calls Xlct When this ID is specified a death of the caller results in a death of Xlct keyword NCOLORS default D TABLE_SIZE all available colors number of colors to use Use color indexes from BOTTOM to the smaller of D TABLE_SIZE 1 and NCOLORS 1 keyword BOTTOM default 0 first color index to use Use color indexes from BOTTOM to BOTTOM NCOLORS 1 keyword SILENT Normally no informational message is printed when a color map is loaded If this keyword is present and zero this message is printed keyword USE_CURRENT If set use the current color tables regardless of the contents of the COMMON block COLORS keyword MODAL default not run in modal mode If set then XLCT runs in modal mode meaning that all other widgets are blocked until the user quits XLCT A group leader must be specified via the GROUP keyword for the MODAL keyword to have any effect keyword BLOCK Set this keyword to have XMANAGER block when this application is registered By default the Xmanager keyword NO_BLOCK is set to 1 to provide access to the command line if active command line processing is available Note that setting BLOCK for this application will cause all widget applications to block not only this application For more information see the NO_BLOCK keyword to XMANAGER keyword UPDATECALLBACK Set this keyword to a string containing the name of a user supplied procedure that will be called when the color table is updated by XLCT The procedure may optionally accept a keyword called DATA which will be automatically set to the value specified by the optional UPDATECBDATA keyword keyword UPDATECBDATA Set this keyword to a value of any type It will be passed via the DATA keyword to the user supplied procedure specified via the UPDATECALLBACK keyword if any If the UPDATECBDATA keyword is not set the value accepted by the DATA keyword to the procedure specified by UPDATECALLBACK will be undefined history 5 5 1999 copy of xloadct par Sebastien Masson smasson lodyc jussieu fr version Id: xlct pro 327 2007 12 13 16:22:35Z pinsard PRO xlct SILENT silent_f GROUP group FILE file USE_CURRENT use_current NCOLORS nc BOTTOM bottom MODAL modal BLOCK block UPDATECALLBACK updt_cb_name UPDATECBDATA updt_cb_data compile_opt idl2 strictarrsubs COMMON colors r_orig g_orig b_orig r_curr g_curr b_curr COMMON xlct_com r0 g0 b0 tfun state filename cps psave pnt top bot silent chop lock g_lbl vbot vtop g_slider gamma color use_values ncolors cbot siz w_height show_win updt_callback p_updt_cb_data IF XRegistered xlct NE 0 THEN return IF N_ELEMENTS block EQ 0 THEN block 0 IF N_ELEMENTS updt_cb_name EQ 0 THEN updt_callback ELSE updt_callback updt_cb_name IF N_ELEMENTS updt_cb_data GT 0 THEN p_updt_cb_data PTR_NEW updt_cb_data ELSE p_updt_cb_data PTR_NEW values_button lonarr 2 IF KEYWORD_SET SILENT_f THEN silent SILENT_F ELSE silent 1 Changes made by S Masson IF N_ELEMENTS file GT 0 THEN filename file ELSE BEGIN filename find palette tbl firstfound nopro if filename EQ NOT FOUND then filename filepath colors1 tbl subdir resource colors ENDELSE file filename siz 256 Basic width of tool names 0 LOADCT GET_NAMES names FILE file Get table names w_height 50 Height of ramp cur_win D WINDOW lock 0 chop 0 vbot 0 vtop 100 gamma 1 0 use_values 0 Bases: 0 slider base stretch bottom stretch top gamma 1 transfer function drawable buttons 2 color table list 3 options base sliders top stretch state bases: lonarr 4 draw: 0L name_list: 0L DJC Added modal keyword Moved group_leader keyword from XMANAGER to WIDGET_BASE Ignore modal keyword if a group leader is not supplied if N_ELEMENTS group GT 0L then base WIDGET_BASE TITLE Xlct COLUMN GROUP_LEADER group MODAL KEYWORD_SET modal else base WIDGET_BASE TITLE Xlct COLUMN Setting the managed attribute indicates our intention to put this app under the control of XMANAGER and prevents our draw widgets from becoming candidates for becoming the default window on WSET 1 XMANAGER sets this but doing it here prevents our own WSETs at startup from having that problem WIDGET_CONTROL MANAGED base show WIDGET_DRAW base YSIZE w_height XSIZE siz FRAME RETAIN 2 junk WIDGET_BASE base ROW done WIDGET_BUTTON junk VALUE Done UVALUE DONE junk1 WIDGET_BUTTON junk VALUE Help UVALUE HELP junk CW_BGROUP base ROW EXCLUSIVE NO_REL Tables Options Function UVALUE NEWBASE SET_VALUE 0 junk widget_base base for i 0 1 do state bases i WIDGET_BASE junk COLUMN sbase WIDGET_BASE state bases 0 COLUMN bot WIDGET_SLIDER sbase TITLE Stretch Bottom MINIMUM 0 MAXIMUM 100 VALUE 0 DRAG UVALUE BOTTOM xsize siz top WIDGET_SLIDER sbase TITLE Stretch Top MINIMUM 0 MAXIMUM 100 VALUE 100 DRAG UVALUE TOP xsize siz g_lbl WIDGET_LABEL sbase VALUE STRING 1 0 g_slider WIDGET_slider sbase TITLE Gamma Correction MINIMUM 0 MAXIMUM 100 VALUE 50 UVALUE GAMMA SUPPRESS_VALUE DRAG xsize siz junk WIDGET_BASE sbase for i 2 3 do state bases i WIDGET_BASE junk COLUMN DEVICE GET_SCREEN junk if junk 1 le 768 then junk 8 else junk 16 state name_list WIDGET_LIST state bases 2 VALUE names ysize junk Drawable for transfer function junk WIDGET_BASE state bases 1 COLUMN FRAME junk1 WIDGET_BUTTON junk VALUE Reset Transfer Function UVALUE TFUNR junk1 WIDGET_BUTTON junk VALUE Add Control Point UVALUE ADDCP junk1 WIDGET_BUTTON junk VALUE Remove Control Point UVALUE REMCP state draw WIDGET_DRAW state bases 1 xsize siz ysize siz BUTTON_EVENTS MOTION_EVENTS opt_id state bases 3 junk CW_BGROUP opt_id ROW LABEL_LEFT Sliders: EXCLUSIVE NO_REL Independent Gang UVALUE GANG SET_VALUE lock junk CW_BGROUP opt_id ROW LABEL_LEFT Top: EXCLUSIVE NO_REL Clip Chop SET_VALUE chop UVALUE CHOP junk CW_BGROUP opt_id ROW LABEL_LEFT Stretch: EXCLUSIVE NO_REL Indices Intensity UVALUE VALUES SET_VALUE use_values junk WIDGET_BUTTON opt_id VALUE Reverse Table UVALUE REVERSE NO_REL junk WIDGET_BUTTON opt_id VALUE REPLACE Original Table UVALUE OVERWRITE NO_REL junk WIDGET_BUTTON opt_id VALUE RESTORE Original Table UVALUE RESTORE NO_REL WIDGET_CONTROL state bases 1 MAP 0 Tfun is not visible WIDGET_CONTROL state bases 3 MAP 0 options are not visible WIDGET_CONTROL base REALIZE WIDGET_CONTROL state draw GET_VALUE tmp if n_elements bottom gt 0 then cbot bottom else cbot 0 ncolors d table_size cbot if n_elements nc gt 0 then ncolors ncolors nc if ncolors le 0 then message Number of colors is 0 or negative psave xlct_psave win: d window x: x s y: y s xtype: x type ytype: y type clip: p clip Our initial state wset tmp Initial graph xlct_psave Save original scaling window plot 0 ncolors 1 0 ncolors 1 xstyle 3 ystyle 3 xmargin 1 1 ymargin 1 1 ticklen 0 03 NODATA xlct_psave Restore original scaling window If no common use current colors IF KEYWORD_SET use_current or N_ELEMENTS r_orig LE 0 THEN BEGIN TVLCT r_orig g_orig b_orig GET r_curr r_orig b_curr b_orig g_curr g_orig ENDIF r0 r_curr Save original colors g0 g_curr b0 b_curr color ncolors cbot 1 cps 0 ncolors 1 tfun cps pnt 1 WIDGET_CONTROL show GET_VALUE show_win WSET show_win DJC fixed color bar display bug TVSCL BYTSCL INDGEN siz REPLICATE 1 w_height top ncolors 1 TV BYTE FLOAT ncolors FINDGEN siz FLOAT siz 1 REPLICATE 1 w_height BYTE cbot WSET cur_win DJC moved GROUP_LEADER keyword to WIDGET_BASE XManager xlct base NO_BLOCK NOT FLOAT block MODAL KEYWORD_SET modal END"); a[15] = new Array("./Colors/xpal.html", "xpal.pro", "", " file_comments Choose the best foreground and background colors for the current color maps and set P appropriately returns 1 if the colors changed 0 otherwise hidden FUNCTION xp_new_colors compile_opt idl2 strictarrsubs common xp_com xpw state res 0 junk CT_LUMINANCE dark dark_col bright bright_col if bright_col ne p color then begin p color bright_col res 1 endif if dark_col ne p background then begin p background dark_col res 1 endif return res end hidden PRO xp_alert_caller compile_opt idl2 strictarrsubs common xp_com xpw state ErrorStatus 0 CATCH ErrorStatus if ErrorStatus NE 0 then begin CATCH CANCEL v DIALOG_MESSAGE Unexpected error in XPAL: ERR_STRING ERR_STRING ERROR return endif if STRLEN state updt_callback gt 0 then begin if PTR_VALID state p_updt_cb_data then begin CALL_PROCEDURE state updt_callback DATA state p_updt_cb_data endif else begin CALL_PROCEDURE state updt_callback endelse endif end For visuals with static colormaps update the graphics after a change by XLOADCT hidden PRO xp_xlctcallback compile_opt idl2 strictarrsubs if COLORMAP_APPLICABLE redrawRequired GT 0 and redrawRequired GT 0 then begin XP_REDRAW endif end hidden PRO xp_redraw compile_opt idl2 strictarrsubs common xp_com xpw state junk XP_NEW_COLORS WIDGET_CONTROL xpw colorsel set_value 1 XP_REPLOT p color F Update the plots of RGB Let the caller of XPAL know that the color table was modified XP_ALERT_CALLER end hidden file_comments Re draw the RGB plots param color_index param type Type has the following possible values D : Draw the data part of all three plots F : draw all three plots R : Draw the data part of the Red plot G : Draw the data part of the Green plot PRO xp_replot color_index type compile_opt idl2 strictarrsubs common xp_com xpw state common colors r_orig g_orig b_orig r_curr g_curr b_curr common pscale r_x_s r_y_s g_x_s g_y_s b_x_s b_y_s Update the plots of RGB save_win D WINDOW wset state plot_win save_p_region p region save_x_margin x margin save_y_margin y margin save_x_s x s save_y_s y s save_x_type x type save_y_type y type y margin 2 2 x margin 6 2 if type eq F then begin p region 0 6667 1 1 plot xstyle 2 ystyle 3 yrange 0 260 r_curr title Red r_x_s x s r_y_s y s p region 0 333 1 6667 plot noerase xstyle 2 ystyle 3 yrange 0 260 g_curr title Green g_x_s x s g_y_s y s p region 0 0 1 333 plot noerase xstyle 2 ystyle 3 yrange 0 260 b_curr title Blue b_x_s x s b_y_s y s endif else begin if type eq D or type eq R then begin p region 0 6667 1 1 x s r_x_s y s r_y_s oplot r_curr color color_index endif if type eq D or type eq G then begin p region 0 333 1 6667 x s g_x_s y s g_y_s oplot g_curr color color_index endif if type eq D or type eq B then begin p region 0 0 1 333 x s b_x_s y s b_y_s oplot b_curr color color_index endif endelse empty WSET save_win p region save_p_region x margin save_x_margin y margin save_y_margin x s save_x_s y s save_y_s x type save_x_type y type save_y_type end hidden file_comments Change current color param type Type has the following possible values R : Change the R part of the current color G : B : param value PRO xp_change_color type value compile_opt idl2 strictarrsubs common xp_com xpw state common colors r_orig g_orig b_orig r_curr g_curr b_curr cur_idx state cur_idx XP_REPLOT p background type if type eq R then r_curr cur_idx value if type eq G then g_curr cur_idx value if type eq B then b_curr cur_idx value tvlct r_curr cur_idx g_curr cur_idx b_curr cur_idx cur_idx if XP_NEW_COLORS then begin Highlight the current position using the marker WIDGET_CONTROL xpw colorsel set_value 1 Re initialize XP_REPLOT p color F endif else begin XP_REPLOT p color type endelse For visuals with static colormaps update the graphics of the current color if COLORMAP_APPLICABLE redrawRequired GT 0 and redrawRequired GT 0 then begin Mark new square tmp D WINDOW wset state cur_color_win erase color state cur_idx wset tmp endif Let the caller of XPAL know that the color table was modified xp_alert_caller end param event hidden PRO xp_button_event event compile_opt idl2 strictarrsubs common xp_com xpw state common colors r_orig g_orig b_orig r_curr g_curr b_curr NOTE: The value of these tags depend on the order of the buttons in the base case event value of DONE 0: begin empty r_orig r_curr g_orig g_curr b_orig b_curr new orig color tbl WIDGET_CONTROL DESTROY event top p state old_p end PREDEFINED 1: xlct silent group xpw base UPDATECALLBACK XP_XLCTCALLBACK HELP 2: XDisplayFile FILEPATH xpal txt subdir help widget TITLE Xpal Help GROUP event top WIDTH 55 HEIGHT 16 REDRAW 3: XP_REDRAW SET MARK 4: begin state mark_idx state cur_idx WIDGET_CONTROL xpw mark_label set_value strcompress state mark_idx REMOVE end SWITCH MARK 5 : if state mark_idx ne state cur_idx then begin tmp state mark_idx state mark_idx state cur_idx state cur_idx tmp WIDGET_CONTROL xpw colorsel set_value tmp WIDGET_CONTROL xpw idx_label set_value strcompress state cur_idx REMOVE WIDGET_CONTROL xpw mark_label set_value strcompress state mark_idx REMOVE endif COPY CURRENT 6 : begin do_copy: cur_idx state cur_idx if state mark_idx le cur_idx then begin s state mark_idx e cur_idx endif else begin s cur_idx e state mark_idx endelse n e s 1 XP_REPLOT p background D if event value eq 6 then begin r_curr s:e r_curr cur_idx g_curr s:e g_curr cur_idx b_curr s:e b_curr cur_idx endif else begin Interpolate scale findgen n float n 1 r_curr s:e r_curr s fix r_curr e fix r_curr s scale g_curr s:e g_curr s fix g_curr e fix g_curr s scale b_curr s:e b_curr s fix b_curr e fix b_curr s scale endelse tvlct r_curr s:e g_curr s:e b_curr s:e s if XP_NEW_COLORS then begin WIDGET_CONTROL xpw colorsel SET_VALUE 1 XP_REPLOT p color F endif else begin XP_REPLOT p color D endelse Let the caller of XPAL know that the color table was modified xp_alert_caller end 7: goto do_copy 8: BEGIN COMMON basecommon bas212 bas222 bas232 base WIDGET_BASE COLUMN FRAME bas1 WIDGET_LABEL base value Save bas2 WIDGET_BASE base COLUMN bas21 WIDGET_BASE bas2 COLUMN bas211 WIDGET_LABEL bas21 value Palette Name : bas212 WIDGET_TEXT bas21 value Noname editable bas22 WIDGET_BASE bas2 COLUMN bas221 WIDGET_LABEL bas22 value Overwrite palette number : bas222 WIDGET_TEXT bas22 value editable bas23 WIDGET_BASE bas2 COLUMN bas231 WIDGET_LABEL bas23 value file name : bas232 WIDGET_TEXT bas23 value palette tbl editable bas3 WIDGET_BASE base ROW ok WIDGET_BUTTON bas3 value OK ALIGN_LEFT FRAME UVALUE ok cancel WIDGET_BUTTON bas3 value CANCEL ALIGN_RIGHT FRAME UVALUE cancel WIDGET_CONTROL base REALIZE WIDGET_CONTROL base SET_UVALUE drawID XMANAGER xp_button_event base END else: endcase end hidden param ev PRO xp_button_event_event ev compile_opt idl2 strictarrsubs COMMON basecommon bas212 bas222 bas232 WIDGET_CONTROL ev id GET_UVALUE uval IF TAG_NAMES ev STRUCTURE_NAME EQ WIDGET_BUTTON THEN BEGIN CASE uval OF ok :BEGIN WIDGET_CONTROL bas212 GET_VALUE palname WIDGET_CONTROL bas222 GET_VALUE over WIDGET_CONTROL bas232 GET_VALUE fichname if over 0 EQ then over 255 ELSE over long over newpalette palname 0 OVER over 0 file fichname 0 WIDGET_CONTROL ev top DESTROY END cancel : WIDGET_CONTROL ev top DESTROY ENDCASE ENDIF END param event hidden PRO xp_event event compile_opt idl2 strictarrsubs common xp_com xpw state common colors r_orig g_orig b_orig r_curr g_curr b_curr case event id of xpw button_base: XP_BUTTON_EVENT event xpw rgb_base: begin cur_idx state cur_idx if event r ne r_curr cur_idx then XP_CHANGE_COLOR R event r if event g ne g_curr cur_idx then XP_CHANGE_COLOR G event g if event b ne b_curr cur_idx then XP_CHANGE_COLOR B event b end xpw colorsel: begin cur_idx state cur_idx new_pos event value ne cur_idx Update the RBG sliders if event value ne cur_idx then begin state cur_idx cur_idx event value WIDGET_CONTROL xpw idx_label set_value strcompress cur_idx REMOVE_ALL Mark new square tmp D WINDOW wset state cur_color_win erase color cur_idx wset tmp WIDGET_CONTROL xpw rgb_base set_value r_curr cur_idx g_curr cur_idx b_curr cur_idx endif end else: endcase END file_comments Like XPALETTE but shorter to write and moreover possess a hotkey save which thanks to the newpalette routine allows to save the routine that we have just done Comment: when we press the predefined hotkey it calls xlct instead of XLOADCT No explicit inputs The current color table is used as a starting point categories Color Widget uses XP_COM Private to this module restrictions XPAL uses two colors from the current color table as drawing foreground and background colors These are used for the RGB plots on the left and the current index marker on the right This means that if the user set these two colors to the same value the XPAL display could become unreadable like writing on black paper with black ink XPAL minimizes this possibility by noting changes to the color map and always using the brightest available color for the foreground color and the darkest for the background Thus the only way to make XPAL s display unreadable is to set the entire color map to a single color which is highly unlikely The only side effect of this policy is that you may notice XPAL redrawing the entire display after you ve modified the current color This simply means that the change has made XPAL pick new drawing colors The new color tables are saved in the COLORS common and loaded to the display examples The XPAL widget has the following controls: Left: Three plots showing the current Red Green and Blue vectors Center: A status region containing: 1 The total number of colors 2 The current color XPAL allows changing one color at a time This color is known as the current color and is indicated in the color spectrum display with a special marker 3 The current mark index The mark is used to remember a color index It is established by pressing the Set Mark Button while the current color index is the desired mark index 4 The current color The special marker used in color spectrum display prevents the user from seeing the color of the current index but it is visible here A panel of control buttons which do the following when pressed: Done: Exits XPAL Predefined: Starts XLOADCT to allow selection of one of the predefined color tables Help: Supplies help information similar to this header Redraw: Completely redraws the display using the current state of the color map Set Mark: Set the value of the mark index to the current index Switch Mark: Exchange the mark and the current index Copy Current: Every color lying between the current index and the mark index inclusive is given the current color Interpolate: The colors lying between the current index and the mark index are interpolated linearly to lie between the colors of two endpoints save: Allows to save the palette which is currently on the screen When we press this hotkey there is a widget who appear and ask: 1 the name of the palette we want to save 2 The number of the palette we may want to erase by the new palette If there is not any number specified the new palette is add to elders 3 The name of the file containing palettes Comment: May follow instructions gave by the prompter Three sliders R G and B that allow the user to modify the current color Right: A display which shows the current color map as a series of squares Color index 0 is at the upper left The color index increases monotonically by rows going left to right and top to bottom The current color index is indicated by a special marker symbol There are 4 ways to change the current color: 1 Press any mouse button while the mouse pointer is over the color map display 2 Use the By Index slider to move to the desired color index 3 Use the Row Slider to move the marker vertically 4 Use the Column Slider to move the marker horizontally keyword GROUP The widget ID of the widget that calls xpal When this ID is specified a death of the caller results in a death of xpal keyword BLOCK default 1 Set this keyword to have XMANAGER block when this application is registered By default the Xmanager keyword NO_BLOCK is set to 1 to provide access to the command line if active command line processing is available Note that setting BLOCK for this application will cause all widget applications to block not only this application For more information see the NO_BLOCK keyword to XMANAGER keyword UPDATECALLBACK Set this keyword to a string containing the name of a user supplied procedure that will be called when the color table is updated by XLOADCT The procedure may optionally accept a keyword called DATA which will be automatically set to the value specified by the optional UPDATECBDATA keyword keyword UPDATECBDATA Set this keyword to a value of any type It will be passed via the DATA keyword to the user supplied procedure specified via the UPDATECALLBACK keyword if any If the UPDATECBDATA keyword is not set the value accepted by the DATA keyword to the procedure specified by UPDATECALLBACK will be undefined history Adaptation of xpalette to add a save button by Grima Nicolas nglod ipsl jussieu fr and by Masson Sebastien smlod ipsl jussieu fr version Id: xpal pro 325 2007 12 06 10:04:53Z pinsard PRO xpal GROUP group BLOCK block UPDATECALLBACK updt_cb_name UPDATECBDATA updt_cb_data compile_opt idl2 strictarrsubs common xp_com xpw state common colors r_orig g_orig b_orig r_curr g_curr b_curr IF N_ELEMENTS updt_cb_name EQ 0 THEN updt_callback ELSE updt_callback updt_cb_name IF N_ELEMENTS updt_cb_data GT 0 THEN p_updt_cb_data PTR_NEW updt_cb_data ELSE p_updt_cb_data PTR_NEW xpw xp_widgets base:0L colorsel:0L mark_label:0L idx_label:0L button_base:0L rgb_base:0L state old_p: p Original value of P mark_idx:0 Current mark index cur_idx:0 Current index cur_color_win:0 Current Color draw window index plot_win:0 RGB plot draw window index updt_callback: updt_callback user defined callback optional p_updt_cb_data:p_updt_cb_data data for callback optional if XREGISTERED XPAL then return Only one copy at a time IF N_ELEMENTS block EQ 0 THEN block 0 on_error 2 Return to caller if an error occurs nc d table_size of colors avail if nc eq 0 then message Device has static color tables Can t modify if nc eq 2 then message Unable to work with monochrome system state old_p p Save p p noclip 1 No clipping p color nc 1 Foreground color p font 0 Hdw font save_win d window Previous window IF N_ELEMENTS r_orig LE 0 THEN BEGIN If no common use current colors TVLCT r_orig g_orig b_orig GET r_curr r_orig b_curr b_orig g_curr g_orig ENDIF Create widgets xpw base WIDGET_BASE title Xpal ROW space 30 This is a little tricky Setting the managed attribute indicates our intention to put this app under the control of XMANAGER and prevents our draw widgets from becoming candidates for becoming the default window on WSET 1 XMANAGER sets this but doing it here prevents our own WSETs at startup from having that problem WIDGET_CONTROL MANAGED xpw base version WIDGET_INFO VERSION if version style Motif then junk 510 else junk 580 plot_frame WIDGET_DRAW xpw base xsize 200 ysize junk c1 WIDGET_BASE xpw base COLUMN space 20 status WIDGET_BASE c1 COLUMN FRAME ncw WIDGET_LABEL WIDGET_BASE status DYNAMIC_RESIZE xpw idx_label CW_FIELD status title Current Index: value 0 xsize 20 STRING xpw mark_label CW_FIELD status title Mark Index: value 0 xsize 20 STRING c1_1 widget_base status ROW junk WIDGET_LABEL c1_1 value Current Color: cur_color WIDGET_DRAW c1_1 xsize 125 ysize 50 frame names Done Predefined Help Redraw Set Mark Switch Mark Copy Current Interpolate save xpw button_base CW_BGROUP c1 names COLUMN 3 FRAME xpw rgb_base CW_RGBSLIDER c1 FRAME DRAG junk WIDGET_BASE xpw base Responds to YOFFSET if version style Motif then junk2 30 else junk2 50 xpw colorsel CW_COLORSEL junk yoffset junk2 state cur_idx 0 state mark_idx 0 Position RGB slider appropriately WIDGET_CONTROL xpw rgb_base SET_VALUE r_curr 0 g_curr 0 b_curr 0 WIDGET_CONTROL REALIZE xpw base WIDGET_CONTROL ncw set_value Number Of Colors: strcompress d n_colors REMOVE_ALL WIDGET_CONTROL get_value tmp cur_color state cur_color_win tmp WIDGET_CONTROL get_value tmp plot_frame state plot_win tmp Update the plots of RGB junk XP_NEW_COLORS XP_REPLOT p color F WSET save_win XMANAGER Xpal xpw base event_handler XP_EVENT group group NO_BLOCK NOT FLOAT block end"); a[16] = new Array("./Commons/all_cm.html", "all_cm.pro", "", ""); a[17] = new Array("./Commons/cm_4cal.html", "cm_4cal.pro", "", ""); a[18] = new Array("./Commons/cm_4data.html", "cm_4data.pro", "", ""); a[19] = new Array("./Commons/cm_4mesh.html", "cm_4mesh.pro", "", ""); a[20] = new Array("./Commons/cm_4ps.html", "cm_4ps.pro", "", ""); a[21] = new Array("./Commons/cm_demomode.html", "cm_demomode.pro", "", ""); a[22] = new Array("./Commons/cm_general.html", "cm_general.pro", "", ""); a[23] = new Array("./Computation/bsf.html", "bsf.pro", "", " file_comments compute the barotropic along the model grid stream function in Sv using the following equation: total total e2u e3u un 3 2 cumulative 1 e6 categories diagnostics param z3d in type 3D xyz array zonal velocity keyword NOSTRUCTURE default 0 type scalar: 0 or 1 activate if you do not want that msf returns a structure but only the array referring to the field keyword REFPOINT type 2 element vector a 2 element vector x y giving the approximative position of the point that should be taken as a reference This position should be given with the same coordinates system as the one used in glam gphi see example keyword REFVALUE type scalar default 0 the bsf value that we want to speficy at the position defined by refpoint returns type 2D xy array barotropic stream function in Sv uses cm_4mesh cm_4data grille litchamp fitintobox restrictions T and U boxzoom parameters must be the same to be valid mask must be equal to 0 at the bottom and on each side of the domain along x direction define the common variables of cm_4data varname BSF varunit Sv vargrid F examples IDL initorca05 IDL file Volumes pim F31 oce 1y F31_1y_0040_0040_grid_U nc IDL un read_ncdf vozocrtx 0 0 timestep file file IDL bar bsf un refvalue 0 refpoint 0 20 IDL plt bar 150 150 int 10 style so0so format i4 lct 64 history Gurvan Madec Christian Ethe Claude Talandier and Sebastien Masson Dec 2008 version Id: bsf pro 388 2008 12 09 09:36:41Z smasson FUNCTION bsf z3d NOSTRUCTURE nostructure REFPOINT refpoint REFVALUE refvalue compile_opt idl2 strictarrsubs cm_4mesh cm_4data CASE 1 OF firstxt NE firstxu OR lastxt NE lastxu: return report T and U box must be defined over the same x indexes use memeindices when calling domdef firstyt NE firstyu OR lastyt NE lastyu: return report T and U box must be defined over the same y indexes use memeindices when calling domdef ELSE: ENDCASE grille 1 1 1 1 nx ny nz firstx firsty firstz lastx lasty lastz grid T umsk umask firstx:lastx firsty:lasty firstz:lastz IF total umsk nz 1 NE 0 THEN return report The bottom of the box defined by lastzt must be set to land value 0 IF total umsk 0 NE 0 THEN return report southern boudary must be land point if you want to compute the bsf with this function un litchamp z3d IF size un n_dimensions NE 3 THEN return report input data must be a 3D array un fitintobox temporary un IF keyword_set key_partialstep THEN BEGIN 2D e3u at the bottom of the ocean see zgr_zps: e3u ji jj jk MIN e3t ji jj jk e3t ji 1 jj jk e3u_ps e3t_ps firstx:lastx firsty:lasty shift e3t_ps firstx:lastx firsty:lasty 1 0 e3u_ps min temporary e3u_ps dimension 3 flagdata NOT keyword_set key_periodic AND nx EQ jpi AND total umsk nx 1 NE 0 level of the bottom of the ocean bottom total tmask firstx:lastx firsty:lasty firstz:lastz 3 bottom 0L long temporary bottom 1L the bottom of the ocean in 3D index is: bottom lindgen nx ny temporary bottom nx ny 3D e3t array e33 replicate 1 nx ny e3t firstz:lastz apply e3u_ps to e33 at the bottom of the ocean e33 temporary bottom e3u_ps 3D e2u array e23d e2u firstx:lastx firsty:lasty replicate 1 nzt e2u e3u e23 temporary e23d temporary e33 ENDIF ELSE BEGIN e23 e2u firstx:lastx firsty:lasty e3t firstz:lastz ENDELSE mask the array un temporary umsk temporary un compute the bsf bsf 1 e 6 total total temporary un temporary e23 3 2 cumulative set bsf to 0 in the largest continent no done IF keyword_set refpoint THEN BEGIN refind neighbor refpoint 0 refpoint 1 glamf firstx:lastx firsty:lasty gphif firstx:lastx firsty:lasty SPHERE key_onearth IF n_elements refvalue EQ 0 THEN refval bsf refind 0 ELSE refval refvalue bsf refind 0 bsf temporary bsf refval ENDIF IF keyword_set flagdata THEN bsf nx 1 values f_nan update data informations varname BSF varunit Sv vargrid F IF keyword_set nostructure THEN return bsf IF keyword_set key_forgetold THEN BEGIN return arr:temporary bsf grid:vargrid unit:varunit experiment:varexp name:varname ENDIF ELSE BEGIN return tab:temporary bsf grille:vargrid unite:varunit experience:varexp nom:varname ENDELSE END"); a[24] = new Array("./Computation/curl.html", "curl.pro", "", " file_comments Calculate the vertical component of the curl of a vectors field located on Arakawa C grid categories Calculation param UU Matrix representing the zonal coordinates at U point of a field of vectors A 2D xy 3D xyz or yt or a structure readable by litchamp and containing a 2D xy 3D xyz or yt array 4D case is not coded yet Note that the dimension of the array must suit the domain dimension param VV Matrix representing the meridional coordinates at V point of a field of vectors A 2D xy 3D xyz or yt or a structure readable by litchamp and containing a 2D xy 3D xyz or yt array 4D case is not coded yet Note that the dimension of the array must suit the domain dimension keyword DIREC type scalar string Use if you want to call moyenne or grossemoyenne after the div computation with a mean done in the DIREC direction keyword MILLION default 0 type scalar: 0 or 1 Activate to multiply returned array by 1 e6 keyword _EXTRA Used to declare that this routine accepts inherited keywords returns the vertical component of the curl of the input data with the same size located at F point see restrictions uses cm_4cal cm_4data cm_4mesh restrictions Works only for Arakawa C grid UU must be on U grid VV must be on V grid 4D case is not coded yet the common variable jpt is used to differ xyz jpt 1 and xyt jpt 1 cases U and V arrays are cut in the same geographic domain Because of the shift between T U V and F grids it is possible that these two arrays do not have the same size and refer to different indexes In this case arrays are re cut on common indexes To avoid these re cuts use the keyword memeindice in domdef When computing the divergence we update vargrid varname varunits and the grid position parameters firstxf lastxf nxf firstyf lastyf nyf points that cannot be computed domain boundaries coastline are set to NaN examples IDL tst_initorca2 IDL plt curl dist jpi jpj dist jpi jpj history Guillaume Roullet grlod ipsl jussieu fr Sebastien Masson smasson lodyc jussieu fr adaptation to work with a reduce domain 21 5 1999: missing values at values f_nan version Id: curl pro 371 2008 08 07 09:32:02Z pinsard todo code the 4D case FUNCTION curl uu vv DIREC direc MILLION million _EXTRA ex compile_opt idl2 strictarrsubs cm_4cal for jpt cm_4data for varname vargrid vardate varunit valmask cm_4mesh time1 systime 1 for key_performance IF finite glamu 0 finite gphiu 0 finite glamv 0 finite gphiv 0 EQ 0 THEN return report This version of curl is based on Arakawa C grid U and V grids must therefore be defined gr litchamp uu grid IF gr NE THEN BEGIN IF gr NE U THEN return report the first parameter is not located on U grid but on strtrim gr 2 grid ENDIF gr litchamp vv grid IF gr NE THEN BEGIN IF gr NE V THEN return report the second parameter is not located on V grid but on strtrim gr 2 grid ENDIF u litchamp uu v litchamp vv szu size u szv size v if szu 0 NE szv 0 then return report U and V input data must have the same number of dimensions We find common points between U and V indicexu lindgen jpi firstxu:firstxu nxu 1 indicexv lindgen jpi firstxv:firstxv nxv 1 indicex inter indicexu indicexv indiceyu lindgen jpj firstyu:firstyu nyu 1 indiceyv lindgen jpj firstyv:firstyv nyv 1 indicey inter indiceyu indiceyv nx n_elements indicex ny n_elements indicey indice2d lindgen jpi jpj indice2d indice2d indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 vargrid F varname vorticity IF keyword_set million THEN varunits 1 e6 varunit m ELSE varunits varunit m IF keyword_set million THEN scale 1 e6 ELSE scale 1 if n_elements valmask EQ 0 THEN valmask 1e20 firstxf indicex 0 lastxf indicex 0 nx 1 nxf nx firstyf indicey 0 lastyf indicey 0 ny 1 nyf ny case 1 of xyz szu 0 EQ 3 AND jpt EQ 1:BEGIN extraction of U and V on the appropriated domain case 1 of szu 1 EQ nxu AND szu 2 EQ nyu AND szv 1 EQ nxv AND szv 2 EQ nyv:BEGIN case 1 of nxu NE nx:if indicex 0 EQ firstxu then u u 0:nx 1 ELSE u u 1: nx nxv NE nx:if indicex 0 EQ firstxv then v v 0:nx 1 ELSE v v 1: nx nyu NE ny:if indicey 0 EQ firstyu then u u 0:ny 1 ELSE u u 1: ny nyv NE ny:if indicey 0 EQ firstyv then v v 0:ny 1 ELSE v v 1: ny ELSE : endcase END szu 1 EQ jpi AND szu 2 EQ jpj AND szv 1 EQ jpi AND szv 2 EQ jpj:BEGIN u u indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 v v indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 END ELSE:return 1 endcase curl computation coefu e1u indice2d replicate 1 nzt umask indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 firstzt:lastzt landu where coefu EQ 0 if landu 0 NE 1 then coefu temporary landu values f_nan coefv e2v indice2d replicate 1 nzt vmask indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 firstzt:lastzt landv where coefv EQ 0 if landv 0 NE 1 then coefv temporary landv values f_nan tabf scale fmask indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 firstzt:lastzt e1f indice2d e2f indice2d replicate 1 nzt landf where tabf EQ 0 zu temporary u temporary coefu zv temporary v temporary coefv psi shift zv 1 0 0 zv zu shift zu 0 1 0 psi temporary tabf temporary psi Edging put at values f_nan if NOT keyword_set key_periodic OR nx NE jpi then begin psi 0 values f_nan psi nx 1 values f_nan endif psi 0 values f_nan psi ny 1 values f_nan if landf 0 NE 1 then psi temporary landf valmask if keyword_set direc then psi moyenne psi direc nan END xyt szu 0 EQ 3 AND jpt GT 1:BEGIN extraction of U and V on the appropriated domain case 1 of szu 1 EQ nxu AND szu 2 EQ nyu AND szv 1 EQ nxv AND szv 2 EQ nyv:BEGIN if nxu NE nx then if indicex 0 EQ firstxu then u u 0:nx 1 ELSE u u 1: nx IF nxv NE nx THEN if indicex 0 EQ firstxv then v v 0:nx 1 ELSE v v 1: nx IF nyu NE ny THEN if indicey 0 EQ firstyu then u u 0:ny 1 ELSE u u 1: ny IF nyv NE ny THEN if indicey 0 EQ firstyv then v v 0:ny 1 ELSE v v 1: ny END szu 1 EQ jpi AND szu 2 EQ jpj AND szv 1 EQ jpi AND szv 2 EQ jpj:BEGIN u u indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 v v indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 END ELSE:return report We cannot find re cut on common indexes see restriction un the header To avoid this problem read the full domain or use the keyword memeindice in domdef when defining the zoom area ENDCASE curl computation coefu e1u indice2d umask indice2d jpi jpj firstzt landu where coefu EQ 0 if landu 0 NE 1 then coefu temporary landu values f_nan coefu temporary coefu replicate 1 jpt coefv e2v indice2d vmask indice2d jpi jpj firstzt landv where coefv EQ 0 if landv 0 NE 1 then coefv temporary landv values f_nan coefv temporary coefv replicate 1 jpt tabf scale fmask indice2d jpi jpj firstzt e1f indice2d e2f indice2d tabf reform temporary tabf replicate 1 jpt nx ny jpt overwrite landf where tabf EQ 0 zu temporary u temporary coefu zv temporary v temporary coefv psi shift zv 1 0 0 zv zu shift zu 0 1 0 psi temporary tabf temporary psi extraction of U and V on the appropriated domain if NOT keyword_set key_periodic OR nx NE jpi then begin psi 0 values f_nan psi nx 1 values f_nan endif psi 0 values f_nan psi ny 1 values f_nan if landf 0 NE 1 then psi temporary landf valmask if keyword_set direc then psi grossemoyenne psi direc nan END xyzt szu 0 EQ 4:BEGIN return report Case not coded contact saxo team or make a do loop END xy szu 0 EQ 2:BEGIN case 1 of szu 1 EQ nxu AND szu 2 EQ nyu AND szv 1 EQ nxv AND szv 2 EQ nyv:BEGIN if nxu NE nx then if indicex 0 EQ firstxu then u u 0:nx 1 ELSE u u 1: nx IF nxv NE nx THEN if indicex 0 EQ firstxv then v v 0:nx 1 ELSE v v 1: nx IF nyu NE ny THEN if indicey 0 EQ firstyu then u u 0:ny 1 ELSE u u 1: ny IF nyv NE ny THEN if indicey 0 EQ firstyv then v v 0:ny 1 ELSE v v 1: ny END szu 1 EQ jpi AND szu 2 EQ jpj AND szv 1 EQ jpi AND szv 2 EQ jpj:BEGIN u u indice2d v v indice2d END ELSE:return 1 endcase curl computation coefu e1u indice2d umask indice2d jpi jpj firstzt landu where coefu EQ 0 if landu 0 NE 1 then coefu temporary landu values f_nan coefv e2v indice2d vmask indice2d jpi jpj firstzt landv where coefv EQ 0 if landv 0 NE 1 then coefv temporary landv values f_nan tabf scale fmask indice2d jpi jpj firstzt e1f indice2d e2f indice2d landf where tabf EQ 0 zu temporary u temporary coefu zv temporary v temporary coefv psi shift zv 1 0 zv zu shift zu 0 1 psi temporary tabf temporary psi Edging put at values f_nan if NOT keyword_set key_periodic OR nx NE jpi then begin psi 0 values f_nan psi nx 1 values f_nan endif psi 0 values f_nan psi ny 1 values f_nan if landf 0 NE 1 then psi temporary landf valmask if keyword_set direc then psi moyenne psi direc nan END ELSE:return report U and V input arrays must have 2 3 or 4 dimensions ENDCASE if keyword_set key_performance THEN print time curl systime 1 time1 return psi end"); a[25] = new Array("./Computation/div.html", "div.pro", "", " file_comments compute the horizontal divergence of a vectors field located on Arakawa C grid categories Calculation param UU Matrix representing the zonal coordinates at U point of a field of vectors A 2D xy 3D xyz or yt or a structure readable by litchamp and containing a 2D xy 3D xyz or yt array 4D case is not coded yet note that the dimension of the array must suit the domain dimension param VV Matrix representing the meridional coordinates at V point of a field of vectors A 2D xy 3D xyz or yt or a structure readable by litchamp and containing a 2D xy 3D xyz or yt array 4D case is not coded yet note that the dimension of the array must suit the domain dimension keyword DIREC type scalar string Use if you want to call moyenne or grossemoyenne after the div computation stupid with a mean done in the DIREC direction keyword MILLION default 0 type scalar: 0 or 1 Activate to multiply returned array by 1 e6 keyword _EXTRA Used to declare that this routine accepts inherited keywords returns the divergence of the input data with the same size located at T point see restrictions uses cm_4cal cm_4data cm_4mesh restrictions Works only for Arakawa C grid UU must be on U grid VV must be on V grid 4D case is not coded yet the common variable jpt is used to differ xyz jpt 1 and xyt jpt 1 cases U and V arrays are cut in the same geographic domain Because of the shift between T U V and F grids it is possible that these two arrays do not have the same size and refer to different indexes In this case arrays are re cut on common indexes To avoid these re cuts use the keyword memeindice in domdef When computing the divergence we update vargrid varname varunits and the grid position parameters firstxt lastxt nxt firstyt lastyt nyt points that cannot be computed domain boundaries coastline are set to NaN examples IDL tst_initorca2 IDL plt div dist jpi jpj dist jpi jpj history Guillaume Roullet grlod ipsl jussieu fr : creation spring 1998 Sebastien Masson smasson lodyc jussieu fr adaptation to work with a reduce domain 12 1 2000 version Id: div pro 378 2008 08 12 12:35:46Z pinsard todo code the 4D case FUNCTION div uu vv DIREC direc MILLION million _EXTRA ex compile_opt idl2 strictarrsubs cm_4cal for jpt cm_4data for varname vargrid vardate varunit valmask cm_4mesh time1 systime 1 for key_performance IF finite glamu 0 finite gphiu 0 finite glamv 0 finite gphiv 0 EQ 0 THEN return report This version of div is based on Arakawa C grid U and V grids must therefore be defined gr litchamp uu grid IF gr NE THEN BEGIN IF gr NE U THEN return report the first parameter is not located on U grid but on strtrim gr 2 grid ENDIF gr litchamp vv grid IF gr NE THEN BEGIN IF gr NE V THEN return report the second parameter is not located on V grid but on strtrim gr 2 grid ENDIF u litchamp uu v litchamp vv szu size u szv size v if szu 0 NE szv 0 then return report U and V input data must have the same number of dimensions We find common points between U and V indicexu lindgen jpi firstxu:firstxu nxu 1 indicexv lindgen jpi firstxv:firstxv nxv 1 indicex inter indicexu indicexv indiceyu lindgen jpj firstyu:firstyu nyu 1 indiceyv lindgen jpj firstyv:firstyv nyv 1 indicey inter indiceyu indiceyv nx n_elements indicex ny n_elements indicey indice2d lindgen jpi jpj indice2d indice2d indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 vargrid T varname div IF keyword_set million THEN varunits 1 e6 varunit m ELSE varunits varunit m IF keyword_set million THEN scale 1 e6 ELSE scale 1 if n_elements valmask EQ 0 THEN valmask 1 e20 firstxt indicex 0 lastxt indicex 0 nx 1 nxt nx firstyt indicey 0 lastyt indicey 0 ny 1 nyt ny case 1 of xyz szu 0 EQ 3 AND jpt EQ 1:BEGIN extraction of U and V on the appropriated domain case 1 of szu 1 EQ nxu AND szu 2 EQ nyu AND szv 1 EQ nxv AND szv 2 EQ nyv:BEGIN case 1 of nxu NE nx:if indicex 0 EQ firstxu then u u 0:nx 1 ELSE u u 1: nx nxv NE nx:if indicex 0 EQ firstxv then v v 0:nx 1 ELSE v v 1: nx nyu NE ny:if indicey 0 EQ firstyu then u u 0:ny 1 ELSE u u 1: ny nyv NE ny:if indicey 0 EQ firstyv then v v 0:ny 1 ELSE v v 1: ny ELSE : endcase END szu 1 EQ jpi AND szu 2 EQ jpj AND szv 1 EQ jpi AND szv 2 EQ jpj:BEGIN u u indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 v v indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 END ELSE:return report We cannot find re cut on common indexes see restriction un the header To avoid this problem read the full domain or use the keyword memeindice in domdef when defining the zoom area ENDCASE divergence computation zu e2u indice2d replicate 1 nzt landu where umask indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 firstzt:lastzt EQ 0 if landu 0 NE 1 then zu temporary landu values f_nan zu temporary u temporary zu zv e1v indice2d replicate 1 nzt landv where vmask indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 firstzt:lastzt EQ 0 if landv 0 NE 1 then zv temporary landv values f_nan zv temporary v temporary zv zdiv scale e1t indice2d e2t indice2d replicate 1 nzt zdiv zu shift zu 1 0 0 zv shift zv 0 1 0 temporary zdiv Edging put at values f_nan if NOT keyword_set key_periodic OR nx NE jpi then begin zdiv 0 values f_nan zdiv nx 1 values f_nan endif zdiv 0 values f_nan zdiv ny 1 values f_nan land where tmask indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 firstzt:lastzt EQ 0 if land 0 NE 1 then zdiv temporary land valmask if keyword_set direc then zdiv moyenne zdiv direc nan END xyt szu 0 EQ 3 AND jpt GT 1:BEGIN extraction of U and V on the appropriated domain case 1 of szu 1 EQ nxu AND szu 2 EQ nyu AND szv 1 EQ nxv AND szv 2 EQ nyv:BEGIN case 1 of nxu NE nx:if indicex 0 EQ firstxu then u u 0:nx 1 ELSE u u 1: nx nxv NE nx:if indicex 0 EQ firstxv then v v 0:nx 1 ELSE v v 1: nx nyu NE ny:if indicey 0 EQ firstyu then u u 0:ny 1 ELSE u u 1: ny nyv NE ny:if indicey 0 EQ firstyv then v v 0:ny 1 ELSE v v 1: ny ELSE : endcase END szu 1 EQ jpi AND szu 2 EQ jpj AND szv 1 EQ jpi AND szv 2 EQ jpj:BEGIN u u indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 v v indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 END ELSE:return 1 endcase divergence computation zu e2u indice2d landu where umask indice2d jpi jpj firstzt EQ 0 if landu 0 NE 1 then zu temporary landu values f_nan zu temporary zu replicate 1 jpt zu temporary u temporary zu zv e1v indice2d landv where vmask indice2d jpi jpj firstzt EQ 0 if landv 0 NE 1 then zv temporary landv values f_nan zv temporary zv replicate 1 jpt zv temporary v temporary zv zdiv scale e1t indice2d e2t indice2d replicate 1 jpt zdiv zu shift zu 1 0 0 zv shift zv 0 1 0 temporary zdiv Edging put at values f_nan if NOT keyword_set key_periodic OR nx NE jpi then begin zdiv 0 values f_nan zdiv nx 1 values f_nan endif zdiv 0 values f_nan zdiv ny 1 values f_nan land where tmask indice2d jpi jpj firstzt EQ 0 cnt if land 0 NE 1 then BEGIN land temporary land replicate 1L jpt replicate 1L cnt nx ny lindgen jpt zdiv temporary land valmask ENDIF if keyword_set direc then zdiv grossemoyenne zdiv direc nan END xyzt szu 0 EQ 4:BEGIN return report Case not coded contact saxo team or make a do loop END xy szu 0 EQ 2:BEGIN extraction of U and V on the appropriated domain case 1 of szu 1 EQ nxu AND szu 2 EQ nyu AND szv 1 EQ nxv AND szv 2 EQ nyv:BEGIN case 1 of nxu NE nx:if indicex 0 EQ firstxu then u u 0:nx 1 ELSE u u 1: nx nxv NE nx:if indicex 0 EQ firstxv then v v 0:nx 1 ELSE v v 1: nx nyu NE ny:if indicey 0 EQ firstyu then u u 0:ny 1 ELSE u u 1: ny nyv NE ny:if indicey 0 EQ firstyv then v v 0:ny 1 ELSE v v 1: ny ELSE : endcase END szu 1 EQ jpi AND szu 2 EQ jpj AND szv 1 EQ jpi AND szv 2 EQ jpj:BEGIN u u indice2d v v indice2d END ELSE:return 1 endcase divergence computation zu e2u indice2d landu where umask indice2d jpi jpj firstzt EQ 0 if landu 0 NE 1 then zu temporary landu values f_nan zu temporary u temporary zu zv e1v indice2d landv where vmask indice2d jpi jpj firstzt EQ 0 if landv 0 NE 1 then zv temporary landv values f_nan zv temporary v temporary zv zdiv scale e1t indice2d e2t indice2d zdiv zu shift zu 1 0 zv shift zv 0 1 temporary zdiv Edging put at values f_nan if NOT keyword_set key_periodic OR nx NE jpi then begin zdiv 0 values f_nan zdiv nx 1 values f_nan endif zdiv 0 values f_nan zdiv ny 1 values f_nan land where tmask indice2d jpi jpj firstzt EQ 0 if land 0 NE 1 then zdiv temporary land valmask if keyword_set direc then zdiv moyenne zdiv direc nan END ELSE:return report U and V input arrays must have 2 3 or 4 dimensions ENDCASE if keyword_set key_performance THEN print time div systime 1 time1 return zdiv end"); a[26] = new Array("./Computation/grad.html", "grad.pro", "", " file_comments compute the gradient of a variable located on Arakawa C grid categories Calculation param FIELD The field for which we want to compute the gradient A 2D xy 3D xyz or yt or 4D xyzt array or a structure readable by litchamp and containing a 2D xy 3D xyz or yt or 4D xyzt array Note that the dimension of the array must suit the domain dimension param DIREC type scalar string the gradient direction: x y z keyword MILLION default 0 type scalar: 0 or 1 Activate to multiply returned array by 1 e6 keyword _EXTRA Used to declare that this routine accepts inherited keywords returns the gradient of the input data with the same size 2D 3D or 4D array located on the appropriate grid see restrictions uses cm_4cal cm_4data cm_4mesh restrictions Works only for Arakawa C grid When computing the gradient the result is not on the same grid point than the input data In consequence we update vargrid and the grid position parameters firstx tuvf lastx tuvf nx tuvf firsty tuvf lasty tuvf ny tuvf firstz tw lastz tw nz tw points that cannot be computed domain boundaries coastline are set to NaN the common variable jpt is used to differ xyz jpt 1 and xyt jpt 1 cases examples IDL tst_initorca2 IDL plt grad arr:gphit g: T x IDL plt grad arr:gphit g: T y history Sebastien Masson smasson lodyc jussieu fr version Id: grad pro 371 2008 08 07 09:32:02Z pinsard FUNCTION grad field direc MILLION million _EXTRA ex compile_opt idl2 strictarrsubs cm_4cal for jpt cm_4data for varname vargrid vardate varunit valmask cm_4mesh time1 systime 1 for key_performance IF finite glamu 0 finite gphiu 0 finite glamv 0 finite gphiv 0 EQ 0 THEN return report This version of grad is based on Arakawa C grid U and V grids must therefore be defined res litchamp field szres size res grille mask glam gphi gdep nx ny nz firstx firsty firstz lastx lasty lastz if n_elements valmask EQ 0 then valmask 1 e20 varname grad of varname IF keyword_set million THEN varunit 1 e6 varunit m ELSE varunit varunit m case strupcase vargrid of T :BEGIN case direc of x :BEGIN divi e1u firstx:lastx firsty:lasty newmask umask firstx:lastx firsty:lasty firstz:lastz vargrid U firstxu firstxt lastxu lastxt nxu nxt firstyu firstyt lastyu lastyt nyu nyt END y :BEGIN divi e2v firstx:lastx firsty:lasty newmask vmask firstx:lastx firsty:lasty firstz:lastz vargrid V firstxv firstxt lastxv lastxt nxv nxt firstyv firstyt lastyv lastyt nyv nyt END z :BEGIN divi e3w firstz:lastz newmask mask vargrid W firstzw firstzt lastzw lastzt nzw nzt END ELSE:return report Bad definition of direction argument ENDCASE END W :BEGIN case direc of x :BEGIN divi e1u firstx:lastx firsty:lasty newmask umask firstx:lastx firsty:lasty firstz:lastz vargrid U firstxu firstxt lastxu lastxt nxu nxt firstyu firstyt lastyu lastyt nyu nyt END y :BEGIN divi e2v firstx:lastx firsty:lasty newmask vmask firstx:lastx firsty:lasty firstz:lastz vargrid V firstxv firstxt lastxv lastxt nxv nxt firstyv firstyt lastyv lastyt nyv nyt END z :BEGIN divi e3t firstz:lastz newmask mask vargrid T firstzt firstzw lastzt lastzw nzt nzw END ELSE:return report Bad definition of direction argument endcase END U :BEGIN case direc of x :BEGIN divi shift e1t 1 0 firstx:lastx firsty:lasty newmask tmask firstx:lastx firsty:lasty firstz:lastz vargrid T firstxt firstxu lastxt lastxu nxt nxu firstyt firstyu lastyt lastyu nyt nyu END y :BEGIN divi e2f firstx:lastx firsty:lasty newmask fmask firstx:lastx firsty:lasty firstz:lastz vargrid F firstxf firstxu lastxf lastxu nxf nxu firstyf firstyu lastyf lastyu nyf nyu END z :BEGIN divi e3w firstz:lastz newmask mask vargrid W firstzw firstzt lastzw lastzt nzw nzt END ELSE:return report Bad definition of direction argument endcase END V :BEGIN case direc of x :BEGIN divi e1f firstx:lastx firsty:lasty newmask fmask firstx:lastx firsty:lasty firstz:lastz vargrid F firstxf firstxv lastxf lastxv nxf nxv firstyf firstyv lastyf lastyv nyf nyv END y :BEGIN divi shift e2t 0 1 firstx:lastx firsty:lasty newmask tmask firstx:lastx firsty:lasty firstz:lastz vargrid T firstxt firstxv lastxt lastxv nxt nxv firstyt firstyv lastyt lastyv nyt nyv END z :BEGIN divi e3w firstz:lastz newmask mask vargrid W firstzw firstzt lastzw lastzt nzw nzt END ELSE:return report Bad definition of direction argument endcase END F :BEGIN case direc of x :divi shift e1v 1 0 firstx:lastx firsty:lasty y :divi shift e2u 0 1 firstx:lastx firsty:lasty z :divi e3w firstz:lastz ELSE:return report Bad definition of direction argument endcase return report F grid: case not coded please contact SAXO team END ELSE:return report Bad definition of vargrid ENDCASE IF keyword_set million THEN divi temporary divi 1 e 6 res fitintobox temporary res IF n_elements res EQ 1 AND res 0 EQ 1 THEN return res case 1 of xy szres 0 EQ 2:BEGIN land where temporary mask firstz EQ 0 if land 0 NE 1 then res temporary land values f_nan case direc of x :BEGIN res shift res 1 0 res temporary divi if key_periodic EQ 0 OR nx NE jpi THEN res nx 1 values f_nan if vargrid EQ T OR vargrid EQ V then res shift temporary res 1 0 END y :BEGIN res shift res 0 1 res temporary divi res ny 1 values f_nan if vargrid EQ T OR vargrid EQ U then res shift temporary res 0 1 END ELSE:return report Bad definition of direction argument for the type of array ENDCASE land where temporary newmask firstz EQ 0 if land 0 NE 1 then res temporary land valmask END xyt szres 0 EQ 3 AND jpt NE 1:BEGIN land where temporary mask firstz EQ 0 cnt if land 0 NE 1 then BEGIN land temporary land replicate 1L jpt replicate 1L cnt nx ny lindgen jpt res temporary land values f_nan ENDIF divi temporary divi replicate 1 jpt case direc of x :BEGIN res shift res 1 0 0 res temporary divi if key_periodic EQ 0 OR nx NE jpi THEN res nx 1 values f_nan if vargrid EQ T OR vargrid EQ V then res shift temporary res 1 0 0 END y :BEGIN res shift res 0 1 0 res temporary divi res ny 1 values f_nan if vargrid EQ T OR vargrid EQ U then res shift temporary res 0 1 0 END ELSE:return report Bad definition of direction argument for the type of array ENDCASE land where temporary newmask firstz EQ 0 cnt if land 0 NE 1 then BEGIN land temporary land replicate 1L jpt replicate 1L cnt nx ny lindgen jpt res temporary land valmask ENDIF END xyz szres 0 EQ 3 AND jpt EQ 1:BEGIN land where mask EQ 0 if land 0 NE 1 then res temporary land values f_nan case direc OF x :BEGIN divi temporary divi replicate 1 nz res shift res 1 0 0 res temporary divi if key_periodic EQ 0 OR nx NE jpi THEN res nx 1 values f_nan if vargrid EQ T OR vargrid EQ V then res shift temporary res 1 0 0 END y :BEGIN divi temporary divi replicate 1 nz res shift res 0 1 0 res temporary divi res ny 1 values f_nan if vargrid EQ T OR vargrid EQ U then res shift temporary res 0 1 0 END z :BEGIN divi replicate 1 nx ny temporary divi if nx EQ 1 OR ny EQ 1 then res reform res nx ny nz overwrite if vargrid EQ W THEN BEGIN res shift res 0 0 1 res temporary divi res 0 values f_nan ENDIF ELSE BEGIN res res shift res 0 0 1 temporary divi res nz 1 values f_nan ENDELSE END ENDCASE land where temporary newmask EQ 0 if land 0 NE 1 then res temporary land valmask END xyzt szres 0 EQ 4:BEGIN land where temporary mask EQ 0 cnt if land 0 NE 1 then BEGIN land temporary land replicate 1L jpt replicate 1L cnt nx ny nz lindgen jpt res temporary land values f_nan ENDIF case direc OF x :BEGIN divi temporary divi replicate 1 nz jpt res shift res 1 0 0 0 res temporary divi if key_periodic EQ 0 OR nx NE jpi THEN res nx 1 values f_nan if vargrid EQ T OR vargrid EQ V then res shift temporary res 1 0 0 0 END y :BEGIN divi temporary divi replicate 1 nz jpt res shift res 0 1 0 0 res temporary divi res ny 1 values f_nan if vargrid EQ T OR vargrid EQ U then res shift temporary res 0 1 0 0 END z :BEGIN divi replicate 1 nx ny temporary divi divi temporary divi replicate 1L jpt if nx EQ 1 OR ny EQ 1 then res reform res nx ny nz jpt overwrite if vargrid EQ W THEN BEGIN res shift res 0 0 1 0 res temporary divi res 0 values f_nan ENDIF ELSE BEGIN res res shift res 0 0 1 0 temporary divi res nz 1 values f_nan ENDELSE END ENDCASE land where newmask EQ 0 cnt if land 0 NE 1 then BEGIN land temporary land replicate 1L jpt replicate 1L cnt nx ny nz lindgen jpt res temporary land valmask ENDIF END ELSE:return report input array must have 2 3 or 4 dimensions ENDCASE if keyword_set key_performance THEN print time curl systime 1 time1 return res END"); a[27] = new Array("./Computation/msf.html", "msf.pro", "", " file_comments compute the meridional along the model grid stream function in Sv using the following equation: total total e1v e3v vn 1 2 cumulative 1 e6 categories diagnostics param z3d in type 3D xyz array meridional velocity param mask2d in type 2D xy array optional default 1 everywhere land sea 0 1 mask to be applied in addtion to the 3D mask of the model to mask some parts of the domain and keep for example the northend atlantic keyword NOSTRUCTURE default 0 type scalar: 0 or 1 activate if you do not want that msf returns a structure but only the array referring to the field keyword INDEXBOXZOOM Set this keyword to a named variable in which msf will return the x and y indexes definig the zoom box that should be used by pltz to do the plot see example keyword MASKOUT Set this keyword to a named variable in which msf will return the 2d array yz should be used by pltz to do plot the land sea mask see example returns type 2D yz array meridional stream function in Sv uses cm_4mesh cm_4data grille litchamp fitintobox restrictions T and V boxzoom parameters must be the same to be valid mask must be equal to 0 at the bottom and on each side of the domain along x direction define the common variables of cm_4data varname MSF varunit Sv vargrid W should introduce WF point examples IDL initorca05 IDL file Volumes pim F31 oce 1y F31_1y_0040_0040_grid_V nc IDL vn read_ncdf vomecrty 0 0 timestep file file IDL mm msf vn mskatl indexboxzoom ind maskout ma IDL pltz mm 20 20 int 1 boxzoom ind 0 5200 xindex yindex zoom 1000 maskdta ma no_partial style so0so history Gurvan Madec Christian Ethe Claude Talandier and Sebastien Masson Dec 2008 version Id: msf pro 388 2008 12 09 09:36:41Z smasson FUNCTION msf z3d mask2d INDEXBOXZOOM indexboxzoom MASKOUT maskout NOSTRUCTURE nostructure compile_opt idl2 strictarrsubs cm_4mesh cm_4data CASE 1 OF firstxt NE firstxv OR lastxt NE lastxv: return report T and V box must be defined over the same x indexes use memeindices when calling domdef firstyt NE firstyv OR lastyt NE lastyv: return report T and V box must be defined over the same y indexes use memeindices when calling domdef ELSE: ENDCASE grille 1 1 1 1 nx ny nz firstx firsty firstz lastx lasty lastz grid T vn litchamp z3d IF size vn n_dimensions NE 3 THEN return report input data must be a 3D array vn fitintobox temporary vn IF n_elements mask2d EQ 0 THEN mask2d replicate 1b nx ny IF size mask2d n_dimensions NE 2 THEN return report input mask2d must be a 2D array msk fitintobox mask2d msk temporary msk replicate 1b nz msk vmask firstx:lastx firsty:lasty firstz:lastz temporary msk IF total msk nz 1 NE 0 THEN return report The bottom of the box defined by lastzt must be set to land value 0 IF total msk 0 NE 0 OR total msk nx 1 NE 0 AND NOT keyword_set key_periodic AND nx EQ jpi THEN return report for non periodic domains eastern and western bondaries must be land point IF keyword_set key_partialstep AND total msk ny 1 NE 0 THEN flagdata 1 IF keyword_set key_partialstep THEN BEGIN Rebuild the T point 3D partial steps array from 2D bottom e3t_ps level of the bottom of the ocean bottom total tmask firstx:lastx firsty:lasty firstz:lastz 3 bottom 0L long temporary bottom 1L the bottom of the ocean in 3D index is: bottom lindgen nx ny temporary bottom nx ny 3D e3t array e3t_3D replicate 1 nx ny e3t firstz:lastz apply e3t_ps to e3t_3D at the bottom of the ocean e3t_3D temporary bottom e3t_ps firstx:lastx firsty:lasty 3D e3t_3D array e3t_3D reform e3t_3D nx ny nz overwrite Rebuild the V point 3D partial steps array from T point 3D e3t_3D array tmp shift e3t_3D 0 1 0 e3v_3D temporary e3t_3D temporary tmp e3v_3D min temporary e3v_3D dimension 2 3D e1v array e1_3D e1v firstx:lastx firsty:lasty replicate 1 nz e1v e3v e13 temporary e1_3D temporary e3v_3D ENDIF ELSE BEGIN e13 e1v firstx:lastx firsty:lasty e3t firstz:lastz ENDELSE mask the array vn temporary vn msk IF arg_present maskout THEN BEGIN msk total temporary msk 1 maskout temporary msk NE 0 maskout shift maskout 0 1 bottom value of W should be taken into account maskout 0 maskout 1 maskout reverse temporary maskout 2 ENDIF defaut computation: msf 1 e 6 total total temporary e13 temporary vn 1 2 cumulative but we force the computation from bottom to up msf total temporary vn temporary e13 1 yz array msf reverse temporary msf 2 msf 1 e 6 total temporary msf 2 cumulative msf 1 reverse temporary msf 2 IF keyword_set flagdata THEN msf ny 1 values f_nan set msf to 0 in the largest continent no done update data informations varname MSF varunit Sv vargrid W should introduce WF point we must define a domain related to the section are we using an ORCA grid IF jpiglo EQ 182 AND jpjglo EQ 149 OR jpiglo EQ 722 AND jpjglo EQ 511 OR jpiglo EQ 1442 AND jpjglo EQ 1021 OR jpiglo EQ 4322 AND jpjglo EQ 3059 THEN BEGIN find the i index with the northest latitude ind where gphit firstx:lastx firsty:lasty EQ max gphit firstx:lastx firsty:lasty 0 mod nx ENDIF ELSE ind 0 indexboxzoom ind ind firsty lasty IF keyword_set nostructure THEN return msf IF keyword_set key_forgetold THEN BEGIN return arr:temporary msf grid:vargrid unit:varunit experiment:varexp name:varname ENDIF ELSE BEGIN return tab:temporary msf grille:vargrid unite:varunit experience:varexp nom:varname ENDELSE END"); a[28] = new Array("./Computation/norm.html", "norm.pro", "", " file_comments calculate the norm of vectors field located on Arakawa C grid categories Calculation param UU in required Matrix representing the zonal coordinates at U V point of a field of vectors A 2D xy 3D xyz or yt 4D xyzt or a structure readable by litchamp and containing a 2D xy 3D xyz or yt 4D xyzt array Note that the dimension of the array must suit the domain dimension param VV in required Matrix representing the meridional coordinates at V U point of a field of vectors A 2D xy 3D xyz or yt 4D xyzt array or a structure readable by litchamp and containing a 2D xy 3D xyz or yt 4D xyzt array Note that the dimension of the array must suit the domain dimension keyword DIREC t x y z xys xz yz xyz xt yt zt xyt xzt yzt xyzt Direction on which do averages keyword _EXTRA Used to declare that this routine accepts inherited keywords returns a 2D xy 3D xyz or yt 4D xyzt array uses cm_4mesh cm_4data cm_4cal restrictions The norm is calculated on points T To do this calculation we average field U and V on points T before calculate the norm At the edge of coast and of domain we can not calculate fields U and V at points T that is why these points are at value values f_nan When we calculate on a reduce geographic domain field U and V have not necessarily the same number of point In this case we recut U and V to keep only common points We profit of this to redo a domdef which redefine a geographic domain on which fields U and V are extracted on same points To know what type of array we work with we test its size and dates gave by time 0 and time jpt 1 to know if thee is a temporal dimension Before to start norm make sure that time and jpt are defined how they have to examples To calculate the average of the norm of streams on all the domain between 0 and 50: IDL domdef 0 50 IDL res norm un vn dir xyz history Sebastien Masson smasson lodyc jussieu fr 9 6 1999 version Id: norm pro 371 2008 08 07 09:32:02Z pinsard FUNCTION norm uu vv DIREC direc _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh cm_4data cm_4cal IF NOT keyword_set key_forgetold THEN BEGIN updatenew updatekwd ENDIF time1 systime 1 To key_performance IF finite glamu 0 finite gphiu 0 finite glamv 0 finite gphiv 0 EQ 0 THEN return report This version of norm is based on Arakawa C grid U and V grids must therefore be defined if NOT keyword_set direc then direc 0 construction of u and v at points T u litchamp uu v litchamp vv date1 time 0 if n_elements jpt EQ 0 then date2 date1 ELSE date2 time jpt 1 if size u 0 NE size v 0 then return 1 grilleu litchamp uu grid if grilleu EQ then grilleu U grillev litchamp vv grid if grillev EQ then grillev V IF grilleu EQ V AND grillev EQ U THEN inverse 1 IF grilleu EQ T AND grillev EQ T THEN BEGIN interpolle 0 return report Case not coded but easy to do ENDIF ELSE interpolle 1 if keyword_set inverse then begin tmp u u temporary v v temporary tmp endif We find common points between u and v indicexu lindgen jpi firstxu:firstxu nxu 1 indicexv lindgen jpi firstxv:firstxv nxv 1 indicex inter indicexu indicexv indiceyu lindgen jpj firstyu:firstyu nyu 1 indiceyv lindgen jpj firstyv:firstyv nyv 1 indicey inter indiceyu indiceyv nx n_elements indicex ny n_elements indicey vargrid T varname norm if n_elements valmask EQ 0 THEN valmask 1e20 firstxt indicex 0 lastxt indicex 0 nx 1 nxt nx firstyt indicey 0 lastyt indicey 0 ny 1 nyt ny case 1 of xyz size u 0 EQ 3 AND date1 EQ date2 :BEGIN indice2d lindgen jpi jpj indice2d indice2d indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 indice3d lindgen jpi jpj jpk indice3d indice3d indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 firstzt:lastzt extraction of u and v on the appropriated domain case 1 of size u 1 EQ nxu AND size u 2 EQ nyu AND size v 1 EQ nxv AND size v 2 EQ nyv:BEGIN case size u 3 OF nzt:BEGIN if nxu NE nx then if indicex 0 EQ firstxu then u u 0:nx 1 ELSE u u 1: nx IF nxv NE nx THEN if indicex 0 EQ firstxv then v v 0:nx 1 ELSE v v 1: nx IF nyu NE ny THEN if indicey 0 EQ firstyu then u u 0:ny 1 ELSE u u 1: ny IF nyv NE ny THEN if indicey 0 EQ firstyv then v v 0:ny 1 ELSE v v 1: ny end jpk:BEGIN if nxu NE nx then if indicex 0 EQ firstxu then u u 0:nx 1 firstzt:lastzt ELSE u u 1: nx firstzt:lastzt IF nxv NE nx THEN if indicex 0 EQ firstxv then v v 0:nx 1 firstzt:lastzt ELSE v v 1: nx firstzt:lastzt IF nyu NE ny THEN if indicey 0 EQ firstyu then u u 0:ny 1 firstzt:lastzt ELSE u u 1: ny firstzt:lastzt IF nyv NE ny THEN if indicey 0 EQ firstyv then v v 0:ny 1 firstzt:lastzt ELSE v v 1: ny firstzt:lastzt end ELSE: return report the third dimension of u strtrim size u 3 1 must be equal to nzt strtrim nzt 1 or jpk strtrim jpk 1 endcase END size u 1 EQ jpi AND size u 2 EQ jpj AND size u 3 EQ jpk AND size v 1 EQ jpi AND size v 2 EQ jpj AND size u 3 EQ jpk :BEGIN u u indice3d v v indice3d END ELSE: return report We cannot find re cut on common indexes see restriction un the header To avoid this problem read the full domain or use the keyword memeindice in domdef when defining the zoom area endcase We reshape u and v to make sure that no dimension has been erased if nzt EQ 1 then begin u reform u nx ny nzt over v reform v nx ny nzt over endif construction of u and v at points T a u 0 u u shift u 1 0 0 2 if NOT keyword_set key_periodic OR nx NE jpi then u 0 a a v 0 v v shift v 0 1 0 2 if NOT keyword_set key_periodic OR nx NE jpi then v 0 a attribution of the mask and of longitude and latitude arrays mask tmask indice3d if nzt EQ 1 then mask reform mask nx ny nzt over if n_elements valmask EQ 0 THEN valmask 1e20 landu where u GE valmask 10 if landu 0 NE 1 then u landu 0 landv where v GE valmask 10 if landv 0 NE 1 then v landv 0 res sqrt u 2 v 2 if NOT keyword_set key_periodic OR nx NE jpi then res 0 values f_nan res 0 values f_nan mask where mask eq 0 IF mask 0 NE 1 THEN res mask valmask All kind of average domdef glamt indice2d 0 0 glamu indice2d nx 1 0 gphit indice2d 0 0 gphiv indice2d 0 ny 1 vert1 vert2 meme if keyword_set direc then res moyenne res direc nan boxzoom boxzoom nodomdef END xyt date1 NE date2 AND size u 0 EQ 3 :BEGIN indice2d lindgen jpi jpj indice2d indice2d indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 extraction of u and v on the appropriated domain case 1 of size u 1 EQ nxu AND size u 2 EQ nyu AND size v 1 EQ nxv AND size v 2 EQ nyv:BEGIN if nxu NE nx then if indicex 0 EQ firstxu then u u 0:nx 1 ELSE u u 1: nx IF nxv NE nx THEN if indicex 0 EQ firstxv then v v 0:nx 1 ELSE v v 1: nx IF nyu NE ny THEN if indicey 0 EQ firstyu then u u 0:ny 1 ELSE u u 1: ny IF nyv NE ny THEN if indicey 0 EQ firstyv then v v 0:ny 1 ELSE v v 1: ny END size u 1 EQ jpi AND size u 2 EQ jpj AND size v 1 EQ jpi AND size v 2 EQ jpj:BEGIN u u indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 v v indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 END ELSE:return report We cannot find re cut on common indexes see restriction un the header To avoid this problem read the full domain or use the keyword memeindice in domdef when defining the zoom area endcase construction of u and v at points T a u 0 u u shift u 1 0 0 2 if NOT keyword_set key_periodic OR nx NE jpi then u 0 a a v 0 v v shift v 0 1 0 2 if NOT keyword_set key_periodic OR nx NE jpi then v 0 a attribution of the mask and of longitude and latitude arrays We recover the complete grid to establish a big mask extent in the four direction to cover pointsfor which a land point has been considerated make a small drawing mask tmask indice2d jpi jpj firstzt if ny EQ 1 then mask reform mask nx ny over construction of land containing all points to mask if n_elements valmask EQ 0 THEN valmask 1e20 landu where u GE valmask 10 if landu 0 NE 1 then u landu 0 landv where v GE valmask 10 if landv 0 NE 1 then v landv 0 res sqrt u 2 v 2 if NOT keyword_set key_periodic OR nx NE jpi then res 0 values f_nan res 0 values f_nan mask where mask eq 0 IF mask 0 NE 1 THEN BEGIN coeftps lindgen jpt nx ny coeftps replicate 1 n_elements mask coeftps mask temporary mask replicate 1 jpt mask temporary mask temporary coeftps res temporary mask valmask ENDIF moyennes en tous genres domdef glamt indice2d 0 0 glamu indice2d nx 1 0 gphit indice2d 0 0 gphiv indice2d 0 ny 1 vert1 vert2 meme if keyword_set direc then res grossemoyenne res direc nan boxzoom boxzoom nodomdef END xyzt date1 NE date2 AND size u 0 EQ 4:BEGIN indice2d lindgen jpi jpj indice2d indice2d indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 indice3d lindgen jpi jpj jpk indice3d indice3d indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 firstzt:lastzt extraction of u and v on the appropriated domain case 1 of size u 1 EQ nxu AND size u 2 EQ nyu AND size v 1 EQ nxv AND size v 2 EQ nyv:BEGIN case size u 3 OF nzt:BEGIN if nxu NE nx then if indicex 0 EQ firstxu then u u 0:nx 1 ELSE u u 1: nx IF nxv NE nx THEN if indicex 0 EQ firstxv then v v 0:nx 1 ELSE v v 1: nx IF nyu NE ny THEN if indicey 0 EQ firstyu then u u 0:ny 1 ELSE u u 1: ny IF nyv NE ny THEN if indicey 0 EQ firstyv then v v 0:ny 1 ELSE v v 1: ny end jpk:BEGIN if nxu NE nx then if indicex 0 EQ firstxu then u u 0:nx 1 firstzt:lastzt ELSE u u 1: nx firstzt:lastzt IF nxv NE nx THEN if indicex 0 EQ firstxv then v v 0:nx 1 firstzt:lastzt ELSE v v 1: nx firstzt:lastzt IF nyu NE ny THEN if indicey 0 EQ firstyu then u u 0:ny 1 firstzt:lastzt ELSE u u 1: ny firstzt:lastzt IF nyv NE ny THEN if indicey 0 EQ firstyv then v v 0:ny 1 firstzt:lastzt ELSE v v 1: ny firstzt:lastzt end ELSE: report the third dimension of u strtrim size u 3 1 must be equal to nzt strtrim nzt 1 or jpk strtrim jpk 1 endcase END size u 1 EQ jpi AND size u 2 EQ jpj AND size u 3 EQ jpk AND size v 1 EQ jpi AND size v 2 EQ jpj AND size u 3 EQ jpk :BEGIN u u indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 firstzt:lastzt v v indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 firstzt:lastzt END ELSE: return report We cannot find re cut on common indexes see restriction un the header To avoid this problem read the full domain or use the keyword memeindice in domdef when defining the zoom area endcase construction of u and v at points T a u 0 u u shift u 1 0 0 0 2 if NOT keyword_set key_periodic OR nx NE jpi then u 0 a a v 0 v v shift v 0 1 0 0 2 if NOT keyword_set key_periodic OR nx NE jpi then v 0 a attribution of the mask and of longitude and latitude arrays mask tmask indice3d if nzt EQ 1 then mask reform mask nx ny nzt over if n_elements valmask EQ 0 THEN valmask 1e20 landu where u GE valmask 10 if landu 0 NE 1 then u landu 0 landv where v GE valmask 10 if landv 0 NE 1 then v landv 0 res sqrt u 2 v 2 if NOT keyword_set key_periodic OR nx NE jpi then res 0 values f_nan res 0 values f_nan mask where mask eq 0 IF mask 0 NE 1 THEN BEGIN coeftps lindgen jpt nx ny nzt coeftps replicate 1 n_elements mask coeftps mask temporary mask replicate 1 jpt mask temporary mask temporary coeftps res temporary mask valmask ENDIF All kind of average domdef glamt indice2d 0 0 glamu indice2d nx 1 0 gphit indice2d 0 0 gphiv indice2d 0 ny 1 vert1 vert2 meme if keyword_set direc then res grossemoyenne res direc nan boxzoom boxzoom nodomdef END xy ELSE:BEGIN xy indice2d lindgen jpi jpj indice2d indice2d indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 extraction of u and v on the appropriated domain case 1 of size u 1 EQ nxu AND size u 2 EQ nyu AND size v 1 EQ nxv AND size v 2 EQ nyv:BEGIN if nxu NE nx then if indicex 0 EQ firstxu then u u 0:nx 1 ELSE u u 1: nx IF nxv NE nx THEN if indicex 0 EQ firstxv then v v 0:nx 1 ELSE v v 1: nx IF nyu NE ny THEN if indicey 0 EQ firstyu then u u 0:ny 1 ELSE u u 1: ny IF nyv NE ny THEN if indicey 0 EQ firstyv then v v 0:ny 1 ELSE v v 1: ny END size u 1 EQ jpi AND size u 2 EQ jpj AND size v 1 EQ jpi AND size v 2 EQ jpj:BEGIN u u indice2d v v indice2d END ELSE:return report We cannot find re cut on common indexes see restriction un the header To avoid this problem read the full domain or use the keyword memeindice in domdef when defining the zoom area endcase We reshape u and v to make sure that no dimension has been erased if ny EQ 1 then begin u reform u nx ny over v reform v nx ny over endif construction of u and v at points T a u 0 u u shift u 1 0 2 if NOT keyword_set key_periodic OR nx NE jpi then u 0 a a v 0 v v shift v 0 1 2 if NOT keyword_set key_periodic OR nx NE jpi then v 0 a attribution of the mask and of longitude and latitude arrays We recover the complete grid to establish a big mask extent in the four direction to cover pointsfor which a land point has been considerated make a small drawing mask tmask indice2d jpi jpj firstzt if nyt EQ 1 THEN mask reform mask nx ny over construction of land containing all points to mask if n_elements valmask EQ 0 THEN valmask 1e20 landu where u GE valmask 10 if landu 0 NE 1 then u landu 0 landv where v GE valmask 10 if landv 0 NE 1 then v landv 0 res sqrt u 2 v 2 if NOT keyword_set key_periodic OR nx NE jpi then res 0 values f_nan res 0 values f_nan mask where mask eq 0 IF mask 0 NE 1 THEN res mask valmask All kind of average domdef glamt indice2d 0 0 glamu indice2d nx 1 0 gphit indice2d 0 0 gphiv indice2d 0 ny 1 vert1 vert2 meme if keyword_set direc then res moyenne res direc nan boxzoom boxzoom nodomdef END endcase if keyword_set key_performance THEN print time norm systime 1 time1 return res end"); a[29] = new Array("./Documentation/xmldoc/idlfiles/init_example.html", "init_example.pro", "", ""); a[30] = new Array("./ForOldVersion/keep_compatibility.html", "keep_compatibility.pro", "", " file_comments For internal use of SAXO 1 define key_forgetold 1b keyword_set flag 2 remove all oldcm_used pro found in path 3 define and create myuniquetmpdir and add it to path 4 copy oldcm_full _empty to myuniquetmpdir oldcm_used pro 5 make sure that the common variables are correctly initialized 6 merge the online_help if possible categories Compatibility param flag in optional 1 or 0 to keep or forget the compatibility uses cm_general examples IDL keep_compatibility 0 history Sebastien Masson smasson lodyc jussieu fr June 2005 version Id: keep_compatibility pro 372 2008 08 08 12:31:53Z pinsard PRO keep_compatibility flag compile_opt idl2 strictarrsubs cm_general IF n_elements myuniquetmpdir NE 0 THEN return version should be at least 6 0 IF fix strmid version release 0 1 LT 6 THEN BEGIN print print ERROR print print This version of SAXO needs at least IDL version 6 0 print print ERROR print return ENDIF are we using the virtual machine IF n_elements key_vm EQ 0 THEN key_vm lmgr vm are we using gdl or idl defsysv gdl exist key_gdl if n_elements flag eq 0 then flag 1b keyword_set key_forgetold 1 automatic definition of key_forgetold key_forgetold 1b keyword_set flag 2 remove all oldcm_used pro found in path to_rm find oldcm_used IF to_rm 0 NE NOT FOUND THEN file_delete to_rm 3 define and create myuniquetmpdir and add it to path def_myuniquetmpdir if we are using the virtual machine there is no need to do this IF NOT keyword_set key_vm THEN BEGIN 4 copy oldcm_full _empty to myuniquetmpdir oldcm_used pro select which file should be copied to oldcm_used pro IF key_forgetold THEN BEGIN oldcm find oldcm_empty print We forget the compatibility with the old version ENDIF ELSE BEGIN oldcm find oldcm_full print We keep the compatibility with the old version ENDELSE oldcm oldcm 0 IF oldcm EQ NOT FOUND THEN BEGIN print Error: oldcm_full or oldcm_empty must be found in the path stop ENDIF copy file_copy oldcm myuniquetmpdir oldcm_used pro overwrite make sure we can make the plots even if we are using the demo mode demomode_compatibility ENDIF 5 make sure that the common variables are correctly initialized IF size ccmeshparameters type NE 8 THEN BEGIN computegrid 1 1 1 1 1 1 fullcgrid cm_4data varname vargrid T vardate 0 varexp varunit valmask 1 e20 ENDIF 6 merge the online_help if possible mergeonline_help return END"); a[31] = new Array("./ForOldVersion/oldcm_empty.html", "oldcm_empty.pro", "", ""); a[32] = new Array("./ForOldVersion/oldcm_full.html", "oldcm_full.pro", "", ""); a[33] = new Array("./ForOldVersion/updatekwd.html", "updatekwd.pro", "", ""); a[34] = new Array("./ForOldVersion/updatenew.html", "updatenew.pro", "", ""); a[35] = new Array("./ForOldVersion/updateold.html", "updateold.pro", "", ""); a[36] = new Array("./Grid/changemsk.html", "changemsk.pro", "", " file_comments add land points on a 2D land sea mask categories Grid param TAB in required a 2D land sea mask with 1 on sea and 0 on land keyword CELLSIZE size in pixel of the square representing one point of the mask returns the new 2D land sea mask examples IDL a changemsk tmask 0 to add ocean points IDL a 1 changemsk 1 tmask 0 history Sebastien Masson smasson lodyc jussieu fr June 2006 version Id: changemsk pro 371 2008 08 07 09:32:02Z pinsard FUNCTION changemsk tab CELLSIZE cellsize compile_opt idl2 strictarrsubs newmsk 1 taille size tab if taille 0 NE 2 then return newmsk newmsk byte tab if keyword_set cellsize THEN cellsize long cellsize ELSE cellsize long 2 window xsize taille 1 cellsize ysize taille 2 cellsize tvscl congrid newmsk taille 1 cellsize taille 2 cellsize if NOT keyword_set nouseinfos then begin print left button : use it twice to define the diagonal of the rectangle to be set to 0 land print middle button: put 0 land on the clicked point print right button : quit endif cursor x1 y1 device up while mouse button ne 4 do begin case mouse button of 0:return newmsk 1:BEGIN cursor x2 y2 device up x x1 x2 x x sort x x round x cellsize y y1 y2 y y sort y y round y cellsize newmsk x 0 :x 1 y 0 :y 1 0 tvscl replicate 0 x 1 x 0 1 cellsize y 1 y 0 1 cellsize x 0 cellsize y 0 cellsize end 2:BEGIN x1 round x1 cellsize y1 round y1 cellsize newmsk x1 y1 0 tvscl replicate 0 cellsize cellsize x1 cellsize y1 cellsize END ELSE: endcase cursor x1 y1 device up endwhile return newmsk end"); a[37] = new Array("./Grid/computegrid.html", "computegrid.pro", "", " file_comments compute the grid parameters cm_4mesh common domains sizes: jpi jpj jpk jpiglo jpjglo jpkglo jpidta jpjdta jpkdta domains positions regarding to the original grid: ixminmesh ixmaxmesh iyminmesh iymaxmesh izminmesh izmaxmesh ixmindta ixmaxdta iymindta iymaxdta izmindta izmaxdta horizontal parameters: glamt glamf gphit gphit e1t e2t additional horizontal parameters if FULLCGRID keyword is defined: glamu glamv gphiu gphiv e1u e1v e1f e2u e2v e2f verticals parameters: gdept gdepw e3t e3w masks: tmask additional masks if FULLCGRID keyword is defined: umaskred vmaskred fmaskredx fmaskredy triangles_list: triangulation key_ variables: key_onearth key_periodic key_shift key_stride key_partialstep key_yreverse key_zreverse key_gridtype xxx related variables: ccmeshparameters ccreadparameters categories Grid param startx in optional type scalar x starting point optional if XY AXIS keyword is used param starty in optional type scalar y starting point optional if XY AXIS keyword is used param stepxin in optional type scalar or vector x direction step optional if XY AXIS keyword is used must be 0 if stepxin is a vector nx is not used param stepyin in optional type scalar or vector y direction step optional if XY AXIS keyword is used could be 0 south to north or lon1 lon2 lon1 le 360 By default the common cm_4mesh variable key_shift will be automatically defined according to GLAMBOUNDARY keyword MASK default array of 1 type 2D or 3D array Specify the land 0 sea 1 mask keyword ONEARTH default 1 type scalar: 0 or 1 Force the manual definition of data localization on the earth or not 0 if the data are not on the earth 1 if the data are on earth in that case we can for example use the labels longitude latitude in plots The resulting value will be stored in the common cm_4mesh variable key_onearth ONEARTH 0 forces PERIODIC 0 SHIFT 0 and is cancelling GLAMBOUNDARY keyword PERIODIC default computed by using the first line of glamt type scalar: 0 or 1 Force the manual definition of the grid zonal periodicity The resulting value will be stored in the common cm_4mesh variable key_periodic PERIODIC 0 forces SHIFT 0 keyword PLAIN default 0 type scalar: 0 or 1 Force YREVERSE 0 ZREVERSE 0 PERIODIC 0 SHIFT 0 STRIDE 1 1 1 and suppress the automatic redefinition of the domain in case of x periodicity overlap y periodicity overlap ORCA type only and mask border to 0 keyword SHIFT default computed according to glamboundary type scalar Force the manual definition of the zonal shift that must be apply to the data The resulting value will be stored in the common cm_4mesh variable key_shift Note that if key_periodic 0 then in any case key_shift 0 keyword STRCALLING type string a string containing the calling command used to call computegrid this is used by xxx keyword STRIDE default 1 1 1 type 3 elements vector Specify the stride in x y and z direction The resulting value will be stored in the common cm_4mesh variable key_stride keyword XAXIS type 1D or 2D array Specify longitudes in this case startx stepx and nx are not used but could be necessary if the y axis is not defined with yaxis It must be possible to sort the first line of xaxis in the increasing order by shifting its elements keyword YAXIS type 1D or 2D array Specify latitudes in this case starty stepy and ny are not used but starty and stepy could be necessary if the x axis is not defined with xaxis It must be sorted in the increasing or decreasing order along each column if 2d array keyword XYINDEX activate to specify that the horizontal grid should be simply defined by using the index of the points xaxis findgen nx and yaxis findgen ny using this keyword forces key_onearth 0 keyword XMINMESH default 0L type scalar Define common cm_4mesh variables ixminmesh used to define the localization of the first point of the grid along the x direction in a zoom of the original grid keyword YMINMESH default 0L type scalar Define common cm_4mesh variables iyminmesh used to define the localization of the first point of the grid along the y direction in a zoom of the original grid keyword ZMINMESH default 0L type scalar Define common cm_4mesh variables izminmesh used to define the localization of the first point of the grid along the z direction in a zoom of the original grid keyword XMAXMESH default jpiglo 1 type scalar Define common cm_4mesh variables ixmaxmesh used to define the localization of the last point of the grid along the x direction in a zoom of the original grid Note that if XMAXMESH we are back to a C grid based on T point as for OPA model Note that in that case key_gridtype c_f and not c used in read_ncdf Note that activate FBASE2TBASE forces FULLCGRID 1 keyword UBASE2TBASE Activate when the model is a C grid based on a U point with a U point at the bottom left corner and a T point at the upper right corner In this case we ignore if the grid is not x periodic the first column of F and U points if the grid is not x periodic the last column of T and V points we are back to a C grid based on T point as for OPA model Note that in that case key_gridtype c_u and not c used in read_ncdf Note that activate UBASE2TBASE forces FULLCGRID 1 keyword VBASE2TBASE Activate when the model is a C grid based on a V point with a V point at the bottom left corner and a T point at the upper right corner In this case we ignore the first line of F and V points the last line of T and U points we are back to a C grid based on T point as for OPA model Note that in that case key_gridtype c_v and not c used in read_ncdf Note that activate VBASE2TBASE forces FULLCGRID 1 keyword ROMSH type 2D array This array is the final bathymetry at RHO points It is stored in the common variable cm_4mesh romszinfos h Used when the model is a ROMS C grid with one more point in longitude for T and V grid and one more point in latitude for T and U grid In this case we ignore the last line of T and U points the last column of T and V points we are back to a C grid based on T point as for OPA model Note that activate ROMSH forces FULLCGRID 1 keyword STRCALLING type scalar string Used by xxx keyword YREVERSE default computed according to gphit 0 1:jpj 1 LT gphit 0 0:jpj 2 type scalar Force the manual definition of the y reverse that must be apply to the data The resulting value will be stored in the common cm_4mesh variable key_yreverse keyword ZAXIS type 1D Specify the vertical axis Must be sorted in the increasing or decreasing order keyword ZREVERSE default computed according to gdept 0 GT gdept 1 type scalar Force the manual definition of the z reverse that must be apply to the data The resulting value will be stored in the common cm_4mesh variable key_zreverse keyword _EXTRA not used in the present case uses cm_4mesh cm_4data cm_4cal restrictions if the grid has x y periodicity overlap and or if the mask has 0 everywhere at the border like a closed sea and if we did not activate plain and xminmesh xmaxmesh yminmesh ymaxmesh keywords are defined to their default values we redefine xminmesh xmaxmesh yminmesh ymaxmesh in order to reove the overlapping part and or to open the domain avoid it be forced to use cell_fill 1 FUV points definition is not exact if the grid is irregular history Sebastien Masson smasson lodyc jussieu fr 2000 04 20 Sept 2004 several bug fix to suit C grid type Aug 2005 rewritte almost everything version Id: computegrid pro 399 2009 07 02 08:38:54Z smasson PRO computegrid startx starty stepxin stepyin nxin nyin XAXIS xaxis YAXIS yaxis ZAXIS zaxis MASK mask GLAMBOUNDARY glamboundary XMINMESH xminmesh XMAXMESH xmaxmesh YMINMESH yminmesh YMAXMESH ymaxmesh ZMINMESH zminmesh ZMAXMESH zmaxmesh ONEARTH onearth PERIODIC periodic PLAIN plain SHIFT shift STRIDE stride YREVERSE yreverse ZREVERSE zreverse FULLCGRID fullcgrid XYINDEX xyindex UBASE2TBASE ubase2tbase VBASE2TBASE vbase2tbase FBASE2TBASE fbase2tbase STRCALLING strcalling ROMSH romsh _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh cm_4data cm_4cal IF NOT keyword_set key_forgetold THEN BEGIN updatenew updatekwd ENDIF time1 systime 1 for key_performance Check input parameters xaxis related parameters if n_elements xaxis NE 0 then BEGIN CASE size xaxis 0 OF 0:nx 1L 1:nx size xaxis 1 2:nx size xaxis 1 ENDCASE ENDIF ELSE BEGIN IF n_elements startx EQ 0 THEN BEGIN dummy report If xaxis is not given startx must be defined return ENDIF CASE n_elements stepxin OF 0:BEGIN dummy report If xaxis is not given stepxin must be defined return END 1:BEGIN IF n_elements nxin EQ 0 THEN BEGIN dummy report If xaxis is not given and stepxin has only one element nx must be defined return ENDIF ELSE nx nxin END ELSE:nx n_elements stepxin ENDCASE ENDELSE yaxis related parameters if n_elements yaxis NE 0 then BEGIN CASE size yaxis 0 OF 0:ny 1L 1:ny size yaxis 1 2:ny size yaxis 2 ENDCASE ENDIF ELSE BEGIN IF n_elements starty EQ 0 THEN BEGIN dummy report If yaxis is not given starty must be defined return ENDIF CASE n_elements stepyin OF 0:BEGIN dummy report If yaxis is not given stepyin must be defined return END 1:BEGIN IF n_elements nyin EQ 0 THEN BEGIN dummy report If yaxis is not given and stepyin has only one element ny must be defined return ENDIF ELSE ny nyin END ELSE:ny n_elements stepyin ENDCASE ENDELSE zaxis related parameters if n_elements zaxis NE 0 then BEGIN CASE size zaxis 0 OF 0:nz 1L 1:nz size zaxis 1 ELSE:BEGIN ras report not coded stop END ENDCASE ENDIF ELSE nz 1L Others automatic definitions IF keyword_set romsh THEN fullcgrid 1 CASE 1 OF keyword_set fbase2tbase :key_gridtype c_f keyword_set ubase2tbase :key_gridtype c_u keyword_set vbase2tbase :key_gridtype c_v else:key_gridtype c ENDCASE IF strlen key_gridtype EQ 3 THEN fullcgrid 1 IF n_elements xminmesh NE 0 AND n_elements xmaxmesh NE 0 THEN BEGIN IF nx EQ jpi AND xminmesh EQ ixminmesh AND xmaxmesh EQ ixmaxmesh THEN xalreadycut 1 ENDIF IF keyword_set xalreadycut THEN BEGIN xmin 0 xmax jpi 1 nxx jpi ENDIF ELSE BEGIN jpiglo long nx IF keyword_set romsh THEN jpiglo jpiglo 1 IF n_elements xminmesh NE 0 THEN ixminmesh long xminmesh 0 ELSE ixminmesh 0l IF n_elements xmaxmesh NE 0 THEN ixmaxmesh long xmaxmesh 0 ELSE ixmaxmesh jpiglo 1 IF ixmaxmesh LT 0 THEN ixmaxmesh jpiglo 1 ixmaxmesh ixmaxmesh 0 ixmaxmesh ixminmesh iymaxmesh iyminmesh izmaxmesh izminmesh temporary glamf gphif temporary glamu gphiu temporary glamv gphiv gdept stepz 2 ENDIF ELSE BEGIN stepz 1 gdepw gdept ENDELSE IF keyword_set romsh THEN gdepw gdept e3 tw : e3t stepz IF n_elements stepz GT 1 THEN BEGIN e3w 0 5 stepz shift stepz 1 e3w 0 0 5 e3t 0 ENDIF ELSE e3w e3t Mask default mask eq 1 if NOT keyword_set mask then tmask 1 ELSE tmask mask if tmask 0 NE 1 then BEGIN tmask byte temporary tmask IF keyword_set romsh THEN tmask tmask 0:jpiglo 1 0:jpjglo 1 IF n_elements mask EQ nxx nyy AND nzz GT 1 THEN BEGIN tmask tmask replicate 1b nzz tmask reform tmask nxx nyy nzz overwrite ENDIF IF nxx EQ 1 OR nyy EQ 1 OR nzz EQ 1 THEN tmask reform tmask nxx nyy nzz overwrite tmask tmask xmin:xmax ymin:ymax zmin:zmax IF jpi EQ 1 OR jpj EQ 1 OR jpk EQ 1 THEN tmask reform tmask jpi jpj jpk over if key_shift NE 0 then tmask shift tmask key_shift 0 0 because tmask reverse tmask 2 is not working if the 3rd dimension of tmask 1 we call reform IF jpk EQ 1 THEN tmask reform tmask over IF key_yreverse EQ 1 THEN tmask reverse tmask 2 IF jpk EQ 1 THEN tmask reform tmask jpi jpj jpk over IF key_zreverse EQ 1 THEN tmask reverse tmask 3 IF jpk EQ 1 THEN tmask reform tmask jpi jpj jpk over IF keyword_set fullcgrid THEN BEGIN IF keyword_set key_periodic THEN BEGIN msk tmask shift tmask 1 0 0 umaskred msk jpi 1 ENDIF ELSE umaskred tmask jpi 1 vmaskred tmask jpj 1 ENDIF fmaskredy tmask jpi 1 fmaskredx tmask jpj 1 ENDIF ELSE BEGIN tmask replicate 1b jpi jpj jpk IF keyword_set fullcgrid THEN BEGIN umaskred replicate 1b jpj jpk vmaskred replicate 1b jpi jpk ENDIF fmaskredy replicate 1b jpj jpk fmaskredx replicate 1b jpi jpk ENDELSE IF jpi GT 2 AND jpj GT 2 AND NOT keyword_set plain AND ixminmesh EQ 0l AND ixmaxmesh eq jpiglo 1 AND iyminmesh EQ 0l AND iymaxmesh eq jpjglo 1 AND total tmask 0 EQ 0 AND total tmask jpj 1 EQ 0 AND total tmask 0 EQ 0 AND total tmask jpi 1 EQ 0 THEN BEGIN xminmesh 1 xmaxmesh 1 yminmesh 1 ymaxmesh 1 computegrid XAXIS glamt YAXIS gphit ZAXIS zaxis MASK mask GLAMBOUNDARY glamboundary XMINMESH xminmesh XMAXMESH xmaxmesh YMINMESH yminmesh YMAXMESH ymaxmesh ZMINMESH zminmesh ZMAXMESH zmaxmesh ONEARTH onearth PERIODIC periodic PLAIN plain SHIFT shift STRIDE stride FULLCGRID fullcgrid XYINDEX xyindex UBASE2TBASE ubase2tbase VBASE2TBASE vbase2tbase FBASE2TBASE fbase2tbase STRCALLING strcalling ROMSH romsh _extra ex return ENDIF IF NOT keyword_set fullcgrid THEN BEGIN umaskred values f_nan vmaskred values f_nan ENDIF stride IF total key_stride GT 3 THEN BEGIN IF key_shift NE 0 THEN BEGIN for explanation see header of read_ncdf_varget pro jpiright key_shift jpileft jpi key_shift key_stride 0 1 key_shift 1 MOD key_stride 0 jpi jpiright 1 key_stride 0 1 jpileft 1 key_stride 0 1 ENDIF ELSE jpi jpi 1 key_stride 0 1 jpj jpj 1 key_stride 1 1 jpk jpk 1 key_stride 2 1 glamt temporary glamt 0: :stride 0 0: :stride 1 gphit temporary gphit 0: :stride 0 0: :stride 1 e1t temporary e1t 0: :stride 0 0: :stride 1 e2t temporary e2t 0: :stride 0 0: :stride 1 tmask temporary tmask 0: :stride 0 0: :stride 1 0: :stride 2 gdept gdept 0: :stride 2 gdepw gdepw 0: :stride 2 e3t e3t 0: :stride 2 e3w e3w 0: :stride 2 we must recompute glamf and gphif IF jpi GT 1 THEN BEGIN if keyword_set key_onearth AND keyword_set xnotsorted OR keyword_set key_periodic AND key_irregular then BEGIN stepxf glamt 720 MOD 360 stepxf shift stepxf 1 1 stepxf stepxf stepxf stepxf 360 stepxf 360 stepxf min abs stepxf dimension 3 IF NOT keyword_set key_periodic THEN stepxf jpi 1 stepxf jpi 2 ENDIF ELSE BEGIN stepxf shift glamt 1 1 glamt IF keyword_set key_periodic THEN stepxf jpi 1 360 stepxf jpi 1 ELSE stepxf jpi 1 stepxf jpi 2 ENDELSE IF jpj GT 1 THEN BEGIN stepxf jpj 1 stepxf jpj 2 stepxf jpi 1 jpj 1 stepxf jpi 2 jpj 2 ENDIF glamf glamt 0 5 stepxf ENDIF ELSE glamf glamt 0 5 IF keyword_set key_periodic AND max glamf min glamt GE 360 THEN BEGIN IF NOT keyword_set glamboundary THEN BEGIN bigger where glamf GE min glamt 360 glamf bigger glamf bigger 360 ENDIF ELSE glamf glamboundary 0 temporary glamf glamboundary 1 ENDIF IF jpj GT 1 THEN BEGIN we must compute stepyf: y distance between T i j T i 1 j 1 stepyf shift gphit 1 1 gphit stepyf jpj 1 stepyf jpj 2 IF jpi GT 1 THEN BEGIN if NOT keyword_set key_periodic THEN stepyf jpi 1 stepyf jpi 2 stepyf jpi 1 jpj 1 stepyf jpi 2 jpj 2 ENDIF gphif gphit 0 5 stepyf ENDIF ELSE gphif gphit 0 5 IF jpj EQ 1 THEN BEGIN glamt reform glamt jpi jpj over gphit reform gphit jpi jpj over glamf reform glamf jpi jpj over gphif reform gphif jpi jpj over e1t reform e1t jpi jpj over e2t reform e2t jpi jpj over ENDIF IF keyword_set fullcgrid THEN BEGIN glamu temporary glamu 0: :stride 0 0: :stride 1 gphiu temporary gphiu 0: :stride 0 0: :stride 1 e1u temporary e1u 0: :stride 0 0: :stride 1 e2u temporary e2u 0: :stride 0 0: :stride 1 glamv temporary glamv 0: :stride 0 0: :stride 1 gphiv temporary gphiv 0: :stride 0 0: :stride 1 e1v temporary e1v 0: :stride 0 0: :stride 1 e2v temporary e2v 0: :stride 0 0: :stride 1 e1f temporary e1f 0: :stride 0 0: :stride 1 e2f temporary e2f 0: :stride 0 0: :stride 1 umaskred temporary umaskred 0 0: :stride 1 0: :stride 2 vmaskred temporary vmaskred 0: :stride 0 0 0: :stride 2 fmaskredy temporary fmaskredy 0 0: :stride 1 0: :stride 2 fmaskredx temporary fmaskredx 0: :stride 0 0 0: :stride 2 IF jpj EQ 1 THEN BEGIN glamu reform glamu jpi jpj over gphiu reform gphiu jpi jpj over e1u reform e1u jpi jpj over e2u reform e2u jpi jpj over glamv reform glamv jpi jpj over gphiv reform gphiv jpi jpj over e1v reform e1v jpi jpj over e2v reform e2v jpi jpj over e1f reform e1f jpi jpj over e2f reform e2f jpi jpj over ENDIF ENDIF ENDIF apply all the grid parameters updateold domdef Triangulation IF total tmask EQ jpi jpj jpk AND NOT keyword_set key_irregular THEN triangles_list 1 ELSE BEGIN are we using ORCA2 IF jpiglo EQ 182 AND jpi EQ 180 AND jpjglo EQ 149 AND jpj EQ 148 THEN triangles_list triangule ELSE triangles_list triangule keep_cont ENDELSE time axis default definition IF n_elements time EQ 0 OR n_elements jpt EQ 0 THEN BEGIN jpt 1 time 0 ENDIF IF NOT keyword_set key_forgetold THEN BEGIN updateold ENDIF grid parameters used by xxx IF NOT keyword_set strcalling THEN BEGIN IF n_elements ccmeshparameters EQ 0 THEN strcalling computegrid ELSE strcalling ccmeshparameters filename ENDIF IF n_elements glamt GE 2 THEN BEGIN glaminfo moment glamt IF finite glaminfo 2 EQ 0 THEN glaminfo glaminfo 0:1 gphiinfo moment gphit IF finite gphiinfo 2 EQ 0 THEN gphiinfo gphiinfo 0:1 ENDIF ELSE BEGIN glaminfo glamt gphiinfo gphit ENDELSE IF keyword_set romsh THEN romszinfos h:romsh xmin:xmax ymin:ymax zeta:replicate 0 jpi jpj theta_s: 1 theta_b: 1 hc: 1 ELSE romszinfos h: 1 zeta: 1 theta_s: 1 theta_b: 1 hc: 1 ccmeshparameters filename:strcalling glaminfo:float string glaminfo format E11 4 gphiinfo:float string gphiinfo format E11 4 jpiglo:jpiglo jpjglo:jpjglo jpkglo:jpkglo jpi:jpi jpj:jpj jpk:jpk ixminmesh:ixminmesh ixmaxmesh:ixmaxmesh iyminmesh:iyminmesh iymaxmesh:iymaxmesh izminmesh:izminmesh izmaxmesh:izmaxmesh key_shift:key_shift key_periodic:key_periodic key_stride:key_stride key_gridtype:key_gridtype key_yreverse:key_yreverse key_zreverse:key_zreverse key_partialstep:key_partialstep key_onearth:key_onearth ccreadparameters funclec_name: read_ncdf jpidta:jpidta jpjdta:jpjdta jpkdta:jpkdta ixmindta:ixmindta ixmaxdta:ixmaxdta iymindta:iymindta iymaxdta:iymaxdta izmindta:izmindta izmaxdta:izmaxdta IF keyword_set key_performance EQ 1 THEN print time computegrid systime 1 time1 return end"); a[38] = new Array("./Grid/micromeshmask.html", "micromeshmask.pro", "", " file_comments Reduce the size of the NetCDF meshmask created by OPA by using bit and not byte format for the masks and the float format for the other fields categories For OPA param inid in required param outid in required param inname in required param outname in optional history July 2004 Sebastien Masson smasson lodyc jussieu fr version Id: micromeshmask pro 394 2009 02 26 13:58:03Z smasson PRO ncdf_transfer inid outid inname outname compile_opt idl2 strictarrsubs IF n_elements outname EQ 0 THEN outname inname ncdf_varget inid inname zzz ncdf_varput outid outname float reform zzz over RETURN END param ncfilein in required 1 the name of the meshmask file to be reduced In that case there is only one meshmask file OR 2 the xxx part in the names: xxx mesh_hgr nc xxx mesh_zgr nc xxx mask nc In that case the meshmask is split into 3 files param ncfileout in optional default micromeshmask nc the name of the uniq reduced meshmask file keyword IODIR to define the files path examples IDL meshdir d1fes2 raid2 smasson DATA ORCA05 IDL micromeshmask meshmask_ORCA_R05 nc iodir meshdir PRO micromeshmask ncfilein ncfileout IODIR iodir compile_opt idl2 strictarrsubs filein isafile FILE ncfilein IODIR iodir NEW test findfile filein 0 IF test EQ THEN BEGIN filein_hgr findfile filein mesh_hgr nc 0 filein_zgr findfile filein mesh_zgr nc 0 filein_msk findfile filein mask nc 0 IF filein_hgr EQ OR filein_zgr EQ OR filein_msk EQ THEN BEGIN ras report meshmask file s not found filein does not exist filein mesh_hgr nc does not exist filein mesh_zgr nc does not exist filein mask nc does not exist return ENDIF ENDIF ELSE filein test get the horizontal dimensions IF n_elements filein_hgr NE 0 THEN cdfid ncdf_open filein_hgr ELSE cdfid ncdf_open filein ncdf_diminq cdfid x name jpi ncdf_diminq cdfid y name jpj for the mask we use its byte representation its y dimension will be extended to be a multiple of 8 then it will be divided by 8 if jpj mod 8 eq 0 the jpj_m jpi 8 else jpj_m jpi 8 1 jpj_m jpj 7 8 get the vertical dimensions IF n_elements filein_zgr NE 0 THEN BEGIN ncdf_close cdfid cdfid ncdf_open filein_zgr ENDIF listdims strlowcase ncdf_listdims cdfid IF where listdims EQ z 0 NE 1 THEN ncdf_diminq cdfid z name jpk ELSE BEGIN dimid where strmid listdims 0 5 EQ depth 0 IF dimid NE 1 THEN ncdf_diminq cdfid dimid name jpk ELSE BEGIN dummy report We could not find the vertical dimension its name must be z or start with depth return ENDELSE ENDELSE get the variables list related to the partial steps zgr_varlist ncdf_listvars cdfid zgr_varlist strtrim strlowcase zgr_varlist 2 define the output file IF n_elements ncfileout EQ 0 THEN ncfileout micromeshmask nc cdfidout ncdf_create isafile FILE ncfileout IODIR iodir NEW clobber ncdf_control cdfidout nofill dimension dimidx ncdf_dimdef cdfidout x jpi dimidy ncdf_dimdef cdfidout y jpj dimidy_m ncdf_dimdef cdfidout y_m jpj_m dimidz ncdf_dimdef cdfidout z jpk global attributs ncdf_attput cdfidout IDL_Program_Name micromeshmask pro GLOBAL ncdf_attput cdfidout Creation_Date systime GLOBAL declaration des variables varid lonarr 20 horizontal variables hgrlist glamt glamu glamv glamf gphit gphiu gphiv gphif e1t e1u e1v e1f e2t e2u e2v e2f FOR h 0 n_elements hgrlist 1 DO varid h ncdf_vardef cdfidout hgrlist h dimidx dimidy float vertical variables zgrlist e3t e3w gdept gdepw FOR z 0 n_elements zgrlist 1 DO varid 16 z ncdf_vardef cdfidout zgrlist z dimidz float variables related to the partial steps IF where zgr_varlist EQ hdept 0 NE 1 THEN varid varid ncdf_vardef cdfidout hdept dimidx dimidy float IF where zgr_varlist EQ hdepw 0 NE 1 THEN varid varid ncdf_vardef cdfidout hdepw dimidx dimidy float old variable name keep for compatibility with old run Change e3tp to e3t_ps IF where zgr_varlist EQ e3tp 0 NE 1 THEN varid varid ncdf_vardef cdfidout e3t_ps dimidx dimidy float old variable name keep for compatibility with old run Change e3wp to e3w_ps IF where zgr_varlist EQ e3wp 0 NE 1 THEN varid varid ncdf_vardef cdfidout e3w_ps dimidx dimidy float IF where zgr_varlist EQ e3t_ps 0 NE 1 THEN varid varid ncdf_vardef cdfidout e3t_ps dimidx dimidy float IF where zgr_varlist EQ e3w_ps 0 NE 1 THEN varid varid ncdf_vardef cdfidout e3w_ps dimidx dimidy float IF where zgr_varlist EQ e3u_ps 0 NE 1 THEN varid varid ncdf_vardef cdfidout e3u_ps dimidx dimidy float IF where zgr_varlist EQ e3v_ps 0 NE 1 THEN varid varid ncdf_vardef cdfidout e3v_ps dimidx dimidy float IF where zgr_varlist EQ mbathy 0 NE 1 THEN varid varid ncdf_vardef cdfidout mbathy dimidx dimidy short mask variable msklist tmask umask vmask fmask FOR m 0 n_elements msklist 1 DO BEGIN varid varid ncdf_vardef cdfidout msklist m dimidx dimidy_m dimidz byte ncdf_attput cdfidout varid n_elements varid 1 Comment the mask is stored as bit You must use the binary representation of the byte to get back the data ENDFOR ncdf_control cdfidout endef get the horizontal variables IF n_elements filein_hgr NE 0 THEN BEGIN ncdf_close cdfid cdfid ncdf_open filein_hgr ENDIF FOR h 0 n_elements hgrlist 1 DO ncdf_transfer cdfid cdfidout hgrlist h get the vertical variables IF n_elements filein_zgr NE 0 THEN BEGIN ncdf_close cdfid cdfid ncdf_open filein_zgr ENDIF inzgrlist zgrlist IF where zgr_varlist EQ gdept_0 0 NE 1 THEN inzgrlist inzgrlist _0 FOR z 0 n_elements zgrlist 1 DO ncdf_transfer cdfid cdfidout inzgrlist z zgrlist z partial step variables IF where zgr_varlist EQ hdept 0 NE 1 THEN ncdf_transfer cdfid cdfidout hdept IF where zgr_varlist EQ hdepw 0 NE 1 THEN ncdf_transfer cdfid cdfidout hdepw IF where zgr_varlist EQ e3tp 0 NE 1 THEN ncdf_transfer cdfid cdfidout e3tp e3t_ps IF where zgr_varlist EQ e3wp 0 NE 1 THEN ncdf_transfer cdfid cdfidout e3wp e3w_ps IF where zgr_varlist EQ e3t_ps 0 NE 1 THEN ncdf_transfer cdfid cdfidout e3t_ps IF where zgr_varlist EQ e3w_ps 0 NE 1 THEN ncdf_transfer cdfid cdfidout e3w_ps IF where zgr_varlist EQ e3u_ps 0 NE 1 THEN ncdf_transfer cdfid cdfidout e3u_ps IF where zgr_varlist EQ e3v_ps 0 NE 1 THEN ncdf_transfer cdfid cdfidout e3v_ps IF where zgr_varlist EQ mbathy 0 NE 1 THEN ncdf_transfer cdfid cdfidout mbathy mask IF n_elements filein_msk NE 0 THEN BEGIN ncdf_close cdfid cdfid ncdf_open filein_msk ENDIF loop on the vertical levels to limit the memory use FOR k 0 jpk 1 DO BEGIN FOR m 0 3 DO BEGIN CASE ncdf_varinq cdfid msklist m ndims OF 3:ncdf_varget cdfid msklist m zzz offset 0 0 k count jpi jpj 1 4:ncdf_varget cdfid msklist m zzz offset 0 0 k 0 count jpi jpj 1 1 ENDCASE zzz byte temporary zzz zzz must contain only 0 or 1 zzz temporary zzz MOD 2 we transpose zzz because we need to work with the y dimension as the first dimension zzz transpose temporary zzz extend jpj to be a multiple of 8 jpjadd jpj_m 8 jpj IF jpjadd NE 0 THEN zzz temporary zzz bytarr jpjadd jpi reform zzz to look like output of binary pro zzz reform zzz 8 1 jpj_m jpi over convert into its byte form zzz inverse_binary temporary zzz ncdf_varput cdfidout msklist m transpose temporary zzz offset 0 0 k count jpi jpj_m 1 ENDFOR ENDFOR ncdf_close cdfid ncdf_close cdfidout RETURN END"); a[39] = new Array("./Grid/n128gaussian.html", "n128gaussian.pro", "", " file_comments compute the latitudes of the n128 gaussian grid See: Gaussian 128 categories Grid examples IDL lat n128gaussian returns a 1d array history Sebastien Masson smasson lodyc jussieu fr June 2004 version Id: n128gaussian pro 371 2008 08 07 09:32:02Z pinsard FUNCTION n128gaussian compile_opt idl2 strictarrsubs latitude reduced regular latitude number points points n128 1 18 512 89 46282 2 25 512 88 76695 3 36 512 88 06697 4 40 512 87 36606 5 45 512 86 66480 6 50 512 85 96337 7 60 512 85 26184 8 64 512 84 56026 9 72 512 83 85863 10 72 512 83 15698 11 80 512 82 45531 12 90 512 81 75363 13 90 512 81 05194 14 100 512 80 35023 15 108 512 79 64852 16 120 512 78 94681 17 120 512 78 24509 18 125 512 77 54336 19 128 512 76 84163 20 144 512 76 13990 21 144 512 75 43817 22 150 512 74 73644 23 160 512 74 03470 24 160 512 73 33296 25 180 512 72 63123 26 180 512 71 92949 27 180 512 71 22774 28 192 512 70 52600 29 192 512 69 82426 30 200 512 69 12252 31 216 512 68 42077 32 216 512 67 71903 33 216 512 67 01728 34 225 512 66 31554 35 240 512 65 61379 36 240 512 64 91204 37 240 512 64 21030 38 250 512 63 50855 39 250 512 62 80680 40 256 512 62 10505 41 270 512 61 40330 42 270 512 60 70156 43 288 512 59 99981 44 288 512 59 29806 45 288 512 58 59631 46 300 512 57 89456 47 300 512 57 19281 48 320 512 56 49106 49 320 512 55 78931 50 320 512 55 08756 51 320 512 54 38581 52 324 512 53 68406 53 360 512 52 98231 54 360 512 52 28056 55 360 512 51 57881 56 360 512 50 87705 57 360 512 50 17530 58 360 512 49 47355 59 360 512 48 77180 60 375 512 48 07005 61 375 512 47 36830 62 375 512 46 66655 63 375 512 45 96479 64 384 512 45 26304 65 384 512 44 56129 66 400 512 43 85954 67 400 512 43 15779 68 400 512 42 45604 69 400 512 41 75428 70 405 512 41 05253 71 432 512 40 35078 72 432 512 39 64903 73 432 512 38 94728 74 432 512 38 24552 75 432 512 37 54377 76 432 512 36 84202 77 432 512 36 14027 78 450 512 35 43851 79 450 512 34 73676 80 450 512 34 03501 n128 n128 81 450 512 33 33326 82 450 512 32 63150 83 480 512 31 92975 84 480 512 31 22800 85 480 512 30 52625 86 480 512 29 82449 87 480 512 29 12274 88 480 512 28 42099 89 480 512 27 71924 90 480 512 27 01748 91 480 512 26 31573 92 480 512 25 61398 93 486 512 24 91223 94 486 512 24 21047 95 486 512 23 50872 96 500 512 22 80697 97 500 512 22 10521 98 500 512 21 40346 99 500 512 20 70171 100 500 512 19 99996 101 500 512 19 29820 102 500 512 18 59645 103 512 512 17 89470 104 512 512 17 19294 105 512 512 16 49119 106 512 512 15 78944 107 512 512 15 08768 108 512 512 14 38593 109 512 512 13 68418 110 512 512 12 98243 111 512 512 12 28067 112 512 512 11 57892 113 512 512 10 87717 114 512 512 10 17541 115 512 512 9 47366 116 512 512 8 77191 117 512 512 8 07016 118 512 512 7 36840 119 512 512 6 66665 120 512 512 5 96490 121 512 512 5 26314 122 512 512 4 56139 123 512 512 3 85964 124 512 512 3 15788 125 512 512 2 45613 126 512 512 1 75438 127 512 512 1 05262 128 512 512 0 35087 n128 reform n128 4 128 over n128 reform n128 3 over n128 n128 reverse n128 return n128 end"); a[40] = new Array("./Grid/n160gaussian.html", "n160gaussian.pro", "", " file_comments compute the latitudes of the n160 gaussian grid See: Gaussian 160 categories Grid examples IDL lat n160gaussian returns a 1d array history Sebastien Masson smasson lodyc jussieu fr June 2004 version Id: n160gaussian pro 371 2008 08 07 09:32:02Z pinsard FUNCTION n160gaussian compile_opt idl2 strictarrsubs latitude reduced regular latitude number points points n160 1 18 640 89 57009 2 25 640 89 01318 3 36 640 88 45297 4 40 640 87 89203 5 45 640 87 33080 6 50 640 86 76944 7 60 640 86 20800 8 64 640 85 64651 9 72 640 85 08499 10 72 640 84 52345 11 80 640 83 96190 12 90 640 83 40033 13 90 640 82 83876 14 96 640 82 27718 15 108 640 81 71559 16 120 640 81 15400 17 120 640 80 59240 18 125 640 80 03080 19 128 640 79 46920 20 135 640 78 90760 21 144 640 78 34600 22 150 640 77 78439 23 160 640 77 22278 24 160 640 76 66117 25 180 640 76 09956 26 180 640 75 53795 27 180 640 74 97634 28 192 640 74 41473 29 192 640 73 85311 30 200 640 73 29150 31 216 640 72 72988 32 216 640 72 16827 33 225 640 71 60665 34 225 640 71 04504 35 240 640 70 48342 36 240 640 69 92181 37 243 640 69 36019 38 250 640 68 79857 39 256 640 68 23695 40 270 640 67 67534 41 270 640 67 11372 42 288 640 66 55210 43 288 640 65 99048 44 288 640 65 42886 45 300 640 64 86725 46 300 640 64 30563 47 320 640 63 74401 48 320 640 63 18239 49 320 640 62 62077 50 320 640 62 05915 51 324 640 61 49753 52 360 640 60 93591 53 360 640 60 37429 54 360 640 59 81267 55 360 640 59 25105 56 360 640 58 68943 57 360 640 58 12781 58 375 640 57 56619 59 375 640 57 00457 60 375 640 56 44295 61 384 640 55 88133 62 384 640 55 31971 63 400 640 54 75809 64 400 640 54 19647 65 400 640 53 63485 66 405 640 53 07323 67 432 640 52 51161 68 432 640 51 94999 69 432 640 51 38837 70 432 640 50 82675 71 432 640 50 26513 72 450 640 49 70351 73 450 640 49 14189 74 450 640 48 58026 75 450 640 48 01864 76 480 640 47 45702 77 480 640 46 89540 78 480 640 46 33378 79 480 640 45 77216 80 480 640 45 21054 n160 n160 81 480 640 44 64892 82 480 640 44 08730 83 500 640 43 52567 84 500 640 42 96405 85 500 640 42 40243 86 500 640 41 84081 87 500 640 41 27919 88 512 640 40 71757 89 512 640 40 15595 90 540 640 39 59433 91 540 640 39 03270 92 540 640 38 47108 93 540 640 37 90946 94 540 640 37 34784 95 540 640 36 78622 96 540 640 36 22460 97 540 640 35 66298 98 576 640 35 10136 99 576 640 34 53973 100 576 640 33 97811 101 576 640 33 41649 102 576 640 32 85487 103 576 640 32 29325 104 576 640 31 73163 105 576 640 31 17000 106 576 640 30 60838 107 576 640 30 04676 108 600 640 29 48514 109 600 640 28 92352 110 600 640 28 36190 111 600 640 27 80028 112 600 640 27 23865 113 600 640 26 67703 114 600 640 26 11541 115 600 640 25 55379 116 600 640 24 99217 117 640 640 24 43055 118 640 640 23 86892 119 640 640 23 30730 120 640 640 22 74568 121 640 640 22 18406 122 640 640 21 62244 123 640 640 21 06082 124 640 640 20 49919 125 640 640 19 93757 126 640 640 19 37595 127 640 640 18 81433 128 640 640 18 25271 129 640 640 17 69109 130 640 640 17 12946 131 640 640 16 56784 132 640 640 16 00622 133 640 640 15 44460 134 640 640 14 88298 135 640 640 14 32136 136 640 640 13 75973 137 640 640 13 19811 138 640 640 12 63649 139 640 640 12 07487 140 640 640 11 51325 141 640 640 10 95162 142 640 640 10 39000 143 640 640 9 82838 144 640 640 9 26676 145 640 640 8 70514 146 640 640 8 14352 147 640 640 7 58189 148 640 640 7 02027 149 640 640 6 45865 150 640 640 5 89703 151 640 640 5 33541 152 640 640 4 77379 153 640 640 4 21216 154 640 640 3 65054 155 640 640 3 08892 156 640 640 2 52730 157 640 640 1 96568 158 640 640 1 40405 159 640 640 0 84243 160 640 640 0 28081 n160 reform n160 4 160 over n160 reform n160 3 over n160 n160 reverse n160 return n160 end"); a[41] = new Array("./Grid/n256gaussian.html", "n256gaussian.pro", "", " file_comments compute the latitudes of the n256 gaussian grid See: Gaussian 256 categories Grid examples IDL lat n256gaussian returns a 1d array history Sebastien Masson smasson lodyc jussieu fr June 2004 version Id: n256gaussian pro 371 2008 08 07 09:32:02Z pinsard FUNCTION n256gaussian compile_opt idl2 strictarrsubs latitude reduced regular latitude number points points n256 1 18 1024 89 73115 2 25 1024 89 38287 3 32 1024 89 03254 4 40 1024 88 68175 5 45 1024 88 33077 6 50 1024 87 97972 7 60 1024 87 62861 8 64 1024 87 27748 9 72 1024 86 92632 10 72 1024 86 57515 11 75 1024 86 22398 12 81 1024 85 87279 13 90 1024 85 52160 14 96 1024 85 17041 15 100 1024 84 81921 16 108 1024 84 46801 17 120 1024 84 11681 18 120 1024 83 76560 19 125 1024 83 41440 20 135 1024 83 06319 21 144 1024 82 71198 22 150 1024 82 36077 23 160 1024 82 00956 24 160 1024 81 65835 25 180 1024 81 30714 26 180 1024 80 95593 27 180 1024 80 60471 28 192 1024 80 25350 29 192 1024 79 90229 30 200 1024 79 55107 31 216 1024 79 19986 32 216 1024 78 84864 33 216 1024 78 49743 34 225 1024 78 14621 35 240 1024 77 79500 36 240 1024 77 44378 37 243 1024 77 09256 38 250 1024 76 74135 39 256 1024 76 39013 40 270 1024 76 03891 41 270 1024 75 68770 42 288 1024 75 33648 43 288 1024 74 98526 44 288 1024 74 63405 45 300 1024 74 28283 46 300 1024 73 93161 47 320 1024 73 58040 48 320 1024 73 22918 49 320 1024 72 87796 50 324 1024 72 52674 51 360 1024 72 17552 52 360 1024 71 82431 53 360 1024 71 47309 54 360 1024 71 12187 55 360 1024 70 77065 56 360 1024 70 41944 57 375 1024 70 06822 58 375 1024 69 71700 59 384 1024 69 36578 60 384 1024 69 01456 61 400 1024 68 66334 62 400 1024 68 31213 63 400 1024 67 96091 64 432 1024 67 60969 65 432 1024 67 25847 66 432 1024 66 90725 67 432 1024 66 55603 68 432 1024 66 20482 69 450 1024 65 85360 70 450 1024 65 50238 71 450 1024 65 15116 72 480 1024 64 79994 73 480 1024 64 44872 74 480 1024 64 09750 75 480 1024 63 74629 76 480 1024 63 39507 77 486 1024 63 04385 78 500 1024 62 69263 79 500 1024 62 34141 80 500 1024 61 99019 n256 n256 81 512 1024 61 63897 82 512 1024 61 28776 83 540 1024 60 93654 84 540 1024 60 58532 85 540 1024 60 23410 86 540 1024 59 88288 87 540 1024 59 53166 88 576 1024 59 18044 89 576 1024 58 82922 90 576 1024 58 47800 91 576 1024 58 12679 92 576 1024 57 77557 93 576 1024 57 42435 94 600 1024 57 07313 95 600 1024 56 72191 96 600 1024 56 37069 97 600 1024 56 01947 98 600 1024 55 66825 99 640 1024 55 31703 100 640 1024 54 96581 101 640 1024 54 61460 102 640 1024 54 26338 103 640 1024 53 91216 104 640 1024 53 56094 105 640 1024 53 20972 106 640 1024 52 85850 107 648 1024 52 50728 108 675 1024 52 15606 109 675 1024 51 80484 110 675 1024 51 45362 111 675 1024 51 10241 112 675 1024 50 75119 113 675 1024 50 39997 114 720 1024 50 04875 115 720 1024 49 69753 116 720 1024 49 34631 117 720 1024 48 99509 118 720 1024 48 64387 119 720 1024 48 29265 120 720 1024 47 94143 121 720 1024 47 59021 122 720 1024 47 23899 123 729 1024 46 88778 124 729 1024 46 53656 125 750 1024 46 18534 126 750 1024 45 83412 127 750 1024 45 48290 128 750 1024 45 13168 129 750 1024 44 78046 130 768 1024 44 42924 131 768 1024 44 07802 132 768 1024 43 72680 133 768 1024 43 37558 134 800 1024 43 02436 135 800 1024 42 67315 136 800 1024 42 32193 137 800 1024 41 97071 138 800 1024 41 61949 139 800 1024 41 26827 140 800 1024 40 91705 141 800 1024 40 56583 142 810 1024 40 21461 143 810 1024 39 86339 144 864 1024 39 51217 145 864 1024 39 16095 146 864 1024 38 80973 147 864 1024 38 45851 148 864 1024 38 10730 149 864 1024 37 75608 150 864 1024 37 40486 151 864 1024 37 05364 152 864 1024 36 70242 153 864 1024 36 35120 154 864 1024 35 99998 155 864 1024 35 64876 156 864 1024 35 29754 157 864 1024 34 94632 158 900 1024 34 59510 159 900 1024 34 24388 160 900 1024 33 89266 n256 n256 161 900 1024 33 54145 162 900 1024 33 19023 163 900 1024 32 83901 164 900 1024 32 48779 165 900 1024 32 13657 166 900 1024 31 78535 167 900 1024 31 43413 168 900 1024 31 08291 169 960 1024 30 73169 170 960 1024 30 38047 171 960 1024 30 02925 172 960 1024 29 67803 173 960 1024 29 32681 174 960 1024 28 97559 175 960 1024 28 62438 176 960 1024 28 27316 177 960 1024 27 92194 178 960 1024 27 57072 179 960 1024 27 21950 180 960 1024 26 86828 181 960 1024 26 51706 182 960 1024 26 16584 183 960 1024 25 81462 184 960 1024 25 46340 185 960 1024 25 11218 186 960 1024 24 76096 187 960 1024 24 40974 188 960 1024 24 05852 189 960 1024 23 70731 190 960 1024 23 35609 191 972 1024 23 00487 192 972 1024 22 65365 193 972 1024 22 30243 194 972 1024 21 95121 195 972 1024 21 59999 196 1000 1024 21 24877 197 1000 1024 20 89755 198 1000 1024 20 54633 199 1000 1024 20 19511 200 1000 1024 19 84389 201 1000 1024 19 49267 202 1000 1024 19 14145 203 1000 1024 18 79023 204 1000 1024 18 43902 205 1000 1024 18 08780 206 1000 1024 17 73658 207 1000 1024 17 38536 208 1000 1024 17 03414 209 1000 1024 16 68292 210 1000 1024 16 33170 211 1000 1024 15 98048 212 1024 1024 15 62926 213 1024 1024 15 27804 214 1024 1024 14 92682 215 1024 1024 14 57560 216 1024 1024 14 22438 217 1024 1024 13 87316 218 1024 1024 13 52194 219 1024 1024 13 17073 220 1024 1024 12 81951 221 1024 1024 12 46829 222 1024 1024 12 11707 223 1024 1024 11 76585 224 1024 1024 11 41463 225 1024 1024 11 06341 226 1024 1024 10 71219 227 1024 1024 10 36097 228 1024 1024 10 00975 229 1024 1024 9 65853 230 1024 1024 9 30731 231 1024 1024 8 95609 232 1024 1024 8 60487 233 1024 1024 8 25365 234 1024 1024 7 90244 235 1024 1024 7 55122 236 1024 1024 7 20000 237 1024 1024 6 84878 238 1024 1024 6 49756 239 1024 1024 6 14634 240 1024 1024 5 79512 n256 n256 241 1024 1024 5 44390 242 1024 1024 5 09268 243 1024 1024 4 74146 244 1024 1024 4 39024 245 1024 1024 4 03902 246 1024 1024 3 68780 247 1024 1024 3 33658 248 1024 1024 2 98536 249 1024 1024 2 63415 250 1024 1024 2 28293 251 1024 1024 1 93171 252 1024 1024 1 58049 253 1024 1024 1 22927 254 1024 1024 0 87805 255 1024 1024 0 52683 256 1024 1024 0 17561 n256 reform n256 4 256 over n256 reform n256 3 over n256 n256 reverse n256 return n256 end"); a[42] = new Array("./Grid/n48gaussian.html", "n48gaussian.pro", "", " file_comments compute the latitudes of the n48 gaussian grid See: Gaussian 48 categories Grid examples IDL lat n48gaussian returns a 1d array history Sebastien Masson smasson lodyc jussieu fr June 2004 version Id: n48gaussian pro 371 2008 08 07 09:32:02Z pinsard FUNCTION n48gaussian compile_opt idl2 strictarrsubs latitude reduced regular latitude number points points n48 1 20 192 88 57216 2 25 192 86 72253 3 36 192 84 86197 4 40 192 82 99894 5 45 192 81 13497 6 50 192 79 27055 7 60 192 77 40588 8 60 192 75 54106 9 72 192 73 67613 10 75 192 71 81113 11 80 192 69 94608 12 90 192 68 08099 13 96 192 66 21587 14 100 192 64 35073 15 108 192 62 48557 16 120 192 60 62039 17 120 192 58 75520 18 120 192 56 89001 19 128 192 55 02480 20 135 192 53 15959 21 144 192 51 29437 22 144 192 49 42915 23 160 192 47 56392 24 160 192 45 69869 25 160 192 43 83345 26 160 192 41 96822 27 160 192 40 10297 28 180 192 38 23773 29 180 192 36 37249 30 180 192 34 50724 31 180 192 32 64199 32 180 192 30 77674 33 192 192 28 91149 34 192 192 27 04623 35 192 192 25 18098 36 192 192 23 31573 37 192 192 21 45047 38 192 192 19 58521 39 192 192 17 71996 40 192 192 15 85470 41 192 192 13 98944 42 192 192 12 12418 43 192 192 10 25892 44 192 192 8 39366 45 192 192 6 52840 46 192 192 4 66314 47 192 192 2 79788 48 192 192 0 93262 n48 reform n48 4 48 over n48 reform n48 3 over n48 n48 reverse n48 return n48 end"); a[43] = new Array("./Grid/n80gaussian.html", "n80gaussian.pro", "", " file_comments compute the latitudes of the n80 gaussian grid See: Gaussian 80 categories Grid examples IDL lat n80gaussian returns a 1d array history Sebastien Masson smasson lodyc jussieu fr June 2004 version Id: n80gaussian pro 371 2008 08 07 09:32:02Z pinsard FUNCTION n80gaussian compile_opt idl2 strictarrsubs latitude reduced regular latitude number points points n80 1 18 320 89 14152 2 25 320 88 02943 3 36 320 86 91077 4 40 320 85 79063 5 45 320 84 66992 6 54 320 83 54895 7 60 320 82 42782 8 64 320 81 30659 9 72 320 80 18531 10 72 320 79 06398 11 80 320 77 94262 12 90 320 76 82124 13 96 320 75 69984 14 100 320 74 57843 15 108 320 73 45701 16 120 320 72 33558 17 120 320 71 21414 18 128 320 70 09269 19 135 320 68 97124 20 144 320 67 84978 21 144 320 66 72833 22 150 320 65 60686 23 160 320 64 48540 24 160 320 63 36393 25 180 320 62 24246 26 180 320 61 12099 27 180 320 59 99952 28 192 320 58 87804 29 192 320 57 75657 30 200 320 56 63509 31 200 320 55 51361 32 216 320 54 39214 33 216 320 53 27066 34 216 320 52 14917 35 225 320 51 02769 36 225 320 49 90621 37 240 320 48 78473 38 240 320 47 66325 39 240 320 46 54176 40 256 320 45 42028 41 256 320 44 29879 42 256 320 43 17731 43 256 320 42 05582 44 288 320 40 93434 45 288 320 39 81285 46 288 320 38 69137 47 288 320 37 56988 48 288 320 36 44839 49 288 320 35 32691 50 288 320 34 20542 51 288 320 33 08393 52 288 320 31 96244 53 300 320 30 84096 54 300 320 29 71947 55 300 320 28 59798 56 300 320 27 47649 57 320 320 26 35500 58 320 320 25 23351 59 320 320 24 11203 60 320 320 22 99054 61 320 320 21 86905 62 320 320 20 74756 63 320 320 19 62607 64 320 320 18 50458 65 320 320 17 38309 66 320 320 16 26160 67 320 320 15 14011 68 320 320 14 01862 69 320 320 12 89713 70 320 320 11 77564 71 320 320 10 65415 72 320 320 9 53266 73 320 320 8 41117 74 320 320 7 28968 75 320 320 6 16819 76 320 320 5 04670 77 320 320 3 92521 78 320 320 2 80372 79 320 320 1 68223 80 320 320 0 56074 n80 reform n80 4 80 over n80 reform n80 3 over n80 n80 reverse n80 return n80 end"); a[44] = new Array("./Grid/ncdf_meshread.html", "ncdf_meshread.pro", "", " file_comments read NetCDF meshmask file created by OPA categories Grid examples IDL ncdf_meshread filename param filename in optional default meshmask nc type scalar string Name of the meshmask file to read If this name does not contain any and if iodirectory keyword is not specified then the common variable iodir will be used to define the mesh file path keyword GLAMBOUNDARY default those defined in the file type 2 elements vector Longitude boundaries that should be used to visualize the data lon2 lon1 lon2 lon1 le 360 By default the common cm_4mesh variable key_shift will be automatically defined according to GLAMBOUNDARY keyword CHECKDAT Suppressed Use micromeshmask to create an appropriate meshmask keyword ONEARTH default 1 type scalar: 0 or 1 Force the manual definition of data localization on the earth or not 0 if the data are not on the earth 1 if the data are on earth in that case we can for example use the labels longitude latitude in plots The resulting value will be stored in the common cm_4mesh variable key_onearth ONEARTH 0 forces PERIODIC 0 SHIFT 0 and is cancelling GLAMBOUNDARY keyword GETDIMENSIONS default 0 type scalar: 0 or 1 Activate this keywords if you only want to know the dimension of the domain stored in the mesh file This dimension will be defined in jpiglo jpjglo jpkglo cm_4mesh common variables keyword PERIODIC default computed by using the first line of glamt type scalar: 0 or 1 Force the manual definition of the grid zonal periodicity The resulting value will be stored in the common cm_4mesh variable key_periodic PERIODIC 0 forces SHIFT 0 keyword SHIFT default computed according to glamboundary type scalar Force the manual definition of the zonal shift that must be apply to the data The resulting value will be stored in the common cm_4mesh variable key_shift Note that if key_periodic 0 then in any case key_shift 0 keyword STRCALLING type scalar string the calling command used to call computegrid this is used by xxx keyword STRIDE default 1 1 1 type 3 elements vector Specify the stride in x y and z direction The resulting value will be stored in the common cm_4mesh variable key_stride keyword _EXTRA Used to pass keywords to isafile uses cm_4mesh cm_4data cm_4cal restrictions ixminmesh ixmaxmesh iyminmesh iymaxmesh izminmesh izmaxmesh must be defined before calling ncdf_meshread If some of those values are equal to 1 they will be automatically defined history Sebastien Masson smasson lodyc jussieu fr 12 1999 July 2004 Sebastien Masson: Several modifications micromeshmask clean partial steps clean use of key_stride automatic definition of key_shift Oct 2004 Sebastien Masson: add PERIODIC and SHIFT Aug 2005 Sebastien Masson: some cleaning english version Id: ncdf_meshread pro 371 2008 08 07 09:32:02Z pinsard PRO ncdf_meshread filename GLAMBOUNDARY glamboundary CHECKDAT checkdat ONEARTH onearth GETDIMENSIONS getdimensions PERIODIC periodic SHIFT shift STRIDE stride STRCALLING strcalling _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh cm_4data cm_4cal IF NOT keyword_set key_forgetold THEN BEGIN updatenew updatekwd ENDIF tempsun systime 1 for key_performance IF keyword_set CHECKDAT THEN BEGIN ras report The keyword CHECKDAT has been suppressed it could create bugs Remove it from the call of ncdf_meshread Please use smallmeshmask pro or micromeshmask pro to create a meshmask that has manageable size return ENDIF find meshfile name and open it def of filename by default IF n_params EQ 0 then filename meshmask nc meshname isafile file filename iodirectory iodir _EXTRA ex meshname meshname 0 noticebase xnotice Reading file C meshname C if the meshmask is on tape archive get it back IF version OS_FAMILY EQ unix THEN spawn file meshname dev null cdfid ncdf_open meshname inq ncdf_inquire cdfid dimensions ncdf_diminq cdfid x name jpiglo ncdf_diminq cdfid y name jpjglo listdims strlowcase ncdf_listdims cdfid IF where listdims EQ z 0 NE 1 THEN ncdf_diminq cdfid z name jpkglo ELSE BEGIN dimid where strmid listdims 0 5 EQ depth 0 IF dimid NE 1 THEN ncdf_diminq cdfid dimid name jpkglo ELSE BEGIN dummy report We could not find the vertical dimension its name must be z or start with depth stop ENDELSE ENDELSE if keyword_set getdimensions then begin widget_control noticebase bad_id nothing destroy ncdf_close cdfid return endif check that all i xyz min ax mesh are well defined if n_elements ixminmesh EQ 0 THEN ixminmesh 0 if n_elements ixmaxmesh EQ 0 then ixmaxmesh jpiglo 1 if ixminmesh EQ 1 THEN ixminmesh 0 IF ixmaxmesh EQ 1 then ixmaxmesh jpiglo 1 if n_elements iyminmesh EQ 0 THEN iyminmesh 0 IF n_elements iymaxmesh EQ 0 then iymaxmesh jpjglo 1 if iyminmesh EQ 1 THEN iyminmesh 0 IF iymaxmesh EQ 1 then iymaxmesh jpjglo 1 if n_elements izminmesh EQ 0 THEN izminmesh 0 IF n_elements izmaxmesh EQ 0 then izmaxmesh jpkglo 1 if izminmesh EQ 1 THEN izminmesh 0 IF izmaxmesh EQ 1 then izmaxmesh jpkglo 1 definition of jpi jpj jpj jpi long ixmaxmesh ixminmesh 1 jpj long iymaxmesh iyminmesh 1 jpk long izmaxmesh izminmesh 1 check onearth and its consequences IF n_elements onearth EQ 0 THEN key_onearth 1 ELSE key_onearth keyword_set onearth IF NOT key_onearth THEN BEGIN periodic 0 shift 0 ENDIF automatic definition of key_periodic IF n_elements periodic EQ 0 THEN BEGIN IF jpi GT 1 THEN BEGIN varinq ncdf_varinq cdfid glamt CASE varinq ndims OF 2:ncdf_varget cdfid glamt xaxis offset ixminmesh iyminmesh count jpi 1 3:ncdf_varget cdfid glamt xaxis offset ixminmesh iyminmesh 0 count jpi 1 1 4:ncdf_varget cdfid glamt xaxis offset ixminmesh iyminmesh 0 0 count jpi 1 1 1 ENDCASE xaxis xaxis 720 MOD 360 xaxis xaxis sort xaxis key_periodic xaxis jpi 1 2 xaxis jpi 1 xaxis jpi 2 GE xaxis 0 360 ENDIF ELSE key_periodic 0 ENDIF ELSE key_periodic keyword_set periodic automatic definition of key_shift IF n_elements shift EQ 0 THEN BEGIN key_shift long testvar var key_shift key_shift will be defined according to the first line of glamt if keyword_set glamboundary AND jpi GT 1 AND key_periodic EQ 1 THEN BEGIN varinq ncdf_varinq cdfid glamt CASE varinq ndims OF 2:ncdf_varget cdfid glamt xaxis offset ixminmesh iyminmesh count jpi 1 3:ncdf_varget cdfid glamt xaxis offset ixminmesh iyminmesh 0 count jpi 1 1 4:ncdf_varget cdfid glamt xaxis offset ixminmesh iyminmesh 0 0 count jpi 1 1 1 ENDCASE xaxis between glamboundary 0 and glamboundary 1 xaxis xaxis MOD 360 smaller where xaxis LT glamboundary 0 if smaller 0 NE 1 then xaxis smaller xaxis smaller 360 bigger where xaxis GE glamboundary 1 if bigger 0 NE 1 then xaxis bigger xaxis bigger 360 key_shift where xaxis EQ min xaxis 0 IF key_shift NE 0 THEN BEGIN key_shift jpi key_shift xaxis shift xaxis key_shift ENDIF IF array_equal sort xaxis lindgen jpi NE 1 THEN BEGIN ras report the x axis 1st line of glamt is not sorted in the increasing order after the automatic definition of key_shift please use the keyword shift and periodic to suppress the automatic definition of key_shift and key_periodic and define by hand a more suitable value widget_control noticebase bad_id nothing destroy return ENDIF ENDIF ELSE key_shift 0 ENDIF ELSE key_shift long shift key_periodic EQ 1 check key_stride and related things if n_elements stride eq 3 then key_stride stride if n_elements key_stride LE 2 then key_stride 1 1 1 key_stride 1l long key_stride IF total key_stride NE 3 THEN BEGIN IF key_shift NE 0 THEN BEGIN for explanation see header of read_ncdf_varget pro jpiright key_shift jpileft jpi key_shift key_stride 0 1 key_shift 1 MOD key_stride 0 jpi jpiright 1 key_stride 0 1 jpileft 1 key_stride 0 1 ENDIF ELSE jpi jpi 1 key_stride 0 1 jpj jpj 1 key_stride 1 1 jpk jpk 1 key_stride 2 1 ENDIF default definitions to be able to use read_ncdf_varget default definitions to be able to use read_ncdf_varget ixmindtasauve testvar var ixmindta iymindtasauve testvar var iymindta izmindtasauve testvar var izmindta ixmindta 0l iymindta 0l izmindta 0l jpt 1 time 1 firsttps 0 firstx 0 lastx jpi 1 firsty 0 lasty jpj 1 firstz 0 lastz jpk 1 nx jpi ny jpj nz 1 izminmeshsauve izminmesh izminmesh 0 key_yreverse 0 key_zreverse 0 key_gridtype c 2d arrays: list the 2d variables that must be read namevar glamt glamu glamv glamf gphit gphiu gphiv gphif e1t e1u e1v e1f e2t e2u e2v e2f for the variables related to the partial steps allvarname ncdf_listvars cdfid IF where allvarname EQ hdept 0 NE 1 THEN BEGIN key_partialstep 1 namevar namevar hdept hdepw ENDIF ELSE BEGIN key_partialstep 0 hdept 1 hdepw 1 ENDELSE for compatibility with old versions of meshmask partial steps IF where allvarname EQ e3tp 0 NE 1 THEN namevar namevar e3tp e3wp ELSE BEGIN e3t_ps 1 e3w_ps 1 ENDELSE IF where allvarname EQ e3t_ps 0 NE 1 THEN namevar namevar e3t_ps e3w_ps ELSE BEGIN e3t_ps 1 e3w_ps 1 ENDELSE IF where allvarname EQ e3u_ps 0 NE 1 THEN namevar namevar e3u_ps e3v_ps ELSE BEGIN e3u_ps 1 e3v_ps 1 ENDELSE read all the 2d variables for i 0 n_elements namevar 1 do begin varinq ncdf_varinq cdfid namevar i name varinq name read_ncdf_varget command namevar i float temporary res nothing execute command ENDFOR for compatibility with old versions of meshmask partial steps change e3 tw p to e3 tw _ps IF n_elements e3tp NE 0 THEN e3t_ps temporary e3tp IF n_elements e3wp NE 0 THEN e3w_ps temporary e3wp in the case of key_stride ne 1 1 1 redefine f points coordinates: they must be in the middle of 3 T points if key_stride 0 NE 1 OR key_stride 1 NE 1 then BEGIN we must recompute glamf and gphif IF jpi GT 1 THEN BEGIN if keyword_set key_onearth AND keyword_set xnotsorted OR keyword_set key_periodic AND key_irregular then BEGIN stepxf glamt 720 MOD 360 stepxf shift stepxf 1 1 stepxf stepxf stepxf stepxf 360 stepxf 360 stepxf min abs stepxf dimension 3 IF NOT keyword_set key_periodic THEN stepxf jpi 1 stepxf jpi 2 ENDIF ELSE BEGIN stepxf shift glamt 1 1 glamt IF keyword_set key_periodic THEN stepxf jpi 1 360 stepxf jpi 1 ELSE stepxf jpi 1 stepxf jpi 2 ENDELSE IF jpj GT 1 THEN BEGIN stepxf jpj 1 stepxf jpj 2 stepxf jpi 1 jpj 1 stepxf jpi 2 jpj 2 ENDIF glamf glamt 0 5 stepxf ENDIF ELSE glamf glamt 0 5 IF jpj GT 1 THEN BEGIN we must compute stepyf: y distance between T i j T i 1 j 1 stepyf shift gphit 1 1 gphit stepyf jpj 1 stepyf jpj 2 IF jpi GT 1 THEN BEGIN if NOT keyword_set key_periodic THEN stepyf jpi 1 stepyf jpi 2 stepyf jpi 1 jpj 1 stepyf jpi 2 jpj 2 ENDIF gphif gphit 0 5 stepyf ENDIF ELSE gphif gphit 0 5 ENDIF 3d arrays: nz jpk izminmesh izminmeshsauve listdims ncdf_listdims cdfid micromask where listdims EQ y_m 0 varinq ncdf_varinq cdfid tmask name varinq name IF micromask NE 1 THEN BEGIN keep original values iyminmeshtrue iyminmesh key_stridetrue key_stride yyy1 firsty key_stridetrue 1 iyminmeshtrue yyy2 lasty key_stridetrue 1 iyminmeshtrue the mask is stored as the bit values of the byte array along the y dimension see micromeshmask pro we must modify several parameters iyminmesh 0L firsty yyy1 8 lasty yyy2 8 ny lasty firsty 1 key_stride key_stride 0 1 key_stride 2 read_ncdf_varget tmask bytarr jpi jpj jpk now we must get back the mask loop on the level to save memory the loop is short and thus should be fast enough FOR k 0 jpk 1 DO BEGIN zzz transpose res k zzz reform binary zzz 8 ny nx over zzz transpose temporary zzz zzz zzz yyy1 MOD 8: 8 ny 8 yyy2 MOD 8 IF key_stridetrue 1 NE 1 THEN BEGIN IF float strmid version release 0 3 LT 5 6 THEN BEGIN nnny size zzz 2 yind key_stridetrue 1 lindgen nnny 1 key_stridetrue 1 1 tmask k temporary zzz yind ENDIF ELSE tmask k temporary zzz 0: :key_stridetrue 1 ENDIF ELSE tmask k temporary zzz ENDFOR ENDIF ELSE BEGIN read_ncdf_varget tmask byte res ENDELSE boundary conditions used to compute umask IF ncdf_varid cdfid umask NE 1 THEN BEGIN varinq ncdf_varinq cdfid umask name varinq name nx 1L firstx jpi 1 lastx jpi 1 IF micromask NE 1 THEN BEGIN read_ncdf_varget umaskred reform binary res 8 ny jpk over umaskred umaskred yyy1 MOD 8: 8 ny 8 yyy2 MOD 8 IF key_stridetrue 1 NE 1 THEN umaskred temporary umaskred yind ENDIF ELSE BEGIN read_ncdf_varget umaskred reform byte res over ENDELSE ENDIF ELSE umaskred bytarr jpj jpk boundary conditions used to compute fmask 1 IF ncdf_varid cdfid fmask NE 1 THEN BEGIN varinq ncdf_varinq cdfid fmask name varinq name IF micromask NE 1 THEN BEGIN read_ncdf_varget fmaskredy reform binary res 8 ny jpk over fmaskredy fmaskredy yyy1 MOD 8: 8 ny 8 yyy2 MOD 8 IF key_stridetrue 1 NE 1 THEN fmaskredy temporary fmaskredy yind ENDIF ELSE BEGIN read_ncdf_varget fmaskredy reform byte res over fmaskredy temporary fmaskredy MOD 2 ENDELSE ENDIF ELSE fmaskredy bytarr jpj jpk boundary conditions used to compute vmask IF ncdf_varid cdfid vmask NE 1 THEN BEGIN varinq ncdf_varinq cdfid vmask name varinq name nx jpi firstx 0L lastx jpi 1L ny 1L firsty jpj 1 lasty jpj 1 IF micromask NE 1 THEN BEGIN yyy1 firsty key_stridetrue 1 iyminmeshtrue yyy2 lasty key_stridetrue 1 iyminmeshtrue iyminmesh 0L firsty yyy1 8 lasty yyy2 8 ny lasty firsty 1 read_ncdf_varget IF jpk EQ 1 THEN res reform res jpi 1 jpk over vmaskred transpose temporary res 1 0 2 vmaskred reform binary vmaskred 8 ny nx nz over vmaskred transpose temporary vmaskred 1 0 2 vmaskred reform vmaskred yyy1 MOD 8: 8 ny 8 yyy2 MOD 8 ENDIF ELSE BEGIN read_ncdf_varget vmaskred reform byte res over ENDELSE ENDIF ELSE vmaskred bytarr jpi jpk boundary conditions used to compute fmask 2 IF ncdf_varid cdfid fmask NE 1 THEN BEGIN varinq ncdf_varinq cdfid fmask name varinq name IF micromask NE 1 THEN BEGIN read_ncdf_varget IF jpk EQ 1 THEN res reform res jpi 1 jpk over fmaskredx transpose temporary res 1 0 2 fmaskredx reform binary fmaskredx 8 ny nx nz over fmaskredx transpose temporary fmaskredx 1 0 2 fmaskredx reform fmaskredx yyy1 MOD 8: 8 ny 8 yyy2 MOD 8 iyminmesh iyminmeshtrue key_stride key_stridetrue ENDIF ELSE BEGIN read_ncdf_varget fmaskredx reform byte res over fmaskredx fmaskredx MOD 2 ENDELSE ENDIF ELSE fmaskredx bytarr jpi jpk 1d arrays IF where allvarname EQ e3t_0 0 NE 1 THEN fnamevar e3t_0 e3w_0 gdept_0 gdepw_0 ELSE fnamevar e3t e3w gdept gdepw namevar e3t e3w gdept gdepw for i 0 n_elements namevar 1 do begin varinq ncdf_varinq cdfid fnamevar i CASE n_elements varinq dim OF 4:BEGIN command ncdf_varget cdfid fnamevar i namevar i offset 0 0 izminmesh 0 count 1 1 jpk 1 if key_stride 2 NE 1 then command command stride 1 1 key_stride 2 1 END 2:BEGIN command ncdf_varget cdfid fnamevar i namevar i offset izminmesh 0 count jpk 1 if key_stride 2 NE 1 then command command stride key_stride 2 END 1:BEGIN command ncdf_varget cdfid fnamevar i namevar i offset izminmesh count jpk if key_stride 2 NE 1 then command command stride key_stride 2 END ENDCASE nothing execute command command namevar i float namevar i nothing execute command command if size namevar i n_dimension gt 0 then namevar i reform namevar i over nothing execute command ENDFOR ncdf_close cdfid Apply Glamboundary if keyword_set glamboundary AND key_onearth then BEGIN if glamboundary 0 NE glamboundary 1 then BEGIN glamt temporary glamt MOD 360 smaller where glamt LT glamboundary 0 if smaller 0 NE 1 then glamt smaller glamt smaller 360 bigger where glamt GE glamboundary 1 if bigger 0 NE 1 then glamt bigger glamt bigger 360 glamu temporary glamu MOD 360 smaller where glamu LT glamboundary 0 if smaller 0 NE 1 then glamu smaller glamu smaller 360 bigger where glamu GE glamboundary 1 if bigger 0 NE 1 then glamu bigger glamu bigger 360 glamv temporary glamv MOD 360 smaller where glamv LT glamboundary 0 if smaller 0 NE 1 then glamv smaller glamv smaller 360 bigger where glamv GE glamboundary 1 if bigger 0 NE 1 then glamv bigger glamv bigger 360 glamf temporary glamf MOD 360 smaller where glamf LT glamboundary 0 if smaller 0 NE 1 then glamf smaller glamf smaller 360 bigger where glamf GE glamboundary 1 if bigger 0 NE 1 then glamf bigger glamf bigger 360 toosmall where glamu EQ glamboundary 0 IF toosmall 0 NE 1 THEN glamu toosmall glamu toosmall 360 toosmall where glamf EQ glamboundary 0 IF toosmall 0 NE 1 THEN glamf toosmall glamf toosmall 360 endif endif make sure we do have 2d arrays when jpj eq 1 IF jpj EQ 1 THEN BEGIN glamt reform glamt jpi jpj over gphit reform gphit jpi jpj over e1t reform e1t jpi jpj over e2t reform e2t jpi jpj over glamu reform glamu jpi jpj over gphiu reform gphiu jpi jpj over e1u reform e1u jpi jpj over e2u reform e2u jpi jpj over glamv reform glamv jpi jpj over gphiv reform gphiv jpi jpj over e1v reform e1v jpi jpj over e2v reform e2v jpi jpj over glamf reform glamf jpi jpj over gphif reform gphif jpi jpj over e1f reform e1f jpi jpj over e2f reform e2f jpi jpj over IF keyword_set key_partialstep THEN BEGIN hdept reform hdept jpi jpj over hdepw reform hdepw jpi jpj over e3t_ps reform e3t_ps jpi jpj over e3w_ps reform e3w_ps jpi jpj over ENDIF ENDIF ixmindta ixmindtasauve iymindta iymindtasauve izmindta izmindtasauve widget_control noticebase bad_id nothing destroy grid parameters used by xxx IF NOT keyword_set strcalling THEN BEGIN IF n_elements ccmeshparameters EQ 0 THEN strcalling ncdf_meshread ELSE strcalling ccmeshparameters filename ENDIF IF n_elements glamt GE 2 THEN BEGIN glaminfo moment glamt IF finite glaminfo 2 EQ 0 THEN glaminfo glaminfo 0:1 gphiinfo moment gphit IF finite gphiinfo 2 EQ 0 THEN gphiinfo gphiinfo 0:1 ENDIF ELSE BEGIN glaminfo glamt gphiinfo gphit ENDELSE romszinfos h: 1 zeta: 1 theta_s: 1 theta_b: 1 hc: 1 ccmeshparameters filename:strcalling glaminfo:float string glaminfo format E11 4 gphiinfo:float string gphiinfo format E11 4 jpiglo:jpiglo jpjglo:jpjglo jpkglo:jpkglo jpi:jpi jpj:jpj jpk:jpk ixminmesh:ixminmesh ixmaxmesh:ixmaxmesh iyminmesh:iyminmesh iymaxmesh:iymaxmesh izminmesh:izminmesh izmaxmesh:izmaxmesh key_shift:key_shift key_periodic:key_periodic key_stride:key_stride key_gridtype:key_gridtype key_yreverse:key_yreverse key_zreverse:key_zreverse key_partialstep:key_partialstep key_onearth:key_onearth if keyword_set key_performance THEN print time ncdf_meshread systime 1 tempsun updateold return end"); a[45] = new Array("./Grid/ncdf_meshroms.html", "ncdf_meshroms.pro", "", " file_comments read NetCDF grid file created by ROMS categories Grid examples IDL ncdf_meshroms filename param filename in optional default roms_grd nc type scalar string Name of the meshmask file to read If this name does not contain any and if iodirectory keyword is not specify then the common variable iodir will be used to define the mesh file path keyword GLAMBOUNDARY default those defined in the file type 2 elements vector Longitude boundaries that should be used to visualize the data lon2 lon1 lon2 lon1 le 360 By default the common cm_4mesh variable key_shift will be automatically defined according to GLAMBOUNDARY keyword ONEARTH default 1 type scalar: 0 or 1 Force the manual definition of data localization on the earth or not 0 if the data are not on the earth 1 if the data are on earth in that case we can for example use the labels longitude latitude in plots The resulting value will be stored in the common cm_4mesh variable key_onearth ONEARTH 0 forces PERIODIC 0 SHIFT 0 and is cancelling GLAMBOUNDARY keyword GETDIMENSIONS default 0 type scalar: 0 or 1 Activate this keywords if you only want to know the dimension of the domain stored in the mesh file This dimension will be defined in jpiglo jpjglo jpkglo cm_4mesh common variables keyword PERIODIC default computed by using the first line of glamt type scalar: 0 or 1 Force the manual definition of the grid zonal periodicity The resulting value will be stored in the common cm_4mesh variable key_periodic PERIODIC 0 forces SHIFT 0 keyword NRHO default 1 type scalar Specify the number of rho level that contain the data we want to explore This is mainly useful when using xxx to get access to the deeper levers and vertical sections keyword SHIFT default computed according to glamboundary type scalar Force the manual definition of the zonal shift that must be apply to the data The resulting value will be stored in the common cm_4mesh variable key_shift Note that if key_periodic 0 then in any case key_shift 0 keyword STRCALLING type scalar string the calling command used to call computegrid this is used by xxx keyword STRIDE default 1 1 1 type 3 elements vector Specify the stride in x y and z direction The resulting value will be stored in the common cm_4mesh variable key_stride keyword _EXTRA Used to pass keywords to isafile uses cm_4mesh cm_4data cm_4cal restrictions ixminmesh ixmaxmesh iyminmesh iymaxmesh izminmesh izmaxmesh must be defined before calling ncdf_meshread If some of those values are equal to 1 they will be automatically defined In the original ROMS grid if F grid has jpi jpj points then T grid will have jpi 1 jpj 1 points U grid will have jpi jpj 1 points and V grid will have jpi 1 jpj points By default C grid used in this package needs the same number of points for T U V and F grid with a T point at the bottom left corner of the grid We therefore ignore the last column of T and V points and the last line of T and U points Scale factors are computed using the distance between the points which is not the exact definition for irregular grid history Sebastien Masson smasson lodyc jussieu fr September 2006 version Id: ncdf_meshroms pro 371 2008 08 07 09:32:02Z pinsard PRO ncdf_meshroms filename NRHO nrho GLAMBOUNDARY glamboundary ONEARTH onearth GETDIMENSIONS getdimensions PERIODIC periodic SHIFT shift STRIDE stride STRCALLING strcalling _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh cm_4data cm_4cal IF NOT keyword_set key_forgetold THEN BEGIN updatenew updatekwd ENDIF tempsun systime 1 for key_performance find meshfile name and open it def of filename by default IF n_params EQ 0 then filename roms_grd nc meshname isafile file filename iodirectory iodir _EXTRA ex meshname meshname 0 noticebase xnotice Reading file C meshname C if the meshmask is on tape archive get it back IF version OS_FAMILY EQ unix THEN spawn file meshname dev null cdfid ncdf_open meshname inq ncdf_inquire cdfid dimensions ncdf_diminq cdfid xi_rho name jpiglo ncdf_diminq cdfid eta_rho name jpjglo IF n_elements nrho NE 0 THEN jpkglo long nrho 0 ELSE jpkglo 1L if keyword_set getdimensions then begin widget_control noticebase bad_id nothing destroy ncdf_close cdfid return endif check that all i xyz min ax mesh are well defined if n_elements ixminmesh EQ 0 THEN ixminmesh 0 if n_elements ixmaxmesh EQ 0 then ixmaxmesh jpiglo 1 if ixminmesh EQ 1 THEN ixminmesh 0 IF ixmaxmesh EQ 1 then ixmaxmesh jpiglo 1 if n_elements iyminmesh EQ 0 THEN iyminmesh 0 IF n_elements iymaxmesh EQ 0 then iymaxmesh jpjglo 1 if iyminmesh EQ 1 THEN iyminmesh 0 IF iymaxmesh EQ 1 then iymaxmesh jpjglo 1 if n_elements izminmesh EQ 0 THEN izminmesh 0 IF n_elements izmaxmesh EQ 0 then izmaxmesh jpkglo 1 if izminmesh EQ 1 THEN izminmesh 0 IF izmaxmesh EQ 1 then izmaxmesh jpkglo 1 definition of jpi jpj jpj jpi long ixmaxmesh ixminmesh 1 jpj long iymaxmesh iyminmesh 1 jpk long izmaxmesh izminmesh 1 check onearth and its consequences IF n_elements onearth EQ 0 THEN key_onearth 1 ELSE key_onearth keyword_set onearth IF NOT key_onearth THEN BEGIN periodic 0 shift 0 ENDIF automatic definition of key_periodic IF n_elements periodic EQ 0 THEN BEGIN IF jpi GT 1 THEN BEGIN ncdf_varget cdfid lon_rho xaxis offset ixminmesh iyminmesh count jpi 1 xaxis xaxis 720 MOD 360 xaxis xaxis sort xaxis key_periodic xaxis jpi 1 2 xaxis jpi 1 xaxis jpi 2 GE xaxis 0 360 ENDIF ELSE key_periodic 0 ENDIF ELSE key_periodic keyword_set periodic automatic definition of key_shift IF n_elements shift EQ 0 THEN BEGIN key_shift long testvar var key_shift key_shift will be defined according to the first line of glamt if keyword_set glamboundary AND jpi GT 1 AND key_periodic EQ 1 THEN BEGIN ncdf_varget cdfid lon_rho xaxis offset ixminmesh iyminmesh count jpi 1 xaxis between glamboundary 0 and glamboundary 1 xaxis xaxis MOD 360 smaller where xaxis LT glamboundary 0 if smaller 0 NE 1 then xaxis smaller xaxis smaller 360 bigger where xaxis GE glamboundary 1 if bigger 0 NE 1 then xaxis bigger xaxis bigger 360 key_shift where xaxis EQ min xaxis 0 IF key_shift NE 0 THEN BEGIN key_shift jpi key_shift xaxis shift xaxis key_shift ENDIF IF array_equal sort xaxis lindgen jpi NE 1 THEN BEGIN ras report the x axis 1st line of glamt is not sorted in the increasing order after the automatic definition of key_shift please use the keyword shift and periodic to suppress the automatic definition of key_shift and key_periodic and define by hand a more suitable value widget_control noticebase bad_id nothing destroy return ENDIF ENDIF ELSE key_shift 0 ENDIF ELSE key_shift long shift key_periodic EQ 1 check key_stride and related things if n_elements stride eq 3 then key_stride stride if n_elements key_stride LE 2 then key_stride 1 1 1 key_stride 1l long key_stride IF total key_stride NE 3 THEN BEGIN IF key_shift NE 0 THEN BEGIN for explanation see header of read_ncdf_varget pro jpiright key_shift jpileft jpi key_shift key_stride 0 1 key_shift 1 MOD key_stride 0 jpi jpiright 1 key_stride 0 1 jpileft 1 key_stride 0 1 ENDIF ELSE jpi jpi 1 key_stride 0 1 jpj jpj 1 key_stride 1 1 jpk jpk 1 key_stride 2 1 ENDIF for the variables related to the partial steps key_partialstep 0 hdept 1 hdepw 1 default definitions to be able to use read_ncdf_varget default definitions to be able to use read_ncdf_varget ixmindtasauve testvar var ixmindta iymindtasauve testvar var iymindta izmindtasauve testvar var izmindta ixmindta 0l iymindta 0l izmindta 0l jpt 1 time 1 firsttps 0 firstx 0 lastx jpi 1 firsty 0 lasty jpj 1 firstz 0 lastz jpk 1 nx jpi ny jpj nz 1 izminmeshsauve izminmesh izminmesh 0 key_yreverse 0 key_zreverse 1 key_gridtype c 2d arrays: list the 2d variables that must be read namebase lon_ lat_ mask_ x_ y_ namebase2 glam gphi mask d1 d2 read all grid T variables for i 0 n_elements namebase 1 do begin varinq ncdf_varinq cdfid namebase i rho name varinq name read_ncdf_varget command namebase2 i t float temporary res nothing execute command ENDFOR d1t 1 e3 shift d1t 1 0 d1t d2t 1 e3 shift d2t 0 1 d2t for i 0 n_elements namebase2 1 do begin command namebase2 i t namebase2 i t 0:jpi 2 0:jpj 2 nothing execute command ENDFOR tmask byte temporary maskt IF jpk GT 1 THEN tmask reform tmask replicate 1b jpk jpi 1 jpj 1 jpk overwrite e1u temporary d1t e2v temporary d2t h: Final bathymetry at RHO points varinq ncdf_varinq cdfid h name varinq name read_ncdf_varget hroms float temporary res hroms hroms 0:jpi 2 0:jpj 2 read all grid U variables jpiglo jpiglo 1 jpi jpi 1 ixmaxmesh ixmaxmesh 1 firstx 0 lastx jpi 1 nx jpi for i 0 n_elements namebase 1 do begin varinq ncdf_varinq cdfid namebase i u name varinq name read_ncdf_varget command namebase2 i u float temporary res nothing execute command ENDFOR tmpsave 2 1 e3 d1u 0 0:jpj 2 d1u 1 e3 shift d1u 1 0 d1u d2u 1 e3 shift d2u 0 1 d2u for i 0 n_elements namebase2 1 do begin command namebase2 i u namebase2 i u 0:jpj 2 nothing execute command ENDFOR umaskred byte temporary masku jpi 1 IF jpk GT 1 THEN umaskred reform umaskred replicate 1b jpk 1 jpj 1 jpk overwrite e1t temporary d1u e1t shift temporary e1t 1 0 e1t 0 temporary tmpsave e2f temporary d2u read all grid V variables jpiglo jpiglo 1 jpi jpi 1 ixmaxmesh ixmaxmesh 1 firstx 0 lastx jpi 1 nx jpi jpjglo jpjglo 1 jpj jpj 1 iymaxmesh iymaxmesh 1 firsty 0 lasty jpj 1 ny jpj for i 0 n_elements namebase 1 do begin varinq ncdf_varinq cdfid namebase i v name varinq name read_ncdf_varget command namebase2 i v float temporary res nothing execute command ENDFOR d1v 1 e3 shift d1v 1 0 d1v tmpsave 2 1 e3 d2v 0:jpi 2 0 d2v 1 e3 shift d2v 0 1 d2v for i 0 n_elements namebase2 1 do begin command namebase2 i v namebase2 i v 0:jpi 2 nothing execute command ENDFOR vmaskred byte temporary maskv jpj 1 IF jpk GT 1 THEN vmaskred reform vmaskred replicate 1b jpk jpi 1 1 jpk overwrite e1f temporary d1v e2t temporary d2v e2t shift temporary e2t 0 1 e2t 0 temporary tmpsave read all grid F variables jpiglo jpiglo 1 jpi jpi 1 ixmaxmesh ixmaxmesh 1 firstx 0 lastx jpi 1 nx jpi for i 0 n_elements namebase 1 do begin varinq ncdf_varinq cdfid namebase i psi name varinq name read_ncdf_varget command namebase2 i f float temporary res nothing execute command ENDFOR tmpsave1 2 1 e3 d1f 0 d1f 1 e3 shift d1f 1 0 d1f tmpsave2 2 1 e3 d2f 0 d2f 1 e3 shift d2f 0 1 d2f fmaskredy byte maskf jpi 1 IF jpk GT 1 THEN fmaskredy reform fmaskredy replicate 1b jpk 1 jpj jpk overwrite fmaskredx byte temporary maskf jpj 1 IF jpk GT 1 THEN fmaskredx reform fmaskredx replicate 1b jpk jpi 1 jpk overwrite e1v temporary d1f e1v shift temporary e1v 1 0 e1v 0 temporary tmpsave1 e2u temporary d2f e2u shift temporary e2u 0 1 e2u 0 temporary tmpsave2 in the case of key_stride ne 1 1 1 redefine f points coordinates: they must be in the middle of 3 T points if key_stride 0 NE 1 OR key_stride 1 NE 1 then BEGIN we must recompute glamf and gphif IF jpi GT 1 THEN BEGIN if keyword_set key_onearth AND keyword_set xnotsorted OR keyword_set key_periodic AND key_irregular then BEGIN stepxf glamt 720 MOD 360 stepxf shift stepxf 1 1 stepxf stepxf stepxf stepxf 360 stepxf 360 stepxf min abs stepxf dimension 3 IF NOT keyword_set key_periodic THEN stepxf jpi 1 stepxf jpi 2 ENDIF ELSE BEGIN stepxf shift glamt 1 1 glamt IF keyword_set key_periodic THEN stepxf jpi 1 360 stepxf jpi 1 ELSE stepxf jpi 1 stepxf jpi 2 ENDELSE IF jpj GT 1 THEN BEGIN stepxf jpj 1 stepxf jpj 2 stepxf jpi 1 jpj 1 stepxf jpi 2 jpj 2 ENDIF glamf glamt 0 5 stepxf ENDIF ELSE glamf glamt 0 5 IF jpj GT 1 THEN BEGIN we must compute stepyf: y distance between T i j T i 1 j 1 stepyf shift gphit 1 1 gphit stepyf jpj 1 stepyf jpj 2 IF jpi GT 1 THEN BEGIN if NOT keyword_set key_periodic THEN stepyf jpi 1 stepyf jpi 2 stepyf jpi 1 jpj 1 stepyf jpi 2 jpj 2 ENDIF gphif gphit 0 5 stepyf ENDIF ELSE gphif gphit 0 5 ENDIF 1d arrays gdept findgen jpk gdepw findgen jpk e3t replicate 1 jpk e3w replicate 1 jpk ncdf_close cdfid Apply Glamboudary if keyword_set glamboundary AND key_onearth then BEGIN if glamboundary 0 NE glamboundary 1 then BEGIN glamt temporary glamt MOD 360 smaller where glamt LT glamboundary 0 if smaller 0 NE 1 then glamt smaller glamt smaller 360 bigger where glamt GE glamboundary 1 if bigger 0 NE 1 then glamt bigger glamt bigger 360 glamu temporary glamu MOD 360 smaller where glamu LT glamboundary 0 if smaller 0 NE 1 then glamu smaller glamu smaller 360 bigger where glamu GE glamboundary 1 if bigger 0 NE 1 then glamu bigger glamu bigger 360 glamv temporary glamv MOD 360 smaller where glamv LT glamboundary 0 if smaller 0 NE 1 then glamv smaller glamv smaller 360 bigger where glamv GE glamboundary 1 if bigger 0 NE 1 then glamv bigger glamv bigger 360 glamf temporary glamf MOD 360 smaller where glamf LT glamboundary 0 if smaller 0 NE 1 then glamf smaller glamf smaller 360 bigger where glamf GE glamboundary 1 if bigger 0 NE 1 then glamf bigger glamf bigger 360 toosmall where glamu EQ glamboundary 0 IF toosmall 0 NE 1 THEN glamu toosmall glamu toosmall 360 toosmall where glamf EQ glamboundary 0 IF toosmall 0 NE 1 THEN glamf toosmall glamf toosmall 360 endif endif make sure we do have 2d arrays when jpj eq 1 IF jpj EQ 1 THEN BEGIN glamt reform glamt jpi jpj over gphit reform gphit jpi jpj over e1t reform e1t jpi jpj over e2t reform e2t jpi jpj over glamu reform glamu jpi jpj over gphiu reform gphiu jpi jpj over e1u reform e1u jpi jpj over e2u reform e2u jpi jpj over glamv reform glamv jpi jpj over gphiv reform gphiv jpi jpj over e1v reform e1v jpi jpj over e2v reform e2v jpi jpj over glamf reform glamf jpi jpj over gphif reform gphif jpi jpj over e1f reform e1f jpi jpj over e2f reform e2f jpi jpj over ENDIF ixmindta ixmindtasauve iymindta iymindtasauve izmindta izmindtasauve widget_control noticebase bad_id nothing destroy grid parameters used by xxx IF NOT keyword_set strcalling THEN BEGIN IF n_elements ccmeshparameters EQ 0 THEN strcalling ncdf_meshroms ELSE strcalling ccmeshparameters filename ENDIF IF n_elements glamt GE 2 THEN BEGIN glaminfo moment glamt IF finite glaminfo 2 EQ 0 THEN glaminfo glaminfo 0:1 gphiinfo moment gphit IF finite gphiinfo 2 EQ 0 THEN gphiinfo gphiinfo 0:1 ENDIF ELSE BEGIN glaminfo glamt gphiinfo gphit ENDELSE romszinfos h:hroms zeta:replicate 0 jpi jpj theta_s: 1 theta_b: 1 hc: 1 ccmeshparameters filename:strcalling glaminfo:float string glaminfo format E11 4 gphiinfo:float string gphiinfo format E11 4 jpiglo:jpiglo jpjglo:jpjglo jpkglo:jpkglo jpi:jpi jpj:jpj jpk:jpk ixminmesh:ixminmesh ixmaxmesh:ixmaxmesh iyminmesh:iyminmesh iymaxmesh:iymaxmesh izminmesh:izminmesh izmaxmesh:izmaxmesh key_shift:key_shift key_periodic:key_periodic key_stride:key_stride key_gridtype:key_gridtype key_yreverse:key_yreverse key_zreverse:key_zreverse key_partialstep:key_partialstep key_onearth:key_onearth if keyword_set key_performance THEN print time ncdf_meshread systime 1 tempsun updateold return end"); a[46] = new Array("./Grid/numbisland.html", "numbisland.pro", "", " hidden file_comments recursive function for one given point on an island check if its neighbors are on the same island param msk in required type 2D array of 0 and 1 land sea mask with 0 on the land and 1 on the ocean param nx in required type scalar x size of the mask param ny in required type scalar y size of the mask param indin in required type 1D array index listing the point of the mask which are on the island param numb in required type scalar number of the island PRO mskneig msk nx ny indin numb compile_opt idl2 strictarrsubs flag the point msk indin numb find its neighbors indx indin MOD nx 1L 0L 1L indx temporary indx nx MOD nx x periodicity indy indin nx 1L 0L 1L indy 0 temporary indy a numbisland tmask 0 history Jan 2006: sebastien masson smasson locean ipsl upmc fr version Id: numbisland pro 325 2007 12 06 10:04:53Z pinsard FUNCTION numbisland mskin compile_opt idl2 strictarrsubs time1 systime 1 performance measurement szmsk size reform mskin IF szmsk 0 NE 2 THEN stop nx szmsk 1 ny szmsk 2 msk fix mskin islnumb 10 default value land where msk EQ 0 count 0 WHILE count NE 0 DO BEGIN IF islnumb 9 MOD 10 EQ 0 THEN BEGIN ras report island number : strtrim islnumb 9 1 ENDIF mskneig msk nx ny land islnumb land where msk EQ 0 count 0 islnumb islnumb 1 ENDWHILE msk msk 9 msk where msk EQ 8 0 print time: systime 1 time1 RETURN msk END"); a[47] = new Array("./Grid/restoreboxparam.html", "restoreboxparam.pro", "", " file_comments restore all the zoom parameters defined by calling domdef previously defined by saveboxparam param filename in required type scalar string the file name uses cm_4mesh and cm_demomode if we are in demo mode restrictions call def_myuniquetmpdir if myuniquetmpdir is undefined: define create and add it to path examples IDL restoreboxparam filename history Sebastien Masson smasson lodyc jussieu fr July 2005 version Id: restoreboxparam pro 388 2008 12 09 09:36:41Z smasson PRO restoreboxparam filename compile_opt idl2 strictarrsubs cm_4mesh IF lmgr demo EQ 1 THEN BEGIN if we are in demo mode we cannot save the parameters in a temporary file cm_demomode_used lon1 boxzoomparam bound 0 lon2 boxzoomparam bound 1 lat1 boxzoomparam bound 2 lat2 boxzoomparam bound 3 vert1 boxzoomparam bound 4 vert2 boxzoomparam bound 5 firstxt boxzoomparam indexes 0 lastxt boxzoomparam indexes 1 firstyt boxzoomparam indexes 2 lastyt boxzoomparam indexes 3 firstxu boxzoomparam indexes 4 lastxu boxzoomparam indexes 5 firstyu boxzoomparam indexes 6 lastyu boxzoomparam indexes 7 firstxv boxzoomparam indexes 8 lastxv boxzoomparam indexes 9 firstyv boxzoomparam indexes 10 lastyv boxzoomparam indexes 11 firstxf boxzoomparam indexes 12 lastxf boxzoomparam indexes 13 firstyf boxzoomparam indexes 14 lastyf boxzoomparam indexes 15 firstzt boxzoomparam indexes 16 lastzt boxzoomparam indexes 17 firstzw boxzoomparam indexes 18 lastzw boxzoomparam indexes 19 nxt boxzoomparam indexes 20 nyt boxzoomparam indexes 21 nxu boxzoomparam indexes 22 nyu boxzoomparam indexes 23 nxv boxzoomparam indexes 24 nyv boxzoomparam indexes 25 nxf boxzoomparam indexes 26 nyf boxzoomparam indexes 27 nzt boxzoomparam indexes 28 nzw boxzoomparam indexes 29 key_shift boxzoomparam key 0 key_periodic boxzoomparam key 1 key_stride boxzoomparam key 2 key_gridtype boxzoomparam key 3 key_yreverse boxzoomparam key 4 key_zreverse boxzoomparam key 5 key_partialstep boxzoomparam key 6 key_onearth boxzoomparam key 7 boxzoomparam 1 ENDIF ELSE BEGIN restore myuniquetmpdir filename file_delete myuniquetmpdir filename ENDELSE updateold return end"); a[48] = new Array("./Grid/romsdepth.html", "romsdepth.pro", "", " file_comments compute depth of ROMS outputs according to ROMS parameters stored in the common variable cm_4mesh romszinfos categories Grid returns the depth of the points or 1 if error uses cm_4mesh cm_4data restrictions common variable cm_4mesh romszinfos must be correctly defined history Sept 2006 Sebastien Masson smasson lodyc jussieu fr version Id: romsdepth pro 370 2008 08 07 07:59:15Z pinsard FUNCTION romsdepth compile_opt idl2 strictarrsubs cm_4mesh cm_4data theta_s romszinfos theta_s IF theta_s EQ 1 THEN return 1 theta_b romszinfos theta_b IF theta_b EQ 1 THEN return 1 hc romszinfos hc IF hc EQ 1 THEN return 1 hroms romszinfos h IF hroms 0 EQ 1 THEN return 1 zeta romszinfos zeta IF zeta 0 EQ 1 THEN return 1 type vargrid grille 1 1 1 1 nx ny nz firstx firsty firstz lastx lasty lastz hroms hroms firstx:lastx firsty:lasty nt n_elements zeta nx ny cff1 1 sinh theta_s cff2 0 5 tanh 0 5 theta_s IF type EQ W THEN BEGIN sc findgen jpk jpk jpk sc dindgen jpk 1 jpk jpk jpk jpk 1 ENDIF ELSE BEGIN sc findgen jpk jpk 0 5 1 jpk ENDELSE cs 1 theta_b cff1 sinh theta_s sc theta_b cff2 tanh theta_s sc 0 5 0 5 cff hc sc cs cff1 cs hinv 1 hroms hinv hinv replicate 1 jpk put a z dimension to zeta zeta transpose temporary zeta zeta reform temporary zeta replicate 1 jpk nt ny nx jpk overwrite zeta transpose temporary zeta 2 1 3 0 z0 replicate 1 nx ny cff replicate 1 nx ny cff1 hroms replicate 1 jpk z z0 replicate 1 nt temporary zeta 1 z0 hinv replicate 1 nt z reform z nx ny jpk nt overwrite z 1 reverse temporary z 3 return z end"); a[49] = new Array("./Grid/saveboxparam.html", "saveboxparam.pro", "", " file_comments save all the zoom parameters defined by calling domdef in a file using save command located in myuniquetmpdir common variable defined by def_myuniquetmpdir param filename in required type scalar string the file name uses cm_4mesh and cm_demomode if we are in demo mode restrictions call def_myuniquetmpdir if myuniquetmpdir is undefined: define create and add it to path examples IDL saveboxparam filename history Sebastien Masson smasson lodyc jussieu fr June 2005 version Id: saveboxparam pro 388 2008 12 09 09:36:41Z smasson PRO saveboxparam filename compile_opt idl2 strictarrsubs cm_4mesh def_myuniquetmpdir IF lmgr demo EQ 1 THEN BEGIN if we are in demo mode we cannot save the parameters in a temporary file cm_demomode_used boxzoomparam bound: lon1 lon2 lat1 lat2 vert1 vert2 indexes: firstxt lastxt firstyt lastyt firstxu lastxu firstyu lastyu firstxv lastxv firstyv lastyv firstxf lastxf firstyf lastyf firstzt lastzt firstzw lastzw nxt nyt nxu nyu nxv nyv nxf nyf nzt nzw key: key_shift key_periodic key_stride key_gridtype key_yreverse key_zreverse key_partialstep key_onearth ENDIF ELSE BEGIN save lon1 lon2 lat1 lat2 vert1 vert2 firstxt lastxt firstyt lastyt firstxu lastxu firstyu lastyu firstxv lastxv firstyv lastyv firstxf lastxf firstyf lastyf firstzt lastzt firstzw lastzw nxt nyt nxu nyu nxv nyv nxf nyf nzt nzw key_shift key_periodic key_stride key_gridtype key_yreverse key_zreverse key_partialstep key_onearth filename myuniquetmpdir filename ENDELSE return end"); a[50] = new Array("./Grid/smallmeshmask.html", "smallmeshmask.pro", "", " categories For OPA param inid in required param outid in required param inname in required param outname in optional history July 2004 Sebastien Masson smasson lodyc jussieu fr version Id: smallmeshmask pro 371 2008 08 07 09:32:02Z pinsard PRO ncdf_transfer inid outid inname outname compile_opt idl2 strictarrsubs IF n_elements outname EQ 0 THEN outname inname ncdf_varget inid inname zzz ncdf_varput outid outname float reform zzz over RETURN END file_comments Reduce the size of the NetCDF meshmask created by OPA by using byte format for the masks and the float format for the other fields keyword IODIR to define the files path param ncfilein in required 1 the name of the meshmask file to be reduced In that case there is only one meshmask file OR 2 the xxx part in the names: xxx mesh_hgr nc xxx mesh_zgr nc xxx mask nc In that case the meshmask is split into 3 files param ncfileout in optional default smallmeshmask nc the name of the reduced meshmask file examples IDL meshdir d1fes2 raid2 smasson DATA ORCA05 IDL smallmeshmask meshmask_ORCA_R05 nc iodir meshdir categories For OPA history July 2004 Sebastien Masson smasson lodyc jussieu fr version Id: smallmeshmask pro 371 2008 08 07 09:32:02Z pinsard PRO smallmeshmask ncfilein ncfileout IODIR iodir compile_opt idl2 strictarrsubs filein isafile FILE ncfilein IODIR iodir NEW test findfile filein 0 IF test EQ THEN BEGIN filein_hgr findfile filein mesh_hgr nc 0 filein_zgr findfile filein mesh_zgr nc 0 filein_msk findfile filein mask nc 0 IF filein_hgr EQ OR filein_zgr EQ OR filein_msk EQ THEN BEGIN ras report meshmask file s not found filein does not exist filein mesh_hgr nc does not exist filein mesh_zgr nc does not exist filein mask nc does not exist return ENDIF ENDIF ELSE filein test get the horizontal dimensions IF n_elements filein_hgr NE 0 THEN cdfid ncdf_open filein_hgr ELSE cdfid ncdf_open filein ncdf_diminq cdfid x name jpi ncdf_diminq cdfid y name jpj get the vertical dimensions IF n_elements filein_zgr NE 0 THEN BEGIN ncdf_close cdfid cdfid ncdf_open filein_zgr ENDIF listdims strlowcase ncdf_listdims cdfid IF where listdims EQ z 0 NE 1 THEN ncdf_diminq cdfid z name jpk ELSE BEGIN dimid where strmid listdims 0 5 EQ depth 0 IF dimid NE 1 THEN ncdf_diminq cdfid dimid name jpk ELSE BEGIN dummy report We could not find the vertical dimension its name must be z or start with depth return ENDELSE ENDELSE get the variables list related to the partial steps zgr_varlist ncdf_listvars cdfid zgr_varlist strtrim strlowcase zgr_varlist 2 define the output file IF n_elements ncfileout EQ 0 THEN ncfileout smallmeshmask nc cdfidout ncdf_create isafile FILE ncfileout IODIR iodir NEW clobber ncdf_control cdfidout nofill dimension dimidx ncdf_dimdef cdfidout x jpi dimidy ncdf_dimdef cdfidout y jpj dimidz ncdf_dimdef cdfidout z jpk global attributs ncdf_attput cdfidout IDL_Program_Name smallmeshmask pro GLOBAL ncdf_attput cdfidout Creation_Date systime GLOBAL declaration des variables varid lonarr 20 horizontal variables hgrlist glamt glamu glamv glamf gphit gphiu gphiv gphif e1t e1u e1v e1f e2t e2u e2v e2f FOR h 0 n_elements hgrlist 1 DO varid h ncdf_vardef cdfidout hgrlist h dimidx dimidy float vertical variables zgrlist e3t e3w gdept gdepw FOR z 0 n_elements zgrlist 1 DO varid 16 z ncdf_vardef cdfidout zgrlist z dimidz float variables related to the partial steps IF where zgr_varlist EQ hdept 0 NE 1 THEN varid varid ncdf_vardef cdfidout hdept dimidx dimidy float IF where zgr_varlist EQ hdepw 0 NE 1 THEN varid varid ncdf_vardef cdfidout hdepw dimidx dimidy float old variable name keep for compatibility with old run Change e3tp to e3t_ps IF where zgr_varlist EQ e3tp 0 NE 1 THEN varid varid ncdf_vardef cdfidout e3t_ps dimidx dimidy float old variable name keep for compatibility with old run Change e3wp to e3w_ps IF where zgr_varlist EQ e3wp 0 NE 1 THEN varid varid ncdf_vardef cdfidout e3w_ps dimidx dimidy float IF where zgr_varlist EQ e3t_ps 0 NE 1 THEN varid varid ncdf_vardef cdfidout e3t_ps dimidx dimidy float IF where zgr_varlist EQ e3w_ps 0 NE 1 THEN varid varid ncdf_vardef cdfidout e3w_ps dimidx dimidy float IF where zgr_varlist EQ e3u_ps 0 NE 1 THEN varid varid ncdf_vardef cdfidout e3u_ps dimidx dimidy float IF where zgr_varlist EQ e3v_ps 0 NE 1 THEN varid varid ncdf_vardef cdfidout e3v_ps dimidx dimidy float IF where zgr_varlist EQ mbathy 0 NE 1 THEN varid varid ncdf_vardef cdfidout mbathy dimidx dimidy short mask variable msklist tmask umask vmask fmask FOR m 0 n_elements msklist 1 DO varid varid ncdf_vardef cdfidout msklist m dimidx dimidy dimidz byte ncdf_control cdfidout endef get the horizontal variables IF n_elements filein_hgr NE 0 THEN BEGIN ncdf_close cdfid cdfid ncdf_open filein_hgr ENDIF FOR h 0 n_elements hgrlist 1 DO ncdf_transfer cdfid cdfidout hgrlist h get the vertical variables IF n_elements filein_zgr NE 0 THEN BEGIN ncdf_close cdfid cdfid ncdf_open filein_zgr ENDIF inzgrlist zgrlist IF where zgr_varlist EQ gdept_0 0 NE 1 THEN inzgrlist inzgrlist _0 FOR z 0 n_elements zgrlist 1 DO ncdf_transfer cdfid cdfidout inzgrlist z zgrlist z partial step variables IF where zgr_varlist EQ hdept 0 NE 1 THEN ncdf_transfer cdfid cdfidout hdept IF where zgr_varlist EQ hdepw 0 NE 1 THEN ncdf_transfer cdfid cdfidout hdepw IF where zgr_varlist EQ e3tp 0 NE 1 THEN ncdf_transfer cdfid cdfidout e3tp e3t_ps IF where zgr_varlist EQ e3wp 0 NE 1 THEN ncdf_transfer cdfid cdfidout e3wp e3w_ps IF where zgr_varlist EQ e3t_ps 0 NE 1 THEN ncdf_transfer cdfid cdfidout e3t_ps IF where zgr_varlist EQ e3w_ps 0 NE 1 THEN ncdf_transfer cdfid cdfidout e3w_ps IF where zgr_varlist EQ e3u_ps 0 NE 1 THEN ncdf_transfer cdfid cdfidout e3u_ps IF where zgr_varlist EQ e3v_ps 0 NE 1 THEN ncdf_transfer cdfid cdfidout e3v_ps IF where zgr_varlist EQ mbathy 0 NE 1 THEN ncdf_transfer cdfid cdfidout mbathy mask IF n_elements filein_msk NE 0 THEN BEGIN ncdf_close cdfid cdfid ncdf_open filein_msk ENDIF loop on the vertical levels to limit the memory use FOR k 0 jpk 1 DO BEGIN FOR m 0 3 DO BEGIN CASE ncdf_varinq cdfid msklist m ndims OF 3:ncdf_varget cdfid msklist m zzz offset 0 0 k count jpi jpj 1 4:ncdf_varget cdfid msklist m zzz offset 0 0 k 0 count jpi jpj 1 1 ENDCASE ncdf_varput cdfidout msklist m byte temporary zzz offset 0 0 k count jpi jpj 1 ENDFOR ENDFOR ncdf_close cdfid ncdf_close cdfidout RETURN END"); a[51] = new Array("./Interpolation/angle.html", "angle.pro", "", " file_comments north stereographic polar projection categories Interpolation param plam in required longitude position param pphi in required latitude position keyword DOUBLE default 0 use double precision default is float returns structure: x:x y:y containing the point position in north stereographic polar projection hidden FUNCTION fsnspp plam pphi DOUBLE double compile_opt idl2 strictarrsubs IF keyword_set double THEN BEGIN a 2 d tan dpi 4 d dpi 180 d pphi 2 d x cos dpi 180 d plam a y sin dpi 180 d plam a ENDIF ELSE BEGIN a 2 tan pi 4 pi 180 float pphi 2 x cos pi 180 float plam a y sin pi 180 float plam a ENDELSE RETURN x:x y:y END file_comments Compute angles between grid lines and direction of the North pole fom angle F v 2 2 in OPA8 2 categories Interpolation param fileocemesh in required type scalar string a netcdf file that contains at least the following variables: glamt gphit: longitudes and latitudes at T points glamu gphiu: longitudes and latitudes at U points glamv gphiv: longitudes and latitudes at V points glamf gphif: longitudes and latitudes at F points param gcosu out type 2d array cosinus of the angle between grid lines at U points and direction of the North pole param gsinu out type 2d array sinus of the angle between grid lines at U points and direction of the North pole param gcosv out type 2d array cosinus of the angle between grid lines at V points and direction of the North pole param gsinv out type 2d array sinus of the angle between grid lines at V points and direction of the North pole param gcost out type 2d array cosinus of the angle between grid lines at T points and direction of the North pole param gsint out type 2d array sinus of the angle between grid lines at T points and direction of the North pole param gcosf out type 2d array cosinus of the angle between grid lines at F points and direction of the North pole param gsinf out type 2d array sinus of the angle between grid lines at F points and direction of the North pole keyword IODIRECTORY type scalar string default the directory path where is located fileocemesh keyword DOUBLE type 1 or 0 default 0 put 1 to use double precision default is float restrictions to compute the lateral boundary conditions we assume that: 1 the first line is similar to the second line gcosu 0 gcosu 1 gsinu 0 gsinu 1 2 the grid follows OPA x and north pole periodicity rule see lbcorca history Original : 96 07 O Marti 98 06 G Madec Feb 2005: IDL adaptation S Masson May 2007: F points call to lbcorca version Id: angle pro 327 2007 12 13 16:22:35Z pinsard PRO angle fileocemesh gcosu gsinu gcosv gsinv gcost gsint gcosf gsinf IODIRECTORY iodirectory DOUBLE double compile_opt idl2 strictarrsubs 0 read oceanic grid parameters IF keyword_set IODIRECTORY THEN BEGIN IF strpos iodirectory reverse_search NE strlen iodirectory 1 THEN iodirectory iodirectory ENDIF ELSE iodirectory fileoce iodirectory fileocemesh fileoce findfile fileoce count okfile IF okfile NE 1 THEN BEGIN ras report the file fileoce is not found we stop stop ENDIF cdfido ncdf_open fileoce 0 ncdf_varget cdfido glamt glamt ncdf_varget cdfido glamu glamu ncdf_varget cdfido glamv glamv ncdf_varget cdfido glamf glamf ncdf_varget cdfido gphit gphit ncdf_varget cdfido gphiu gphiu ncdf_varget cdfido gphiv gphiv ncdf_varget cdfido gphif gphif ncdf_close cdfido glamt reform glamt over glamu reform glamu over glamv reform glamv over glamf reform glamf over gphit reform gphit over gphiu reform gphiu over gphiv reform gphiv over gphif reform gphif over sz size glamf dimension jpi sz 0 jpj sz 1 I Compute the cosinus and sinus computation done on the north stereographic polar plan north pole direction modulous at t point znpt fsnspp glamt gphit DOUBLE double glamt 1 gphit 1 free memory znpt x znpt x znpt y znpt y znnpt znpt x znpt x znpt y znpt y north pole direction modulous at u point znpu fsnspp glamu gphiu DOUBLE double znpu00 znpu znpu0i fsnspp shift glamu 0 1 shift gphiu 0 1 DOUBLE double glamu 1 gphiu 1 free memory znpu x znpu x znpu y znpu y znnpu znpu x znpu x znpu y znpu y north pole direction modulous at v point znpv fsnspp glamv gphiv DOUBLE double znpv00 znpv znpv01 fsnspp shift glamv 0 1 shift gphiv 0 1 DOUBLE double glamv 1 gphiv 1 free memory znpv x znpv x znpv y znpv y znnpv znpv x znpv x znpv y znpv y north pole direction modulous at f point znpf fsnspp glamf gphif DOUBLE double znpf00 znpf znpf01 fsnspp shift glamf 0 1 shift gphif 0 1 DOUBLE double znpf10 fsnspp shift glamf 1 0 shift gphif 1 0 DOUBLE double glamf 1 gphif 1 free memory znpf x znpf x znpf y znpf y znnpf znpf x znpf x znpf y znpf y j direction: v point segment direction t point zxvvt znpv00 x znpv01 x zyvvt znpv00 y znpv01 y zmnpvt sqrt temporary znnpt zxvvt zxvvt zyvvt zyvvt znpv00 1 znpv01 1 free memory IF keyword_set double THEN zmnpvt 1 e 14 zmnpvt ELSE zmnpvt 1 e 6 zmnpvt j direction: f point segment direction u point zxffu znpf00 x znpf01 x zyffu znpf00 y znpf01 y zmnpfu sqrt temporary znnpu zxffu zxffu zyffu zyffu znpf01 1 free memory IF keyword_set double THEN zmnpfu 1 e 14 zmnpfu ELSE zmnpfu 1 e 6 zmnpfu i direction: f point segment direction v point zxffv znpf00 x znpf10 x zyffv znpf00 y znpf10 y znpf00 1 znpf10 1 free memory zmnpfv sqrt temporary znnpv zxffv zxffv zyffv zyffv IF keyword_set double THEN zmnpfv 1 e 14 zmnpfv ELSE zmnpfv 1 e 6 zmnpfv j direction: u point segment direction f point zxuuf znpu0i x znpu00 x zyuuf znpu0i y znpu00 y zmnpuf sqrt temporary znnpf zxuuf zxuuf zyuuf zyuuf znpu00 1 znpu0i 1 free memory IF keyword_set double THEN zmnpuf 1 e 14 zmnpuf ELSE zmnpuf 1 e 6 zmnpuf cosinus and sinus using scalar and vectorial products gsint znpt x zyvvt znpt y zxvvt zmnpvt gcost znpt x zxvvt znpt y zyvvt zmnpvt cosinus and sinus using scalar and vectorial products gsinu znpu x zyffu znpu y zxffu zmnpfu gcosu znpu x zxffu znpu y zyffu zmnpfu cosinus and sinus using scalar and vectorial products caution rotation of 90 degres gsinv znpv x zxffv znpv y zyffv zmnpfv gcosv znpv x zyffv znpv y zxffv zmnpfv cosinus and sinus using scalar and vectorial products gsinf znpf x zyuuf znpf y zxuuf zmnpuf gcosf znpf x zxuuf znpf y zyuuf zmnpuf II Geographic mesh bad where abs glamf shift glamf 0 1 LT 1 e 8 IF bad 0 NE 1 THEN BEGIN gcosu bad 1 gsinu bad 0 ENDIF bad where abs gphif shift gphif 1 0 LT 1 e 8 IF bad 0 NE 1 THEN BEGIN gcosv bad 1 gsinv bad 0 ENDIF III Lateral boundary conditions gcost 0 gcost 1 gsint 0 gsint 1 gcosu 0 gcosu 1 gsinu 0 gsinu 1 IF keyword_set double THEN sgn 1 d ELSE sgn 1 dummy lbcorca gcost T sgn correction dummy lbcorca gsint T sgn correction dummy lbcorca gcosu U sgn correction dummy lbcorca gsinu U sgn correction dummy lbcorca gcosv V sgn correction dummy lbcorca gsinv V sgn correction dummy lbcorca gcosf F sgn correction dummy lbcorca gsinf F sgn correction RETURN END"); a[52] = new Array("./Interpolation/clickincell.html", "clickincell.pro", "", " file_comments click on a map and find in which cell the click was categories Grid keyword CELLTYPE T W U V or F the type of point that is located in the center of the cell which the click is located default is T type of cell with corner defined by F points keyword DRAWCELL to draw the cell in which we clicked keyword COLOR the color used to draw the cells Clicking one more time in the same cell will draw the cell with the white color keyword ORIGINAL to get the position of the cell regarding the original grid with no key_shift ixminmesh iyminmesh keyword IJ see returns keyword _EXTRA Used to pass extra keywords to inquad and PLOT when drawcell returns the index of the selected cells regarding to the grid which is in memory in the variable of the common If ij keyword is activated give 2D array 2 n which are the i j position of the n selected cells uses common examples IDL res clickincell Click with the left button to select a cell Clicking one more time in the same cell remove the cell from the selection Click on the right button to quit IDL plt findgen jpi jpj nodata map 90 0 0 ortho IDL print clickincell draw color 150 xy history Sebastien Masson smasson lodyc jussieu fr August 2003 version Id: clickincell pro 372 2008 08 08 12:31:53Z pinsard FUNCTION clickincell CELLTYPE celltype DRAWCELL drawcell COLOR color ORIGINAL original IJ ij _EXTRA extra compile_opt idl2 strictarrsubs common initialization cellnum 1L selected 0 Cell list get the grid parameter according to celltype oldgrid vargrid IF NOT keyword_set celltype THEN celltype T CASE strupcase celltype OF T :vargrid F W :vargrid F U :vargrid V V :vargrid U F :vargrid T ENDCASE grille 1 glam gphi 1 nx ny nz firstx firsty firstz lastx lasty lastz vargrid oldgrid define the corner of the cells in the clockwise direction IF keyword_set key_periodic AND nx EQ jpi THEN BEGIN x1 glam 0:ny 2 y1 gphi 0:ny 2 x2 glam 1:ny 1 y2 gphi 1:ny 1 x3 shift glam 1:ny 1 1 0 y3 shift gphi 1:ny 1 1 0 x4 shift glam 0:ny 2 1 0 y4 shift gphi 0:ny 2 1 0 ENDIF ELSE BEGIN x1 glam 0:nx 2 0:ny 2 y1 gphi 0:nx 2 0:ny 2 x2 glam 0:nx 2 1:ny 1 y2 gphi 0:nx 2 1:ny 1 x3 glam 1:nx 1 1:ny 1 y3 gphi 1:nx 1 1:ny 1 x4 glam 1:nx 1 0:ny 2 y4 gphi 1:nx 1 0:ny 2 ENDELSE glam 1 free memory gphi 1 free memory get mousse position on the reference map cursor x y data up while mouse button ne 4 do BEGIN IF finite x finite x EQ 0 THEN GOTO outwhile case mouse button of 1:BEGIN What is the longitude WHILE x GT x range 1 DO x x 360 WHILE x LT x range 0 DO x x 360 IF x GT x range 1 THEN GOTO outwhile IF y GT y range 1 THEN GOTO outwhile IF y LT y range 0 THEN GOTO outwhile cell inquad x y x1 y1 x2 y2 x3 y3 x4 y4 onsphere _extra extra IF cell 0 EQ 1 OR n_elements cell GT 1 THEN GOTO outwhile cell cell 0 already where cellnum EQ cell 0 IF already EQ 1 THEN BEGIN cellnum cellnum cell selected selected 1 already n_elements selected 1 ENDIF ELSE selected already 1 selected already IF keyword_set drawcell THEN BEGIN oplot x1 cell x2 cell x3 cell x4 cell x1 cell y1 cell y2 cell y3 cell y4 cell y1 cell color color selected already d n_colors 255 1 selected already _extra extra ENDIF END 2: middle button ELSE: ENDCASE get mousse position on the reference map outwhile: cursor x y data up ENDWHILE good where selected NE 0 IF good 0 EQ 1 THEN RETURN 1 cellnum cellnum good yy cellnum nx 1 key_periodic nx EQ jpi xx cellnum MOD nx 1 key_periodic nx EQ jpi CASE strupcase celltype OF T :BEGIN xx xx firstx 1 yy yy firsty 1 END W :BEGIN xx xx firstx 1 yy yy firsty 1 END U :BEGIN xx xx firstx yy yy firsty 1 END V :BEGIN xx xx firstx 1 yy yy firsty END F :BEGIN xx xx firstx yy yy firsty END ENDCASE bad where xx GE jpi IF bad 0 NE 1 THEN BEGIN xx bad xx bad jpi yy bad yy bad 1 ENDIF bad where yy GE jpj IF bad 0 NE 1 THEN stop IF keyword_set original THEN BEGIN xx xx key_shift bad where xx LT 0 IF bad 0 NE 1 THEN xx bad xx bad jpi xx xx MOD jpi xx xx ixminmesh yy yy iyminmesh ENDIF ncell n_elements xx IF keyword_set ij THEN RETURN reform xx 1 ncell over reform yy 1 ncell over IF keyword_set original THEN RETURN xx jpiglo yy ELSE RETURN xx jpi yy END"); a[53] = new Array("./Interpolation/compute_fromirr_bilinear_weigaddr.html", "compute_fromirr_bilinear_weigaddr.pro", "", " file_comments compute the weight and address needed to interpolate data from an irregular 2D grid defined as a grid made of quadrilateral cells to any grid using the bilinear method categories Interpolation param olonin in required type 2d array longitude of the input data param olat in required type 2d array latitude of the input data param omsk in required type 2d array or 1 land sea mask of the input data put 1 if input data are not masked param alonin in required type 2d array longitude of the output data param alat in required type 2d array latitude of the output data param amsk in required type 2d array or 1 land sea mask of the output data put 1 if output data are not masked param weig out type 2d array see ADDR param addr out type 2d array 2D arrays weig and addr are the weight and addresses used to perform the interpolation: dataout total weig datain addr 1 dataout reform dataout jpia jpja over restrictions the input grid must be an irregular 2D grid defined as a grid made of quadrilateral cells We supposed the data are located on a sphere with a periodicity along the longitude to perform the bilinear interpolation within quadrilateral cells we first morph the cell into a square cell and then compute the bilinear interpolation if some corners of the cell are land points their weights are set to 0 and the weight is redistributed on the remaining water corners points located out of the southern and northern boundaries or in cells containing only land points are set the same value as their closest neighbors history June 2006: Sebastien Masson smasson lodyc jussieu fr version Id: compute_fromirr_bilinear_weigaddr pro 372 2008 08 08 12:31:53Z pinsard PRO compute_fromirr_bilinear_weigaddr olonin olat omsk alonin alat amsk weig addr compile_opt idl2 strictarrsubs jpia size alonin dimensions 0 jpja size alonin dimensions 1 jpio size olonin dimensions 0 jpjo size olonin dimensions 1 mask check IF n_elements omsk EQ 1 AND omsk 0 EQ 1 THEN BEGIN omsk replicate 1b jpio jpjo if this is ORCA2 grid IF jpio EQ 180 OR jpio EQ 182 AND jpjo EQ 149 OR jpjo EQ 148 OR jpjo EQ 147 THEN BEGIN we look for ill defined cells IF jpio EQ 182 THEN lontmp olonin 1:180 ELSE lontmp olonin longitudinal size of the cells a lontmp shift lontmp 1 0 d1 0 5 max a 360 a MOD 360 dimension 3 a lontmp shift lontmp 1 1 d2 0 5 max a 360 a MOD 360 dimension 3 a shift lontmp 0 1 shift lontmp 1 0 d3 0 5 max a 360 a MOD 360 dimension 3 a shift lontmp 0 1 shift lontmp 1 1 d4 0 5 max a 360 a MOD 360 dimension 3 md d1 d2 d3 d4 bad max md dimension 3 GE 1 5 bad bad shift bad 1 1 shift bad 0 1 shift bad 1 0 1 in addition we get the coordinates of the atmospheric point in this new morphed square IF onsphere THEN BEGIN Warning quadrilateral2square use anticlockwise quadrilateral definition xy quadrilateral2square newcoord 0 0 newcoord 1 0 newcoord 0 3 newcoord 1 3 newcoord 0 2 newcoord 1 2 newcoord 0 1 newcoord 1 1 newcoord 0 4 newcoord 1 4 double ENDIF ELSE BEGIN xy quadrilateral2square xcell 0 ind ycell 0 ind xcell 1 ind ycell 1 ind xcell 2 ind ycell 2 ind xcell 3 ind ycell 3 ind xx yy double ENDELSE take care of rounding errors zero where abs xy LT 1e 6 IF zero 0 NE 1 THEN xy zero 0 d one where abs 1 d xy LT 1e 6 IF one 0 NE 1 THEN xy one 1 d some checks tmpmsk omsk celladdr ind CASE 1 OF xy 0 LT 0 OR xy 0 GT 1 : stop xy 1 LT 0 OR xy 1 GT 1 : stop xy 0 EQ 0 AND xy 1 EQ 0 AND tmpmsk 0 EQ 0 : foraddr n 1 xy 0 EQ 1 AND xy 1 EQ 0 AND tmpmsk 1 EQ 0 : foraddr n 1 xy 0 EQ 1 AND xy 1 EQ 1 AND tmpmsk 2 EQ 0 : foraddr n 1 xy 0 EQ 0 AND xy 1 EQ 1 AND tmpmsk 3 EQ 0 : foraddr n 1 xy 0 EQ 0 AND tmpmsk 0 tmpmsk 3 EQ 0 : foraddr n 1 xy 0 EQ 1 AND tmpmsk 1 tmpmsk 2 EQ 0 : foraddr n 1 xy 1 EQ 0 AND tmpmsk 0 tmpmsk 1 EQ 0 : foraddr n 1 xy 1 EQ 1 AND tmpmsk 2 tmpmsk 3 EQ 0 : foraddr n 1 ELSE: BEGIN we keep its address foraddr n ind keep the new coordinates forweight n 0 xy 0 forweight n 1 xy 1 END ENDCASE ENDIF ELSE foraddr n 1 ENDIF ELSE foraddr n 1 ENDFOR do we have some water atmospheric points that are not located in an water oceanic cell bad where foraddr EQ 1 IF bad 0 NE 1 THEN BEGIN yes we look for neighbor water atmospheric point located in water oceanic cell badaddr awater bad good where foraddr NE 1 list the atmospheric points located in water oceanic cell goodaddr awater good there longitude and latitude goodlon alon goodaddr goodlat alat goodaddr for all the bad points look for a neighbor neig lonarr n_elements bad onsphere 1 FOR i 0L n_elements bad 1L DO BEGIN IF i MOD 500 EQ 0 THEN print i xtmp alon badaddr i ytmp alat badaddr i CASE 1 OF if we are near the north pole ytmp GE 90 delta :keep where goodlat GE 90 3 delta cnt if we are near the longitude periodicity area xtmp LE delta OR xtmp GE 360 delta :keep where goodlon LE 3 delta OR goodlon GE 360 3 delta AND goodlat GE ytmp 3 delta AND goodlat LE ytmp 3 delta cnt other cases ELSE:BEGIN keep where goodlon GE xtmp 3 delta AND goodlon LE xtmp 3 delta AND goodlat GE ytmp 3 delta AND goodlat le ytmp 3 delta cnt ORCA cases : orca grid is irregular only northward of 40N CASE 1 OF jpio EQ 90 OR jpio EQ 92 AND jpjo EQ 76 OR jpjo EQ 75 OR jpjo EQ 74 :onsphere yy GT 40 jpio EQ 180 OR jpio EQ 182 AND jpjo EQ 149 OR jpjo EQ 148 OR jpjo EQ 147 :onsphere yy GT 40 jpio EQ 720 OR jpio EQ 722 AND jpjo EQ 522 OR jpjo EQ 521 OR jpjo EQ 520 :onsphere yy GT 40 jpio EQ 1440 OR jpio EQ 1442 AND jpjo EQ 1021 OR jpjo EQ 1020 OR jpjo EQ 1019 :onsphere yy GT 40 ELSE: ENDCASE END ENDCASE IF cnt NE 0 THEN BEGIN neig i keep neighbor xtmp ytmp goodlon keep goodlat keep sphere onsphere 0 ENDIF ELSE neig i neighbor alon badaddr i alat badaddr i goodlon goodlat sphere onsphere 0 ENDFOR get the address regarding foraddr neig good neig associate each bad point with its neighbor get its address and weight foraddr bad foraddr neig forweight bad forweight neig ENDIF transform the address of the ocean cell into the address of its 4 corners newaaddr celladdr temporary foraddr now we compute the weight to give at each corner newaweig dblarr 4 nawater a reform forweight 0 1 nawater b reform forweight 1 1 nawater forweight 1 free memory newaweig 1 d a 1 d b 1 d b a a b 1 d a b a 1 b 1 free memory mask the weight to suppress the corner located on land newaweig newaweig omsk newaaddr for cell with some land corner we have to redistribute the weight on the remaining water corners weights normalization totalweig total newaweig 1 double IF min totalweig max ma LE 0 d then stop IF ma 1 d GT 1 e 6 then stop newaweig newaweig replicate 1 d 4 totalweig weights weig dblarr 4 jpia jpja weig awater temporary newaweig address addr lonarr 4 jpia jpja addr awater temporary newaaddr RETURN END"); a[54] = new Array("./Interpolation/compute_fromreg_bilinear_weigaddr.html", "compute_fromreg_bilinear_weigaddr.pro", "", " file_comments compute the weight and address needed to interpolate data from a regular grid to any grid using the bilinear method categories Interpolation param alonin in required type 2d array longitude of the input data param alatin in required type 2d array latitude of the input data param olonin in required type 2d array longitude of the output data param olat in required type 2d array latitude of the output data keyword NONORTHERNLINE type scalar 0 or 1 default 0 put 1 if you don t want to take into account the northern line of the input data when performing the interpolation keyword NOSOUTHERNLINE type scalar 0 or 1 default 0 put 1 if you don t want to take into account the southern line of the input data when performing the interpolation param weig out type 2d array see ADDR param addr out type 2d array 2D arrays weig and addr are the weight and addresses used to perform the interpolation: dataout total weig datain addr 1 dataout reform dataout jpio jpjo over restrictions the input grid must be a regular grid defined as a grid for which each longitude lines have the same latitude and each latitude columns have the same longitude We supposed the data are located on a sphere with a periodicity along the longitude points located out of the southern and northern boundaries are interpolated using a linear interpolation only along the longitudinal direction history November 2005: Sebastien Masson smasson lodyc jussieu fr version Id: compute_fromreg_bilinear_weigaddr pro 372 2008 08 08 12:31:53Z pinsard PRO compute_fromreg_bilinear_weigaddr alonin alatin olonin olat weig addr NONORTHERNLINE nonorthernline NOSOUTHERNLINE nosouthernline compile_opt idl2 strictarrsubs alon alonin alat alatin olon olonin jpia n_elements alon jpja n_elements alat jpio size olon dimensions 0 jpjo size olon dimensions 1 alon minalon min alon max maxalon IF maxalon minalon GE 360 THEN stop alon must be monotonically increasing IF array_equal sort alon lindgen jpia NE 1 THEN BEGIN shiftx where alon EQ min alon 0 alon shift alon shiftx IF array_equal sort alon lindgen jpia NE 1 THEN stop ENDIF ELSE shiftx 0 for longitude periodic boundary condition we add the fist column on the right side of the array and alon alon alon 0 360 jpia jpia 1L alat revy alat 0 GT alat 1 IF revy THEN alat reverse alat alat must be monotonically increasing IF array_equal sort alat lindgen jpja NE 1 THEN stop if keyword_set nonorthernline then BEGIN jpja jpja 1L alat alat 0: jpja 1L ENDIF if keyword_set nosouthernline then BEGIN alat alat 1: jpja 1L jpja jpja 1L ENDIF olon between minalon and minalon 360 out where olon LT minalon WHILE out 0 NE 1 DO BEGIN olon out olon out 360 out where olon LT minalon ENDWHILE out where olon GE minalon 360 WHILE out 0 NE 1 DO BEGIN olon out olon out 360 out where olon GE minalon 360 ENDWHILE make sure that all values of olon are located within values of alon IF min olon max ma LT minalon THEN stop IF ma GE minalon 360 THEN stop we want to do bilinear interpolation for each ocean point we must find in which atm cell it is located if the ocean point is out of the atm grid we use closest neighbor interpolation for each T point of oce grid we find in which atmospheric cell it is located As the atmospheric grid is regular we can use inrecgrid instead of inquad pos inrecgrid olon olat alon 0:jpia 2L alat 0:jpja 2L checkout alon jpia 1L alat jpja 1L output2d checks for longitude each ocean point must be located in atm cell IF where pos 0 EQ 1 0 NE 1 THEN stop no ocean point should be located westward of the left boundary of the atm cell in which it is supposed to be located IF total olon LT alon pos 0 NE 0 THEN stop no ocean point should be located eastward of the right boundary of the atm cell in which it is supposed to be located IF total olon GT alon pos 0 1 NE 0 THEN stop we use bilinear interpolation we change the coordinates of each ocean point to fit into a rectangle defined by: y2 y1 x1 x2 X x x1 x2 x1 Y y y1 y2 y1 indx pos 0 indy temporary pos 1 points located out of the atmospheric grid too much northward or southward bad where indy EQ 1 indy 0 indy IF max indx GT jpia 2 THEN stop checks IF max indy GT jpja 2 THEN stop checks x coordinates of the atm cell x1 alon indx x2 alon indx 1 new x coordinates of the ocean points in each cell divi temporary x2 x1 glamnew olon x1 temporary divi x1 1 free memory olon 1 free memory y coordinates of the atm cell y1 alat indy y2 alat indy 1 new y coordinates of the ocean points in each cell divi temporary y2 y1 zero where divi EQ 0 IF zero 0 NE 1 THEN divi zero 1 gphinew olat y1 temporary divi y1 1 free memory checks IF min glamnew LT 0 THEN stop IF max glamnew GT 1 THEN stop weight and address array used for bilinear interpolation xaddr lonarr 4 jpio jpjo xaddr 0 indx xaddr 1 indx 1L xaddr 2 indx 1L xaddr 3 indx yaddr lonarr 4 jpio jpjo yaddr 0 indy yaddr 1 indy yaddr 2 indy 1L yaddr 3 indy 1L compute the weight for the bilinear interpolation weig fltarr 4 jpio jpjo weig 0 1 glamnew 1 gphinew weig 1 glamnew 1 gphinew weig 2 glamnew gphinew weig 3 1 glamnew gphinew free memory gphinew 1 IF bad 0 EQ 1 THEN glamnew 1 ELSE glamnew temporary glamnew bad we work now on the bad points linear interpolation only along the longitudinal direction IF bad 0 NE 1 THEN BEGIN ybad olat bad the ocean points that are not located into an atm cell should be located northward of the northern boundary of the atm grid or southward of the southern boundary of the atm grid IF total ybad GE min alat AND ybad LE max alat GE 1 THEN stop weig 0 bad 1 glamnew weig 1 bad temporary glamnew weig 2 bad 0 weig 3 bad 0 south where ybad LT alat 0 IF south 0 NE 1 THEN yaddr bad temporary south 0L north where ybad GT alat jpja 1 IF north 0 NE 1 THEN yaddr bad temporary north jpja 1 ybad 1 bad 1 free memory ENDIF check totalweight 1 totalweig abs 1 d total weig 1 double IF where temporary totalweig GE 1 e 5 0 NE 1 THEN stop come back to the original atm grid without longitudinal overlap jpia jpia 1L xaddr temporary xaddr MOD jpia take into account shiftx if needed IF shiftx NE 0 THEN xaddr temporary xaddr shiftx MOD jpia take into account nosouthernline and nonorthernline if keyword_set nosouthernline then BEGIN yaddr temporary yaddr 1L jpja jpja 1L ENDIF if keyword_set nonorthernline then jpja jpja 1L take into account revy if needed IF revy EQ 1 THEN yaddr jpja 1L temporary yaddr addr temporary yaddr jpia temporary xaddr return end"); a[55] = new Array("./Interpolation/compute_fromreg_imoms3_weigaddr.html", "compute_fromreg_imoms3_weigaddr.pro", "", " file_comments compute the weight and address need to interpolate data from a regular grid to any grid using the imoms3 method categories Interpolation param alonin in required type 2d array longitude of the input data param alatin in required type 2d array latitude of the input data param olonin in required type 2d array longitude of the output data param olat in required type 2d array latitude of the output data keyword NONORTHERNLINE type scalar 0 or 1 default 0 put 1 if you don t want to take into account the northern line of the input data when performing the interpolation keyword NOSOUTHERNLINE type scalar 0 or 1 default 0 put 1 if you don t want to take into account the southern line of the input data when performing the interpolation param weig out type 2d array see ADDR param addr out type 2d array 2D arrays weig and addr are the weight and addresses used to perform the interpolation: dataout total weig datain addr 1 dataout reform dataout jpio jpjo over restrictions the input grid must be a regular rectangular grid defined as a grid for which each longitude lines have the same latitude and each latitude columns have the same longitude We supposed the data are located on a sphere with a periodicity along the longitude points located between the first last 2 lines are interpolated using a imoms3 interpolation along the longitudinal direction and linear interpolation along the latitudinal direction points located out of the southern and northern boundaries are interpolated using a imoms3 interpolation only along the longitudinal direction history November 2005: Sebastien Masson smasson lodyc jussieu fr March 2006: works for rectangular grids version Id: compute_fromreg_imoms3_weigaddr pro 372 2008 08 08 12:31:53Z pinsard PRO compute_fromreg_imoms3_weigaddr alonin alatin olonin olat weig addr NONORTHERNLINE nonorthernline NOSOUTHERNLINE nosouthernline compile_opt idl2 strictarrsubs alon alonin alat alatin olon olonin jpia n_elements alon jpja n_elements alat jpio size olon dimensions 0 jpjo size olon dimensions 1 alon minalon min alon max maxalon IF maxalon minalon GE 360 THEN stop alon must be monotonically increasing IF array_equal sort alon lindgen jpia NE 1 THEN BEGIN shiftx where alon EQ min alon 0 alon shift alon shiftx IF array_equal sort alon lindgen jpia NE 1 THEN stop ENDIF ELSE shiftx 0 alon is it regularly spaced step alon shift alon 1 step 0 step 0 360 IF total step step 0 GE 1 e 6 NE 0 THEN noregx 1 we extend the longitude range of alon easy interpolation even near minalon and maxalon toadd 10 jpia 360 1 alon alon jpia toadd:jpia 1 360 alon alon 0:toadd 1 360 jpia jpia 2 toadd alat revy alat 0 GT alat 1 IF revy THEN alat reverse alat alat must be monotonically increasing IF array_equal sort alat lindgen jpja NE 1 THEN stop alat is it regularly spaced step alat shift alat 1 step step 1:jpja 1L IF total step step 0 GE 1 e 6 NE 0 THEN noregy 1 if keyword_set nonorthernline then BEGIN jpja jpja 1L alat alat 0: jpja 1L ENDIF if keyword_set nosouthernline then BEGIN alat alat 1: jpja 1L jpja jpja 1L ENDIF olon between minalon and minalon 360 out where olon LT minalon WHILE out 0 NE 1 DO BEGIN olon out olon out 360 out where olon LT minalon ENDWHILE out where olon GE minalon 360 WHILE out 0 NE 1 DO BEGIN olon out olon out 360 out where olon GE minalon 360 ENDWHILE make sure that all values of olon are located within values of alon IF min olon max ma LT minalon THEN stop IF ma GE minalon 360 THEN stop xaddr lonarr 16 jpio jpjo yaddr lonarr 16 jpio jpjo weig fltarr 16 jpio jpjo indexlon value_locate alon olon IF total alon indexlon GT olon NE 0 THEN stop IF total alon indexlon 1L LE olon NE 0 THEN stop IF where indexlon LE 1L 0 NE 1 THEN stop IF where indexlon GE jpia 3L 0 NE 1 THEN stop indexlat value_locate alat olat for the ocean points located below the atm line jpja 2 and above the line 1 for those points we can always find 16 neighbors imoms interpolation along longitude and latitude short where indexlat LT jpja 2L AND indexlat GE 1L ilon indexlon short ilat indexlat short IF NOT keyword_set noregy THEN BEGIN delta alat ilat 1L alat ilat IF max abs delta delta 0 GE 1 e 6 THEN stop delta delta 0 d0 alat ilat 1L olat short delta IF min d0 max ma LE 2 THEN stop IF ma GT 1 THEN stop wy0 imoms3 temporary d0 d1 alat ilat olat short delta IF min d1 max ma LE 1 THEN stop IF ma GT 0 THEN stop wy1 imoms3 temporary d1 d2 alat ilat 1L olat short delta IF min d2 max ma LE 0 THEN stop IF ma GT 1 THEN stop wy2 imoms3 temporary d2 d3 alat ilat 2L olat short delta IF min d3 max ma LE 1 THEN stop IF ma GT 2 THEN stop wy3 imoms3 temporary d3 ENDIF ELSE BEGIN nele n_elements short wy0 fltarr nele wy1 fltarr nele wy2 fltarr nele wy3 fltarr nele FOR i 0L nele 1 DO BEGIN IF i MOD 10000 EQ 0 THEN print i newlat spl_incr alat ilat i 1L:ilat i 2L 1 0 1 2 olat short i IF newlat LE 0 THEN stop IF newlat GT 1 THEN stop wy0 i imoms3 newlat 1 wy1 i imoms3 newlat wy2 i imoms3 1 newlat wy3 i imoms3 2 newlat ENDFOR ENDELSE mi min wy0 wy1 wy2 wy3 max ma IF abs mi 1 GE 1 e 6 THEN stop IF abs ma 1 GE 1 e 6 THEN stop IF NOT keyword_set noregx THEN BEGIN delta alon ilon alon ilon 1L IF max abs delta delta 0 GE 1 e 6 THEN stop delta delta 0 d0 alon ilon 1L olon short delta IF min d0 max ma LE 2 THEN stop IF ma GT 1 THEN stop wx0 imoms3 temporary d0 d1 alon ilon olon short delta IF min d1 max ma LE 1 THEN stop IF ma GT 0 THEN stop wx1 imoms3 temporary d1 d2 alon ilon 1L olon short delta IF min d2 max ma LE 0 THEN stop IF ma GT 1 THEN stop wx2 imoms3 temporary d2 d3 alon ilon 2L olon short delta IF min d3 max ma LE 1 THEN stop IF ma GT 2 THEN stop wx3 imoms3 temporary d3 ENDIF ELSE BEGIN nele n_elements short wx0 fltarr nele wx1 fltarr nele wx2 fltarr nele wx3 fltarr nele FOR i 0L nele 1 DO BEGIN IF i MOD 10000 EQ 0 THEN print i newlon spl_incr alon ilon i 1L:ilon i 2L 1 0 1 2 olon short i IF newlon LE 0 THEN stop IF newlon GT 1 THEN stop wx0 i imoms3 newlon 1 wx1 i imoms3 newlon wx2 i imoms3 1 newlon wx3 i imoms3 2 newlon ENDFOR ENDELSE mi min wx0 wx1 wx2 wx3 max ma IF abs mi 1 GE 1 e 6 THEN stop IF abs ma 1 GE 1 e 6 THEN stop line 0 xaddr 0 short ilon 1L xaddr 1 short ilon xaddr 2 short ilon 1L xaddr 3 short ilon 2L yaddr 0 short ilat 1L yaddr 1 short yaddr 0 short yaddr 2 short yaddr 0 short yaddr 3 short yaddr 0 short weig 0 short wx0 wy0 weig 1 short wx1 wy0 weig 2 short wx2 wy0 weig 3 short wx3 wy0 line 1 xaddr 4 short ilon 1L xaddr 5 short ilon xaddr 6 short ilon 1L xaddr 7 short ilon 2L yaddr 4 short ilat yaddr 5 short ilat yaddr 6 short ilat yaddr 7 short ilat weig 4 short wx0 wy1 weig 5 short wx1 wy1 weig 6 short wx2 wy1 weig 7 short wx3 wy1 line 2 xaddr 8 short ilon 1L xaddr 9 short ilon xaddr 10 short ilon 1L xaddr 11 short ilon 2L yaddr 8 short ilat 1L yaddr 9 short yaddr 8 short yaddr 10 short yaddr 8 short yaddr 11 short yaddr 8 short weig 8 short wx0 wy2 weig 9 short wx1 wy2 weig 10 short wx2 wy2 weig 11 short wx3 wy2 line 3 xaddr 12 short ilon 1L xaddr 13 short ilon xaddr 14 short ilon 1L xaddr 15 short ilon 2L yaddr 12 short ilat 2L yaddr 13 short yaddr 12 short yaddr 14 short yaddr 12 short yaddr 15 short yaddr 12 short weig 12 short wx0 wy3 weig 13 short wx1 wy3 weig 14 short wx2 wy3 weig 15 short wx3 wy3 mi min total weig short 1 double max ma IF abs mi 1 GE 1 e 6 THEN stop IF abs ma 1 GE 1 e 6 THEN stop for the ocean points located between the atm lines jpja 2 and jpja 1 or between the atm lines 0 and 1 linear interpolation between line 1 and line 2 short where indexlat EQ jpja 2L OR indexlat EQ 0 IF short 0 NE 1 THEN BEGIN ilon indexlon short ilat indexlat short delta alat ilat 1L alat ilat IF NOT keyword_set noregy THEN BEGIN IF max abs delta delta 0 GE 1 e 6 THEN stop delta delta 0 ENDIF d1 alat ilat olat short delta IF min d1 max ma LE 1 THEN stop IF ma GT 0 THEN stop wy1 1 temporary d1 d2 alat ilat 1L olat short delta IF min d2 max ma LE 0 THEN stop IF ma GT 1 THEN stop wy2 1 temporary d2 mi min wy1 wy2 max ma IF abs mi 1 GE 1 e 6 THEN stop IF abs ma 1 GE 1 e 6 THEN stop but imoms3 along the longitude IF NOT keyword_set noregx THEN BEGIN delta alon ilon alon ilon 1L IF max abs delta delta 0 GE 1 e 6 THEN stop delta delta 0 d0 alon ilon 1L olon short delta IF min d0 max ma LE 2 THEN stop IF ma GT 1 THEN stop wx0 imoms3 temporary d0 d1 alon ilon olon short delta IF min d1 max ma LE 1 THEN stop IF ma GT 0 THEN stop wx1 imoms3 temporary d1 d2 alon ilon 1L olon short delta IF min d2 max ma LE 0 THEN stop IF ma GT 1 THEN stop wx2 imoms3 temporary d2 d3 alon ilon 2L olon short delta IF min d3 max ma LE 1 THEN stop IF ma GT 2 THEN stop wx3 imoms3 temporary d3 ENDIF ELSE BEGIN nele n_elements short wx0 fltarr nele wx1 fltarr nele wx2 fltarr nele wx3 fltarr nele FOR i 0L nele 1 DO BEGIN IF i MOD 10000 EQ 0 THEN print i newlon spl_incr alon ilon i 1L:ilon i 2L 1 0 1 2 olon short i IF newlon LE 0 THEN stop IF newlon GT 1 THEN stop wx0 i imoms3 newlon 1 wx1 i imoms3 newlon wx2 i imoms3 1 newlon wx3 i imoms3 2 newlon ENDFOR ENDELSE mi min wx0 wx1 wx2 wx3 max ma IF abs mi 1 GE 1 e 6 THEN stop IF abs ma 1 GE 1 e 6 THEN stop line 1 xaddr 0 short ilon 1L xaddr 1 short ilon xaddr 2 short ilon 1L xaddr 3 short ilon 2L yaddr 0 short ilat yaddr 1 short ilat yaddr 2 short ilat yaddr 3 short ilat weig 0 short wx0 wy1 weig 1 short wx1 wy1 weig 2 short wx2 wy1 weig 3 short wx3 wy1 line 2 xaddr 4 short ilon 1L xaddr 5 short ilon xaddr 6 short ilon 1L xaddr 7 short ilon 2L yaddr 4 short ilat 1L yaddr 5 short yaddr 4 short yaddr 6 short yaddr 4 short yaddr 7 short yaddr 4 short weig 4 short wx0 wy2 weig 5 short wx1 wy2 weig 6 short wx2 wy2 weig 7 short wx3 wy2 mi min total weig short 1 double max ma IF abs mi 1 GE 1 e 6 THEN stop IF abs ma 1 GE 1 e 6 THEN stop ENDIF for the ocean points located below the line 0 Interpolation only along the longitude short where indexlat EQ 1 IF short 0 NE 1 THEN BEGIN ilon indexlon short IF NOT keyword_set noregx THEN BEGIN delta alon ilon alon ilon 1L IF max abs delta delta 0 GE 1 e 6 THEN stop delta delta 0 d0 alon ilon 1L olon short delta IF min d0 max ma LE 2 THEN stop IF ma GT 1 THEN stop wx0 imoms3 temporary d0 d1 alon ilon olon short delta IF min d1 max ma LE 1 THEN stop IF ma GT 0 THEN stop wx1 imoms3 temporary d1 d2 alon ilon 1L olon short delta IF min d2 max ma LE 0 THEN stop IF ma GT 1 THEN stop wx2 imoms3 temporary d2 d3 alon ilon 2L olon short delta IF min d3 max ma LE 1 THEN stop IF ma GT 2 THEN stop wx3 imoms3 temporary d3 ENDIF ELSE BEGIN nele n_elements short wx0 fltarr nele wx1 fltarr nele wx2 fltarr nele wx3 fltarr nele FOR i 0L nele 1 DO BEGIN IF i MOD 10000 EQ 0 THEN print i newlon spl_incr alon ilon i 1L:ilon i 2L 1 0 1 2 olon short i IF newlon LE 0 THEN stop IF newlon GT 1 THEN stop wx0 i imoms3 newlon 1 wx1 i imoms3 newlon wx2 i imoms3 1 newlon wx3 i imoms3 2 newlon ENDFOR ENDELSE mi min wx0 wx1 wx2 wx3 max ma IF abs mi 1 GE 1 e 6 THEN stop IF abs ma 1 GE 1 e 6 THEN stop line 1 xaddr 0 short ilon 1L xaddr 1 short ilon xaddr 2 short ilon 1L xaddr 3 short ilon 2L yaddr 0:3 short 0 weig 0 short wx0 weig 1 short wx1 weig 2 short wx2 weig 3 short wx3 mi min total weig short 1 double max ma IF abs mi 1 GE 1 e 6 THEN stop IF abs ma 1 GE 1 e 6 THEN stop ENDIF for the ocean points located above jpia 1 Interpolation only along the longitude short where indexlat EQ jpja 1L IF short 0 NE 1 THEN BEGIN ilon indexlon short IF NOT keyword_set noregx THEN BEGIN delta alon ilon alon ilon 1L IF max abs delta delta 0 GE 1 e 6 THEN stop delta delta 0 d0 alon ilon 1L olon short delta IF min d0 max ma LE 2 THEN stop IF ma GT 1 THEN stop wx0 imoms3 temporary d0 d1 alon ilon olon short delta IF min d1 max ma LE 1 THEN stop IF ma GT 0 THEN stop wx1 imoms3 temporary d1 d2 alon ilon 1L olon short delta IF min d2 max ma LE 0 THEN stop IF ma GT 1 THEN stop wx2 imoms3 temporary d2 d3 alon ilon 2L olon short delta IF min d3 max ma LE 1 THEN stop IF ma GT 2 THEN stop wx3 imoms3 temporary d3 ENDIF ELSE BEGIN nele n_elements short wx0 fltarr nele wx1 fltarr nele wx2 fltarr nele wx3 fltarr nele FOR i 0L nele 1 DO BEGIN IF i MOD 10000 EQ 0 THEN print i newlon spl_incr alon ilon i 1L:ilon i 2L 1 0 1 2 olon short i IF newlon LE 0 THEN stop IF newlon GT 1 THEN stop wx0 i imoms3 newlon 1 wx1 i imoms3 newlon wx2 i imoms3 1 newlon wx3 i imoms3 2 newlon ENDFOR ENDELSE mi min wx0 wx1 wx2 wx3 max ma IF abs mi 1 GE 1 e 6 THEN stop IF abs ma 1 GE 1 e 6 THEN stop line 1 xaddr 0 short ilon 1L xaddr 1 short ilon xaddr 2 short ilon 1L xaddr 3 short ilon 2L yaddr 0:3 short jpja 1L weig 0 short wx0 weig 1 short wx1 weig 2 short wx2 weig 3 short wx3 mi min total weig short 1 double max ma IF abs mi 1 GE 1 e 6 THEN stop IF abs ma 1 GE 1 e 6 THEN stop ENDIF Come back to the original index of atm grid without longitudinal overlap xaddr temporary xaddr toadd jpia jpia 2 toadd make sure all values are ge 0 xaddr temporary xaddr jpia range the values between 0 and jpia 1 xaddr temporary xaddr mod jpia take into account shiftx if needed IF shiftx NE 0 THEN xaddr temporary xaddr shiftx MOD jpia take into account nosouthernline and nonorthernline if keyword_set nosouthernline then BEGIN yaddr temporary yaddr 1L jpja jpja 1L ENDIF if keyword_set nonorthernline then jpja jpja 1L take into account revy if needed IF revy EQ 1 THEN yaddr jpja 1L temporary yaddr addr temporary yaddr jpia temporary xaddr RETURN END"); a[56] = new Array("./Interpolation/cutpar.html", "cutpar.pro", "", " file_comments cut p parallelogram s into p n 2 parallelograms categories basic work param x0 in required param y0 in required param x1 in required param y1 in required param x2 in required param y2 in required param x3 in required param y3 in required 1d arrays of p elements giving the edge positions The edges must be given as in PLOT to draw the parallelogram see example param n in required each parallelogram will be cut in n 2 pieces keyword ENDPOINTS see returns keyword ONSPHERE to specify that the points are located on a sphere In this case x and y correspond to longitude and latitude in degrees returns by default: a 3d array 2 n 2 p giving the center position of each piece of the parallelograms if ENDPOINTS : a 3d array 2 n 1 2 p giving the edge positions of each piece of the parallelograms uses cutsegment examples IDL x0 2 6 2 IDL y0 0 2 6 IDL x1 3 8 4 IDL y1 4 4 6 IDL x2 1 6 4 IDL y2 5 6 8 IDL x3 0 4 2 IDL y3 1 4 8 IDL n 4 IDL splot 0 10 0 10 xstyle 1 ystyle 1 nodata IDL for i 0 2 do oplot x0 i x1 i x2 i x3 i x0 i y0 i y1 i y2 i y3 i y0 i IDL res cutpar x0 y0 x1 y1 x2 y2 x3 y3 n IDL for i 0 2 do oplot res 0 i res 1 i color 20 10 i psym 1 thick 3 history S Masson smasson lodyc jussieu fr July 5th 2002 version Id: cutpar pro 372 2008 08 08 12:31:53Z pinsard FUNCTION cutpar x0 y0 x1 y1 x2 y2 x3 y3 n ENDPOINTS endpoints ONSPHERE onsphere compile_opt idl2 strictarrsubs is it a parallelogram eps 1e 4 IF total abs x0 x2 2 x1 x3 2 GE eps GT 0 OR total abs y0 y2 2 y1 y3 2 GE eps GT 0 THEN stop print NOT a parallelogram x0 npar npar n_elements x0 firstborder 2 n keyword_set endpoints npar firstborder cutsegment x0 y0 x1 y1 n endpoints endpoints onsphere onsphere thirdborder cutsegment x3 y3 x2 y2 n endpoints endpoints onsphere onsphere res 2 n keyword_set endpoints n keyword_set endpoints npar res cutsegment firstborder 0 firstborder 1 thirdborder 0 thirdborder 1 n endpoints endpoints onsphere onsphere free memory firstborder 1 thirdborder 1 reform the result res reform res 2 n keyword_set endpoints 2 npar overwrite RETURN res END"); a[57] = new Array("./Interpolation/cutsegment.html", "cutsegment.pro", "", " file_comments cut p segments into p n equal parts categories basic work param x0 in required param y0 in required param x1 in required param y1 in required 1d arrays of p elements the coordinates of the endpoints of the p segments param n in required the number of pieces we want to cut each segment keyword ENDPOINTS see returns keyword ONSPHERE to specify that the points are located on a sphere In this case x and y correspond to longitude and latitude in degrees returns default: a 3d array 2 n p that gives the coordinates of the middle of the cut segments if ENDPOINTS a 3d array 2 n 1 p that gives the coordinates of the endpoints of the cutted segments examples IDL x0 2 5 IDL y0 5 1 IDL x1 9 3 IDL y1 1 8 IDL res cutsegment x0 y0 x1 y1 10 IDL splot 0 10 0 10 xstyle 1 ystyle 1 nodata IDL oplot x0 0 x1 0 y0 0 y1 0 IDL oplot res 0 0 res 1 0 color 20 psym 1 thick 3 IDL oplot x0 1 x1 1 y0 1 y1 1 IDL oplot res 0 1 res 1 1 color 40 psym 1 thick 3 history S Masson smasson lodyc jussieu fr July 5th 2002 version Id: cutsegment pro 371 2008 08 07 09:32:02Z pinsard FUNCTION cutsegment x0 y0 x1 y1 n ENDPOINTS endpoints ONSPHERE onsphere compile_opt idl2 strictarrsubs number of segment nseg n_elements x0 number of point to find on each segment n2find n keyword_set endpoints IF keyword_set onsphere THEN BEGIN save the inputs arrays x0in temporary x0 y0in temporary y0 x1in temporary x1 y1in temporary y1 sp_cood transpose x0in transpose y0in replicate 1 1 nseg rect_coord CV_COORD FROM_SPHERE temporary sp_cood TO_RECT DEGREES x0 rect_coord 0 y0 rect_coord 1 z0 rect_coord 2 rect_coord 1 free memory sp_cood transpose x1in transpose y1in replicate 1 1 nseg rect_coord CV_COORD FROM_SPHERE temporary sp_cood TO_RECT DEGREES x1 rect_coord 0 y1 rect_coord 1 z1 rect_coord 2 rect_coord 1 free memory ENDIF resx replicate 1 n2find x0 resx temporary resx 1 n findgen n2find 5 1 keyword_set endpoints x1 x0 resx temporary resx resy replicate 1 n2find y0 resy temporary resy 1 n findgen n2find 5 1 keyword_set endpoints y1 y0 resy temporary resy IF keyword_set onsphere THEN BEGIN resz replicate 1 n2find z0 resz temporary resz 1 n findgen n2find 5 1 keyword_set endpoints z1 z0 resz temporary resz rec_cood transpose temporary resx transpose temporary resy transpose temporary resz res CV_COORD FROM_RECT temporary rec_cood TO_SPHERE DEGREES restore the input arrays x0 temporary x0in y0 temporary y0in x1 temporary x1in y1 temporary y1in ENDIF ELSE res transpose temporary resx transpose temporary resy res reform res 0:1 2 n2find nseg overwrite RETURN res END"); a[58] = new Array("./Interpolation/extrapolate.html", "extrapolate.pro", "", " file_comments extrapolate data zinput where maskinput equal 0 by filling step by step the coastline points with the mean value of the 8 neighbors weighted by their mask values categories Interpolation param zinput in required type 2d array data to be extrapolate param maskinput in required type 2d array or 1 a 2D array the land sea mask of the output data 1 on ocean 0 on land put 1 if input data are not masked param nb_iteration in optional type integer default large enough to fill everything Maximum number of iterations done in the extrapolation process If there is no more masked values we exit extrapolate before reaching nb_iteration keyword FILLXDIR type scalar 0 or 1 default 0 put 1 to specify that filling of the data must be done only along x direction keyword FILLYDIR type scalar 0 or 1 default 0 put 1 to specify that filling of the data must be done only along y direction keyword X_PERIODIC type scalar 0 or 1 default 0 put 1 to specify that the data are periodic along x axis keyword MINVAL type scalar default not used to specify a minimum value to the extrapolated values keyword MAXVAL type scalar default not used to specify a maximum value to the extrapolated values keyword GE0 type scalar 0 or 1 default 0 put 1 to force the extrapolated values to be larger than 0 same as using minval 0 keyword _EXTRA to be able to call extrapolate with _extra keyword returns the extrapolated 2d array examples IDL a extrapolate dist jpi jpj tmask 0 x_periodic IDL tvplus a IDL tvplus a 1 tmask 0 get the coastline: IDL a extrapolate tmask 0 tmask 0 1 x_periodic IDL tvplus a tmask 0 history Originaly written by G Roullet Sebastien Masson smasson lodyc jussieu fr version Id: extrapolate pro 384 2008 11 06 02:32:33Z smasson FUNCTION extrapolate zinput maskinput nb_iteration FILLXDIR fillxdir FILLYDIR fillydir X_PERIODIC x_periodic MINVAL minval MAXVAL maxval GE0 ge0 _EXTRA ex compile_opt idl2 strictarrsubs check the number of iteration used in the extrapolation szin size zinput IF szin 0 NE 2 THEN return 1 ELSE szin szin 1:2 nx szin 0 ny szin 1 IF n_elements nb_iteration EQ 0 THEN nb_iteration max szin IF nb_iteration EQ 0 THEN return zinput take care of the boundary conditions for the x direction we put 2 additional columns at the left and right side of the array for the y direction we put 2 additional lines at the bottom and top side of the array These changes allow us to use shift function without taking care of the x and y periodicity msk bytarr nx 2 ny 2 IF n_elements maskinput EQ 1 AND maskinput 0 EQ 1 THEN maskinput replicate 1b nx ny IF n_elements maskinput NE nx ny THEN BEGIN ras report input grid mask do not have the good size return 1 ENDIF msk 1:nx 1:ny byte maskinput ztmp replicate 1 e20 nx 2 ny 2 ztmp 1:nx 1:ny zinput if keyword_set x_periodic then begin ztmp 0 1:ny zinput nx 1 ztmp nx 1 1:ny zinput 0 ENDIF remove NaN points if there is some finztmp finite ztmp nan where finztmp EQ 0 cnt_nan IF cnt_nan NE 0 THEN BEGIN ztmp temporary nan 1 e20 msk temporary msk temporary finztmp ENDIF ELSE finztmp 1 free memory z temporary ztmp nx2 nx 2 ny2 ny 2 extrapolation sqrtinv 1 sqrt 2 cnt 1 When we look for the coastline we don t want to select the borderlines of the array we force the value of the mask for those lines msk 0 1b msk nx 1 1b msk 0 1b msk ny 1 1b find the land points land where msk EQ 0 cnt_land IF keyword_set fillxdir THEN BEGIN tst total msk 1:nx 1:ny 1 cnt_land total tst NE 0 AND tst NE nx ENDIF IF keyword_set fillydir THEN BEGIN tst total msk 1:nx 1:ny 2 cnt_land total tst NE 0 AND tst NE ny ENDIF WHILE cnt LE nb_iteration AND cnt_land NE 0 DO BEGIN find the coastline points Once the land points list has been found we change back the mask values for the boundary conditions msk 0 0b msk nx 1 0b msk 0 0b msk ny 1 0b if keyword_set x_periodic then begin msk 0 msk nx msk nx 1 msk 1 endif we compute the weighted number of sea neighbors those 4 neighbors have a weight of 1: those 4 neighbors have a weight of 1 sqrt 2 : As we make sure that none of the land points are located on the border of the array we can compute the weight without shift faster CASE 1 OF keyword_set fillxdir :weight msk land 1 msk land 1 keyword_set fillydir :weight msk land nx2 msk land nx2 ELSE:weight msk land 1 msk land 1 msk land nx2 msk land nx2 sqrtinv msk land nx2 1 msk land nx2 1 msk land nx2 1 msk land nx2 1 ENDCASE list all the points that have sea neighbors ok where weight GT 0 the coastline points coast land ok their weighted number of sea neighbors weight weight temporary ok fill the coastline points z temporary z msk CASE 1 OF keyword_set fillxdir :zcoast z 1 coast z 1 coast keyword_set fillydir :zcoast z nx2 coast z nx2 coast ELSE:zcoast z 1 coast z 1 coast z nx2 coast z nx2 coast 1 sqrt 2 z nx2 1 coast z nx2 1 coast z nx2 1 coast z nx2 1 coast ENDCASE IF keyword_set ge0 THEN zcoast 0 temporary zcoast IF n_elements minval NE 0 THEN zcoast minval temporary zcoast IF n_elements maxval NE 0 THEN zcoast temporary zcoast we force the value of the mask for those lines msk 0 1b msk nx 1 1b msk 0 1b msk ny 1 1b find the land points land where msk EQ 0 cnt_land IF keyword_set fillxdir THEN BEGIN tst total msk 1:nx 1:ny 1 cnt_land total tst NE 0 AND tst NE nx ENDIF IF keyword_set fillydir THEN BEGIN tst total msk 1:nx 1:ny 2 cnt_land total tst NE 0 AND tst NE ny ENDIF ENDWHILE we return the original size of the array return z 1:nx 1:ny END"); a[59] = new Array("./Interpolation/extrapsmooth.html", "extrapsmooth.pro", "", " file_comments similar to extrapolate but could to the job in a better way because the extrapolated values are smoothed takes more time than extrapolate extrapolate data where mskin is equal 0 by filling step by step the coastline points with the mean value of the 8 neighbors categories Interpolation param in in required type 2d array data to be extrapolate param mskin in required type 2d array or 1 a 2D array the land sea mask of the output data 1 on ocean 0 on land put 1 if input data are not masked keyword MINVAL type scalar default not used to specify a minimum value to the extrapolated values keyword MAXVAL type scalar default not used to specify a maximum value to the extrapolated values keyword GE0 type scalar 0 or 1 default 0 put 1 to force the extrapolated values to be larger than 0 same as using minval 0 keyword _EXTRA to be able to call extrapsmooth with _extra keyword returns the extrapolated array with no more masked values restrictions You cannot specify the number of iterations done in the extrapolation process examples IDL a extrapsmooth dist jpi jpj tmask 0 x_periodic IDL tvplus a compare to extrapolate result: IDL b extrapolate dist jpi jpj tmask 0 x_periodic IDL tvplus b window 1 history January 2007: Sebastien Masson smasson lodyc jussieu fr version Id: extrapsmooth pro 371 2008 08 07 09:32:02Z pinsard FUNCTION extrapsmooth in mskin X_PERIODIC x_periodic MINVAL minval MAXVAL maxval GE0 ge0 _EXTRA ex compile_opt strictarr strictarrsubs sz size reform in IF sz 0 NE 2 THEN BEGIN ras report Input arrays must have 2 dimensions return 1 ENDIF nx sz 1 ny sz 2 IF n_elements mskin EQ 1 AND mskin 0 EQ 1 THEN mskin replicate 1b nx ny IF n_elements mskin NE nx ny THEN BEGIN ras report input grid mask do not have the good size return 1 ENDIF out reform in whmsk where mskin EQ 0 nbr IF nbr NE 0 THEN out temporary whmsk values f_nan add values on each side of the array to avoid boundary effects nx2 nx 2 ny2 ny 2 add replicate values f_nan nx ny2 out add temporary out add IF keyword_set x_periodic THEN BEGIN add1 out 0:nx2 add2 out nx nx2:nx 1 out add2 temporary out add1 ENDIF ELSE BEGIN add replicate values f_nan nx2 ny 2 ny2 out add temporary out add ENDELSE msk0 where finite out EQ 0 nnan total finite out nan i 1 WHILE nnan NE 0 DO BEGIN tmp smooth out 2 i 1 nan find only the changed values that where on land new where finite out EQ 0 AND finite tmp EQ 1 nnew IF nnew EQ 0 then nnan 0 ELSE BEGIN IF keyword_set ge0 THEN tmp 0 temporary tmp IF n_elements minval NE 0 THEN tmp minval temporary tmp IF n_elements maxval NE 0 THEN tmp temporary tmp temporary out IF n_elements minval NE 0 THEN out minval temporary out IF n_elements maxval NE 0 THEN out temporary out maxval get back to the original domain out temporary out nx2:nx nx2 1 ny2:ny ny2 1 put back the non maskqed values whmsk where mskin NE 0 out whmsk in whmsk return out END"); a[60] = new Array("./Interpolation/file_interp.html", "file_interp.pro", "", " hidden FUNCTION call_interp2d data inlon inlat inmask outlon outlat INIRR inirr METHOD method SMOOTH smooth WEIG weig ADDR addr MISSING_VALUE missing_value _EXTRA ex compile_opt idl2 strictarrsubs for byte short and long convert to double before extrapolation and interpolation intype size data type if intype LE 3 THEN data double temporary data take care of NaN values nanmask finite data totnanmask total nanmask IF totnanmask EQ 0 THEN return values f_nan IF totnanmask NE n_elements nanmask THEN BEGIN data where nanmask EQ 0b 1 e20 put large value to be sure they are removed during the interpolation IF inmask 0 NE 1 THEN mask temporary nanmask inmask ELSE mask temporary nanmask ENDIF ELSE mask inmask take care of missing values tpmiss size missing_value type IF tpmiss NE 0 AND tpmiss NE 7 THEN BEGIN CASE 1 OF missing_value GT 1 e6:missmask data LT missing_value 10 missing_value LT 1 e6:missmask data GT missing_value 10 abs missing_value LT 1 e 6:missmask abs data GT 1 e 6 ELSE:missmask data NE missing_value ENDCASE IF total missmask EQ 0 THEN return missing_value IF mask 0 NE 1 THEN mask temporary missmask mask ELSE mask temporary missmask ENDIF extrapolation IF keyword_set smooth THEN data extrapsmooth temporary data mask x_periodic _extra ex ELSE data extrapolate temporary data mask x_periodic _extra ex interpolation IF NOT keyword_set inirr THEN BEGIN data fromreg method temporary data inlon inlat outlon outlat WEIG weig ADDR addr _extra ex ENDIF ELSE BEGIN data fromirr method temporary data inlon inlat 1 outlon outlat 1 WEIG weig ADDR addr ENDELSE if intype LE 3 THEN data round temporary data RETURN data END file_comments interpolate a NetCDF file from a grid to another both regular or not categories Interpolation NetCDF param filein in type scalar string input file name must exist param fileout in type scalar string output file name will be overwritten if already exist param gridout in type scalar string output grid file name must exist and must contain the longitude and latitude axis as 1D or 2D arrays keyword GRIDIN type scalar string default set to filein define the input grid file name It must exist and must contain the longitude and latitude axis as 1D or 2D arrays Useful if filein file doesn t contain longitude and latitude axis keyword MASKIN type scalar string default set to gridin define the input mask file name It must exist The mask will be determined through ncdf_getmask according to the keywords inmaskname ininvmask inuseasmask inmissing_value inaddscl_before see below keyword MASKOUT type scalar string default set to gridout define the output mask file name It must exist The mask will be determined through ncdf_getmask according to the keywords outmaskname outinvmask outuseasmask outmissing_value outaddscl_before see below keyword KEEP type string array default all variables array defining the name of the variables that must be kept in the output file keyword REMOVE type string array default empty array defining the name of the variables that will be removed in the output file keyword METHOD type scalar string default bilinear interpolation method: can be only bilinear or imoms3 if the input grid is a regular grid A regular rectangular grid is defined as a grid for which each longitude lines have the same latitude and each latitude columns have the same longitude keyword SMOOTH type scalar 0 or 1 default 0 activate to use extrapsmooth instead of extrapolate when extrapolating input data over masked points keyword SET_XDIMNAME type scalar string default not used used to defined the name of x dimension in filein input file when gridin keyword is used and when the x dimension name is not the same in filein and gridin files By default we assume both file have the same x dimension name keyword SET_YDIMNAME type scalar string default not used same as set_xdimname but for y dimension keyword SET_XAXISNAME type scalar string default not used used to defined the name of the variable containing the x axis in filein input file when gridin keyword is used and when its variable containing the x axis name is not the same By default we assume both file have the same x axis name Not that if filein includes x axis there is no point to use gridin keyword SET_YAXISNAME type scalar string default not used same as set_xaxisname but for y dimension keyword INMASKNAME type scalar string default not used A string giving the name of the variable in the file maskin that contains the land sea mask keyword OUTMASKNAME type scalar string default not used same as inmaskname but for output mask file maskout keyword ININVMASK default 0 type scalar: 0 or 1 Inverse the land sea mask of the input mask file maskin that should have 0 1 values for land sea keyword OUTINVMASK default 0 type scalar: 0 or 1 same as ininvmask but for output mask file maskout keyword INUSEASMASK type scalar string A string giving the name of the variable in the input mask file that will be used to build the input land sea mask In this case the mask is based on the first record if record dimension exists The input mask is build according to operator defined by INTESTOP keyword default NE and the testing values defined as 1 the second word of TESTOP if existing 2 MISSING_VALUE keyword 3 attribute missing_value or _fillvalue of the variable USEASMASK 4 Values f_nan can be used only with NE and EQ operators keyword OUTUSEASMASK type scalar string same as inuseasmask but for output mask file maskout keyword INMISSING_VALUE type scalar To define or redefine if the attribute is already existing the missing values used with INUSEASMASK keyword to build the input mask Note that this value is not used if INTESTOP keyword is given and contains 2 words Note: do not mismatch with MISSING_VALUE used to detect missing values at reach record keyword OUTMISSING_VALUE type scalar same as inmissing_value but for output mask file maskout keyword INTESTOP default NE type scalar string for example GT 0 5 a string describing the type of test that will be done to define the input mask The test is performed on the variable specified by INUSEASMASK keyword INTESTOP can contain 1 or 2 words The first word is the operator definition: EQ NE GE GT LE LT default is NE The second word define the testing value If INTESTOP contains only 1 word then the test value is denifed by 1 INMISSING_VALUE keyword 2 attribute missing_value or _fillvalue of the variable INUSEASMASK 3 Values f_nan can be used only with NE and EQ operators keyword OUTTESTOP default NE type scalar string for example GT 0 5 same as INTESTOP but for output mask file maskout keyword INADDSCL_BEFORE default 0 type scalar: 0 or 1 put 1 to apply add_offset and scale factor on data before looking for missing values when using INUSEASMASK keyword keyword OUTADDSCL_BEFORE default 0 type scalar: 0 or 1 same as inaddscl_before but for output mask file maskout keyword MISSING_VALUE type scalar default defined by attribute missing_value or _fillvalue Re define the missing value in input data missing values are treated like masked values and will be filled with extrapolation before interpolation Note: do not mismatch with IN OUT MISSING_VALUE which are missing value used in association with IN OUT USEASMASK to built the mask that does not change from one record to another Note: this value will be apply to all interpolated variables keyword ADDR type 2d array or variable name 1 at the first call of file_interp: This keyword can be set to a named variable undefined or equal to 0 into which the addresses used to perform the interpolation will be copied when the current routine exits 2 Next once this keyword is set to a defined 2d array it is used to bypass the computation of the weights and addresses used to perform the interpolation In this case interpolation is much faster keyword WEIG type 2d array or variable name see ADDR keyword INXAXISNAME default x longitude nav_lon lon lon_rho or NbLongitudes type scalar string A string giving the name of the variable containing the x axis in the input grid file gridin keyword INYAXISNAME default y latitude nav_lat lat lat_rho or NbLatitudes type scalar string same as inxaxisname but for the y axis in the input grid file gridin keyword OUTXAXISNAME default x longitude nav_lon lon lon_rho or NbLongitudes type scalar string same as inxaxisname but for output grid file gridout keyword OUTYAXISNAME default y latitude nav_lat lat lat_rho or NbLatitudes type scalar string same as inyaxisname but for output grid file gridout keyword _EXTRA to use extrapolate extrapsmooth and fromreg keywords uses extrapsmooth extrapolate fromreg and fromirr restrictions perform only horizontal interpolations on scalar fields all masked and missing values are filled before interpolation output data are not masked and have values everywhere attributes like valid_min are not updated see restrictions of fromreg and fromirr output mask is not used but if the input file contains the mask in a variable defined by inmaskname this variable will contain the output mask in the ouput file examples IDL file_interp filein fileout gridout inxaxisname lo inyaxisname la keep lo la cond_sed IDL file_interp in out gdout inuseasmask sst inmissing_value 1 00000e 30 missing_value 1000 00 history September 2007: Sebastien Masson smasson locean ipsl upmc fr version Id: file_interp pro 383 2008 10 30 13:55:33Z smasson PRO file_interp filein fileout gridout GRIDIN gridin MASKIN maskin MASKOUT maskout KEEP keep REMOVE remove METHOD method SMOOTH smooth SET_XDIMNAME set_xdimname SET_YDIMNAME set_ydimname SET_XAXISNAME set_xaxisname SET_YAXISNAME set_yaxisname INMASKNAME inmaskname ININVMASK ininvmask INUSEASMASK inuseasmask INMISSING_VALUE inmissing_value INADDSCL_BEFORE inaddscl_before INTESTOP intestop OUTMASKNAME outmaskname OUTINVMASK outinvmask OUTUSEASMASK outuseasmask OUTMISSING_VALUE outmissing_value OUTADDSCL_BEFORE outaddscl_before OUTTESTOP outtestop MISSING_VALUE MISSING_VALUE WEIG weig ADDR addr INXAXISNAME inxaxisname INYAXISNAME inyaxisname OUTXAXISNAME outxaxisname OUTYAXISNAME outyaxisname _EXTRA ex compile_opt idl2 strictarrsubs revision Id: file_interp pro 383 2008 10 30 13:55:33Z smasson IF NOT keyword_set method THEN method bilinear input filenames checks inid ncdf_open filein ininq ncdf_inquire inid outid ncdf_create fileout clobber ncdf_control outid nofill IF NOT keyword_set gridin THEN gridin filein IF NOT keyword_set maskin THEN maskin gridin IF NOT keyword_set maskout THEN maskout gridout Copy global attributes FOR i 0 ininq ngatts 1 DO BEGIN name ncdf_attname inid i global dummy ncdf_attcopy inid name outid in_global out_global ENDFOR ncdf_attput outid Created_by revision GLOBAL x y dim and x yaxis informations ncdf_getaxis gridin indimidx indimidy inlon inlat xdimname inxdimname ydimname inydimname xaxisname inxaxisname yaxisname inyaxisname get_gridparams inlon inlat jpiin jpjin 2 IF keyword_set set_xdimname THEN inxdimname set_xdimname IF keyword_set set_ydimname THEN inydimname set_ydimname IF keyword_set set_xaxisname THEN inxaxisname set_xaxisname IF keyword_set set_yaxisname THEN inyaxisname set_yaxisname ncdf_getaxis gridout outdimidx outdimidy outlon outlat xaxisname outxaxisname yaxisname outyaxisname get_gridparams outlon outlat jpiout jpjout 2 masks inmask ncdf_getmask maskin MASKNAME inmaskname INVMASK ininvmask USEASMASK inuseasmask MISSING_VALUE inmissing_value ADDSCL_BEFORE inaddscl_before TESTOP intestop inmasksz size inmask dimensions IF size inmask n_dimensions EQ 2 THEN inmasksz inmasksz 0 IF n_elements inmaskname EQ 0 THEN inmaskname not defined default definition outmask ncdf_getmask maskout MASKNAME outmaskname INVMASK outinvmask USEASMASK outuseasmask MISSING_VALUE outmissing_value ADDSCL_BEFORE outaddscl_before TESTOP outtestop irregular grids CASE 0 OF array_equal inlon 0 inlon jpjin 1 :inirr 1b array_equal inlat 0 inlat jpiin 1 :inirr 1b array_equal inlon inlon 0 replicate 1 jpjin :inirr 1b array_equal inlat replicate 1 jpiin inlat 0 :inirr 1b ELSE:inirr 0b ENDCASE CASE 0 OF array_equal outlon 0 outlon jpjout 1 :outirr 1b array_equal outlat 0 outlat jpiout 1 :outirr 1b array_equal outlon outlon 0 replicate 1 jpjout :outirr 1b array_equal outlat replicate 1 jpiout outlat 0 :outirr 1b ELSE:outirr 0b ENDCASE IF inirr AND method NE bilinear THEN stop Dimensions indimsz lonarr ininq ndims outdimsz lonarr ininq ndims outdimid lonarr ininq ndims FOR i 0 ininq ndims 1 DO BEGIN ncdf_diminq inid i name size indimsz i size outdimsz i size CASE 1 OF strlowcase name EQ strlowcase inxdimname : BEGIN outdimid i ncdf_dimdef outid name jpiout outdimsz i jpiout indimx i outdimx outdimid i END strlowcase name EQ strlowcase inydimname : BEGIN outdimid i ncdf_dimdef outid name jpjout outdimsz i jpjout indimy i outdimy outdimid i END i EQ ininq recdim: outdimid i ncdf_dimdef outid name UNLIMITED ELSE: outdimid i ncdf_dimdef outid name size ENDCASE ENDFOR Variables outvarid lonarr ininq nvars FOR i 0 ininq nvars 1 DO BEGIN varinq ncdf_varinq inid i okvar 1 IF keyword_set keep THEN okvar total strlowcase keep EQ strlowcase varinq name EQ 1 IF keyword_set remove THEN okvar total strlowcase remove EQ strlowcase varinq name EQ 0 IF okvar THEN BEGIN IF varinq ndims EQ 0 THEN BEGIN scalar variable outvarid i ncdf_vardef outid varinq name BYTE varinq datatype EQ BYTE CHAR varinq datatype EQ CHAR SHORT varinq datatype EQ INT OR varinq datatype EQ SHORT LONG varinq datatype EQ LONG FLOAT varinq datatype EQ FLOAT DOUBLE varinq datatype EQ DOUBLE ENDIF ELSE BEGIN array CASE 1 OF strlowcase varinq name EQ strlowcase inxaxisname :BEGIN xaxis IF outirr THEN dimvar outdimx outdimy ELSE dimvar outdimx END strlowcase varinq name EQ strlowcase inyaxisname :BEGIN yaxis IF outirr THEN dimvar outdimx outdimy ELSE dimvar outdimy END strlowcase varinq name EQ strlowcase inmaskname :BEGIN mask IF outmask 0 NE 1 THEN dimvar outdimid varinq dim ELSE dimvar 1 END total varinq dim EQ indimx total varinq dim EQ indimx EQ 1: dimvar 1 strange variable ELSE: dimvar outdimid varinq dim ENDCASE IF dimvar 0 NE 1 THEN BEGIN outvarid i ncdf_vardef outid varinq name dimvar BYTE varinq datatype EQ BYTE CHAR varinq datatype EQ CHAR SHORT varinq datatype EQ INT OR varinq datatype EQ SHORT LONG varinq datatype EQ LONG FLOAT varinq datatype EQ FLOAT DOUBLE varinq datatype EQ DOUBLE ENDIF ELSE outvarid i 1 ENDELSE Variables attributes IF outvarid i NE 1 THEN BEGIN FOR j 0 varinq natts 1 DO BEGIN name ncdf_attname inid i j dummy ncdf_attcopy inid i name outid outvarid i ENDFOR ENDIF ENDIF ELSE outvarid i 1 ENDFOR ncdf_control outid endef FOR i 0 ininq nvars 1 DO BEGIN IF outvarid i NE 1 THEN BEGIN varinq ncdf_varinq inid i IF varinq ndims GE 2 THEN BEGIN interp varinq dim 0 EQ indimx AND varinq dim 1 EQ indimy ENDIF ELSE interp 0b CASE 1 OF strlowcase varinq name EQ strlowcase inxaxisname :BEGIN x axis IF outirr THEN ncdf_varput outid outvarid i outlon ELSE ncdf_varput outid outvarid i outlon 0 END strlowcase varinq name EQ strlowcase inyaxisname :BEGIN y axis IF outirr THEN ncdf_varput outid outvarid i outlat ELSE ncdf_varput outid outvarid i reform outlat 0 END strlowcase varinq name EQ strlowcase inmaskname :BEGIN mask ncdf_varput outid outvarid i outmask END ELSE:BEGIN IF n_elements missing_value NE 0 THEN var_missing_value MISSING_VALUE ELSE ncdf_getatt inid i MISSING_VALUE var_missing_value CASE varinq ndims OF 0:BEGIN salar ncdf_varget inid i data ncdf_varput outid outvarid i temporary data END 1:BEGIN 1D ncdf_varget inid i data ncdf_varput outid outvarid i temporary data END 2:BEGIN 2D ncdf_varget inid i data IF interp THEN data call_interp2d temporary data inlon inlat inmask 0 outlon outlat INIRR inirr METHOD method SMOOTH smooth WEIG weig ADDR addr MISSING_VALUE var_missing_value _extra ex IF interp AND n_elements data EQ 1 THEN data replicate data jpiout jpjout ncdf_varput outid outvarid i temporary data END 3:BEGIN 3D FOR k 0 indimsz varinq dim 2 1 DO BEGIN incnt indimsz varinq dim 0: 1 1 outcnt outdimsz varinq dim 0: 1 1 off 0 0 k ncdf_varget inid i data offset off count incnt IF n_elements inmasksz GE 3 THEN BEGIN IF inmasksz 2 EQ indimsz varinq dim 2 AND varinq dim 2 NE ininq recdim THEN tmpmsk inmask k ELSE tmpmsk inmask 0 ENDIF ELSE tmpmsk inmask 0 IF interp THEN data call_interp2d temporary data inlon inlat temporary tmpmsk outlon outlat INIRR inirr METHOD method SMOOTH smooth WEIG weig ADDR addr MISSING_VALUE var_missing_value _extra ex IF interp AND n_elements data EQ 1 THEN data replicate data jpiout jpjout ncdf_varput outid outvarid i temporary data offset off count outcnt ENDFOR END 4:BEGIN 4D FOR t 0 indimsz varinq dim 3 1 DO BEGIN FOR k 0 indimsz varinq dim 2 1 DO BEGIN incnt indimsz varinq dim 0: 1 1 1 outcnt outdimsz varinq dim 0: 1 1 1 off 0 0 k t ncdf_varget inid i data offset off count incnt IF n_elements inmasksz GE 3 THEN BEGIN IF inmasksz 2 EQ indimsz varinq dim 2 THEN tmpmsk inmask k ELSE tmpmsk inmask ENDIF ELSE tmpmsk inmask 0 IF interp THEN data call_interp2d temporary data inlon inlat temporary tmpmsk outlon outlat INIRR inirr METHOD method SMOOTH smooth WEIG weig ADDR addr MISSING_VALUE var_missing_value _extra ex IF interp AND n_elements data EQ 1 THEN data replicate data jpiout jpjout ncdf_varput outid outvarid i temporary data offset off count outcnt ENDFOR ENDFOR END ENDCASE END ENDCASE ENDIF ENDFOR ncdf_close inid ncdf_close outid return END"); a[61] = new Array("./Interpolation/fromirr.html", "fromirr.pro", "", " file_comments interpolate data from an irregular 2D grid to any 2D grid Only 1 method available bilinear categories Interpolation param method in required type string the interpolation method must be bilinear param datain in required type 2d array the input data to interpolate param lonin in required type 2d array the longitude of the input data param latin in required type 2d array the latitude of the input data param mskin in required type 2d array or 1 a 2D array the land sea mask of the input data 1 on ocean 0 on land put 1 if input data are not masked param lonout in required type 1d or 2d array the longitude of the output data param latout in required type 1d or 2d array the latitude of the output data param mskout in required type 2d array or 1 a 2D array the land sea mask of the output data 1 on ocean 0 on land put 1 if output data are not masked keyword WEIG type 2d array see ADDR keyword ADDR type 2d array 1 at the first call of fromirr: This keyword can be set to a named variable undefined or equal to 0 into which the addresses used to perform the interpolation will be copied when the current routine exits 2 Next once this keyword is set to a defined 2d array it is used to bypass the computation of the weights and addresses used to perform the interpolation In this case fromirr simply compute the interpolated field as: dataout total weig datain addr 1 dataout reform dataout jpio jpjo over In that case method lonin latin are not used but are necessary lonout latout are used only to know the output domain size keyword _EXTRA to be able to call fromirr with _extra keyword returns 2D array the interpolated data restrictions We supposed the data are located on a sphere with a periodicity along the longitude Note that the input data can contain the same cells several times like ORCA grid near the north pole boundary examples To interpolate 1 field: IDL tncep fromirr bilinear topa glamt gphit tmask 0 lonout latout mskout or if you have several fields to interpolate from the same source and target grids 1 get back the weights and addresses in variables a and b that must be undefined or equal to 0 before calling fromirr IDL t1ncep fromirr bilinear topa glamt gphit tmask 0 lonout latout mskout WEIG a ADDR b IDL help a b 2 use a and b that are now defined to bypass the computation of the weights and addresses and speed up the computation IDL t2ncep fromirr bilinear topa WEIG a ADDR b history June 2006: Sebastien Masson smasson lodyc jussieu fr version Id: fromirr pro 372 2008 08 08 12:31:53Z pinsard FUNCTION fromirr method datain lonin latin mskin lonout latout mskout WEIG weig ADDR addr _EXTRA ex compile_opt strictarr strictarrsubs atmospheric grid parameters alon lonin alat latin get_gridparams alon alat jpia jpja 2 double Oceanic grid parameters olon lonout olat latout get_gridparams olon olat jpio jpjo 2 double Compute weight and address IF NOT keyword_set weig AND keyword_set addr THEN BEGIN CASE method OF bilinear :compute_fromirr_bilinear_weigaddr alon alat mskin olon olat mskout weig addr ELSE:BEGIN ras report unknown interpolation method we stop stop ENDELSE ENDCASE ENDIF to the interpolation dataout total weig datain addr 1 dataout reform dataout jpio jpjo over RETURN dataout END"); a[62] = new Array("./Interpolation/fromreg.html", "fromreg.pro", "", " file_comments interpolate data from a regular rectangular grid to any grid 2 methods available: bilinear and imoms3 A regular rectangular grid is defined as a grid for which Each longitude lines have the same latitude and each latitude columns have the same longitude categories Interpolation param method in required type string the interpolation method must be bilinear or imoms3 param datain in required type 2d array the input data to interpolate param lonin in required type 1d or 2d array the longitude of the input data param latin in required type 1d or 2d array the latitude of the input data param lonout in required type 1d or 2d array the longitude of the output data param latout in required type 1d or 2d array the latitude of the output data keyword WEIG type 2d array or variable name see ADDR keyword ADDR type 2d array or variable name 1 at the first call of fromreg: This keyword can be set to a named variable undefined or equal to 0 into which the addresses used to perform the interpolation will be copied when the current routine exits 2 Next once this keyword is set to a defined 2d array it is used to bypass the computation of the weights and addresses used to perform the interpolation In this case fromreg simply compute the interpolated field as: dataout total weig datain addr 1 dataout reform dataout jpio jpjo over In that case method lonin latin are not used but are necessary lonout latout are used only to know the output domain size keyword NONORTHERNLINE activate if you don t want to take into account the northern line of the input data when performing the interpolation keyword NOSOUTHERNLINE activate if you don t want to take into account the southern line of the input data when performing the interpolation keyword _EXTRA to be able to call fromreg with _extra keyword returns 2D array the interpolated data restrictions We supposed the data are located on a sphere with a periodicity along the longitude examples To interpolate 1 field: IDL topa fromreg bilinear tncep xncep yncep glamt gphit or if you have several fields to interpolate from the same source and target grids 1 get back the weights and addresses in variables a and b that must be undefined or equal to 0 before calling fromreg IDL t1opa fromreg bilinear t1ncep xncep yncep glamt gphit WEIG a ADDR b IDL help a b 2 use a and b that are now defined to bypass the computation of the weights and addresses and speed up the computation IDL t2opa fromreg bilinear t2ncep xncep yncep glamt gphit WEIG a ADDR b history November 2005: Sebastien Masson smasson lodyc jussieu fr version Id: fromreg pro 372 2008 08 08 12:31:53Z pinsard FUNCTION fromreg method datain lonin latin lonout latout WEIG weig ADDR addr NONORTHERNLINE nonorthernline NOSOUTHERNLINE nosouthernline _EXTRA ex compile_opt idl2 strictarrsubs atmospheric grid parameters alon lonin alat latin get_gridparams alon alat jpia jpja 1 double Oceanic grid parameters olon lonout olat latout get_gridparams olon olat jpio jpjo 2 double Compute weight and address IF NOT keyword_set weig AND keyword_set addr THEN BEGIN CASE method OF bilinear :compute_fromreg_bilinear_weigaddr alon alat olon olat weig addr NONORTHERNLINE nonorthernline NOSOUTHERNLINE nosouthernline imoms3 : compute_fromreg_imoms3_weigaddr alon alat olon olat weig addr NONORTHERNLINE nonorthernline NOSOUTHERNLINE nosouthernline ELSE:BEGIN ras report unknown interpolation method we stop stop ENDELSE ENDCASE ENDIF dataout total weig datain addr 1 dataout reform dataout jpio jpjo over RETURN dataout END"); a[63] = new Array("./Interpolation/get_gridparams.html", "get_gridparams.pro", "", " file_comments Case 1: extract from a NetCDF file longitude and latitude arrays their dimensions and make sure it is 1D or 2D arrays Case 2: given longitude and latitude arrays get their dimensions and make sure they are 1D or 2D arrays categories Interpolation examples Case 1: IDL get_gridparams file name id lonname latname lon lat jpi jpj n_dimensions Case 2: IDL get_gridparams lon lat jpi jpj n_dimensions param in1 in required Case 1: name or the id returned by ncdf_open of the netcdf file Case 2: 1D or 2D arrays defining longitudes will be forced to have n_dimensions dimensions when returned param in2 in required Case 1: name of the variable containing the longitude in the NetCDF file Case 2: 1D or 2D arrays defining latitudes will be forced to have n_dimensions dimensions when returned param in3 Case 1: name of the variable containing the latitude in the NetCDF file Case 2: returned number of points in longitudinal direction param in4 out Case 1: returned longitudes array with n_dimensions dimensions Case 2: returned number of points in latitudinal direction param in5 Case 1: returned latitudes array with n_dimensions dimensions Case 2: input scalar 1 or 2 to specify if lon and lat should be returned as 1D or 2D arrays Note that if n_dimensions 1 the grid must be regular longitude and latitudes can be described as 1D arrays param in6 out Case 1: returned number of points in longitudinal direction param in7 out Case 1: returned number of points in latitudinal direction param in8 in Case 1: input scalar 1 or 2 to specify if lon and lat should be returned as 1D or 2D arrays Note that if n_dimensions 1 the grid must be regular longitude and latitudes can be described as 1D arrays keyword DOUBLE default 0 type scalar: 0 or 1 activate to force double precision for lon lat arrays examples 1 IDL ncdf_get_gridparams coordinates_ORCA_R05 nc glamt gphit olon olat jpio jpjo 2 2 IDL ncdf_get_gridparams olon olat jpio jpjo 2 history November 2005: Sebastien Masson smasson lodyc jussieu fr version Id: get_gridparams pro 379 2008 09 03 15:32:14Z smasson PRO get_gridparams in1 in2 in3 in4 in5 in6 in7 in8 DOUBLE double file lonname latname lon lat jpi jpj n_dimensions lon lat jpi jpj n_dimensions compile_opt idl2 strictarrsubs CASE n_params OF 8:BEGIN get longitude and latitude IF size in1 type EQ 7 THEN BEGIN IF file_test in1 EQ 0 THEN BEGIN ras report file in1 does not exist stop ENDIF cdfido ncdf_open in1 ENDIF ELSE cdfido in1 ncdf_varget cdfido in2 lon ncdf_varget cdfido in3 lat IF size in1 type EQ 7 THEN ncdf_close cdfido n_dimensions in8 END 5:BEGIN lon temporary in1 lat temporary in2 n_dimensions in5 END ELSE:BEGIN ras report Bad number of input parameters stop end ENDCASE sizelon size lon sizelat size lat CASE 1 OF lon and lat are 1D arrays sizelon 0 EQ 1 AND sizelat 0 EQ 1:BEGIN get jpi and jpj jpi sizelon 1 jpj sizelat 1 make sure that lon and lat have the good number of dimensions CASE n_dimensions OF 1: 2:BEGIN make lon and lat 2D arrays lon temporary lon replicate 1 jpj lat replicate 1 jpi temporary lat END ELSE:stop ENDCASE END lon is 2D array and lat is 1D array sizelon 0 EQ 2 AND sizelat 0 EQ 1:BEGIN get jpi and jpj jpi sizelon 1 jpj sizelon 2 IF jpj NE n_elements lat THEN stop make sure that lon and lat have the good number of dimensions CASE n_dimensions OF 1:BEGIN IF array_equal lon lon 0 replicate 1 jpj NE 1 THEN BEGIN ras report Longitudes are not the same for all latitudes impossible to extract a 1D array of the longitudes stop ENDIF lon lon 0 END 2:lat replicate 1 jpi temporary lat ELSE:stop ENDCASE END lon is 1D array and lat is 2D array sizelon 0 EQ 1 AND sizelat 0 EQ 2:BEGIN get jpi and jpj jpi sizelat 1 jpj sizelat 2 IF jpi NE n_elements lon THEN stop make sure that lon and lat have the good number of dimensions CASE n_dimensions OF 1:BEGIN IF array_equal lat replicate 1 jpi lat 0 NE 1 THEN BEGIN ras report Latitudes are not the same for all longitudes impossible to extract a 1D array of the latitudes stop ENDIF lat reform lat 0 END 2:lon temporary lon replicate 1 jpj ELSE:stop ENDCASE END lon and lat are 2D arrays sizelon 0 EQ 2 AND sizelat 0 EQ 2:BEGIN get jpi and jpj IF array_equal sizelon 1:2 sizelat 1:2 NE 1 THEN stop jpi sizelon 1 jpj sizelon 2 make sure that lon and lat have the good number of dimensions CASE n_dimensions OF 1:BEGIN IF array_equal lon lon 0 replicate 1 jpj NE 1 THEN BEGIN ras report Longitudes are not the same for all latitudes impossible to extract a 1D array of the longitudes stop ENDIF lon lon 0 IF array_equal lat replicate 1 jpi reform lat 0 NE 1 THEN BEGIN ras report Latitudes are not the same for all longitudes impossible to extract a 1D array of the latitudes stop ENDIF lat reform lat 0 END 2: ELSE:stop ENDCASE END lon and lat are not 1D and or 2D arrays ELSE: BEGIN ras report Longitudes and latitudes are not 1D and or 2D arrays stop END ENDCASE double keyword if keyword_set double then BEGIN lon double temporary lon lat double temporary lat ENDIF give back the right outparameters CASE n_params OF 8:BEGIN in4 temporary lon in5 temporary lat in6 temporary jpi in7 temporary jpj END 5:BEGIN in1 temporary lon in2 temporary lat in3 temporary jpi in4 temporary jpj END ENDCASE return END"); a[64] = new Array("./Interpolation/imoms3.html", "imoms3.pro", "", " param xin in required version Id: imoms3 pro 325 2007 12 06 10:04:53Z pinsard FUNCTION imoms3 xin compile_opt idl2 strictarrsubs x abs xin y fltarr n_elements x test1 where x LT 1 IF test1 0 NE 1 THEN BEGIN xtmp x test1 y test1 0 5 xtmp xtmp xtmp xtmp xtmp 0 5 xtmp 1 ENDIF test1 where x LT 2 AND x GE 1 IF test1 0 NE 1 THEN BEGIN xtmp x test1 y test1 1 6 xtmp xtmp xtmp xtmp xtmp 11 6 xtmp 1 ENDIF RETURN y END"); a[65] = new Array("./Interpolation/inquad.html", "inquad.pro", "", " file_comments to find if an x y point is in a quadrilateral x1 x2 x3 x4 categories Grid param x in required param y in required the coordinates of the point we want to know where it is Must be a scalar if ONSPHERE activated else can be scalar or array param x1 in required param y1 in required param x2 in required param y2 in required param x3 in required param y3 in required param x4 in required param y4 in required the coordinates of the quadrilateral given in the CLOCKWISE order Scalar or array keyword DOUBLE use double precision to perform the computation keyword ONSPHERE to specify that the quadrilateral are on a sphere and that their coordinates are longitude latitude coordinates In this case east west periodicity poles singularity and other pbs related to longitude latitude coordinates are managed automatically keyword DELTA default 4 to speed up the program we reduce the aera where we look for potential quadrilaterals containing x y Delta defines the limit of the box centred on x y with a zonal and meridional extent of delta degrees keyword NOPRINT to suppress the print messages keyword NEWCOORD returns a n elements vector where n is the number of elements of x res i j means that the point number i is located in the quadrilateral number j with 0 x 1 1 2 6 7 3 IDL y 1 1 3 3 4 7 IDL x1 1 0 4 2 IDL y1 1 1 4 8 IDL x2 1 1 6 4 IDL y2 1 5 6 8 IDL x3 1 3 8 4 IDL y3 1 4 4 6 IDL x4 1 2 6 2 IDL y4 1 0 2 6 IDL splot 0 10 0 10 xstyle 1 ystyle 1 nodata IDL for i 0 2 do oplot x4 i x1 i x2 i x3 i x4 i y4 i y1 i y2 i y3 i y4 i IDL oplot x y color 20 psym 1 thick 2 IDL print inquad x y x1 y1 x2 y2 x3 y3 x4 y4 On a sphere see clickincell history Sebastien Masson smasson lodyc jussieu fr August 2003 Based on Convert_clic_ij pro written by Gurvan Madec version Id: inquad pro 371 2008 08 07 09:32:02Z pinsard FUNCTION inquad x y x1 y1 x2 y2 x3 y3 x4 y4 ONSPHERE onsphere DOUBLE double DELTA delta NOPRINT noprint NEWCOORD newcoord compile_opt idl2 strictarrsubs ntofind n_elements x nquad n_elements x2 IF keyword_set onsphere THEN BEGIN save the inputs parameters xin x yin y x1in x1 y1in y1 x2in x2 y2in y2 x3in x3 y3in y3 x4in x4 y4in y4 for map_set x x MOD 360 x1 x1 MOD 360 x2 x2 MOD 360 x3 x3 MOD 360 x4 x4 MOD 360 save map save map: map x: x y: y z: z p: p do a satellite projection IF NOT keyword_set delta THEN delta 4 map_set y 0 x 0 0 stereo limit y 0 delta 2 x 0 delta 2 y 0 delta 2 x 0 delta 2 noerase iso noborder use normal coordinates to reject cells which are out of the projection tmp convert_coord x y DATA TO_NORMAL DOUBLE double tmp1 convert_coord x1 y1 DATA TO_NORMAL DOUBLE double tmp2 convert_coord x2 y2 DATA TO_NORMAL DOUBLE double tmp3 convert_coord x3 y3 DATA TO_NORMAL DOUBLE double tmp4 convert_coord x4 y4 DATA TO_NORMAL DOUBLE double remove cell which have one corner with coordinates equal to NaN test finite tmp1 0 tmp1 1 tmp2 0 tmp2 1 tmp3 0 tmp3 1 tmp4 0 tmp4 1 good where temporary test EQ 1 IF good 0 EQ 1 THEN BEGIN IF NOT keyword_set noprint THEN BEGIN ras report The point is out of the cells ENDIF restore the input parameters x temporary xin y temporary yin x1 temporary x1in y1 temporary y1in x2 temporary x2in y2 temporary y2in x3 temporary x3in y3 temporary y3in x4 temporary x4in y4 temporary y4in restore old map map save map x save x y save y z save z p save p RETURN 1 ENDIF x tmp 0 y tmp 1 x1 tmp1 0 good y1 tmp1 1 good x2 tmp2 0 good y2 tmp2 1 good x3 tmp3 0 good y3 tmp3 1 good x4 tmp4 0 good y4 tmp4 1 good tmp1 1 tmp2 1 tmp3 1 tmp4 1 remove cells which are obviously bad test x1 GT x AND x2 GT x AND x3 GT x AND x4 GT x OR x1 LT x AND x2 LT x AND x3 LT x AND x4 LT x OR y1 GT y AND y2 GT y AND y3 GT y AND y4 GT y OR y1 LT y AND y2 LT y AND y3 LT y AND y4 LT y good2 where temporary test EQ 0 IF good2 0 EQ 1 THEN BEGIN IF NOT keyword_set noprint THEN BEGIN ras report The point is out of the cells ENDIF restore the input parameters x temporary xin y temporary yin x1 temporary x1in y1 temporary y1in x2 temporary x2in y2 temporary y2in x3 temporary x3in y3 temporary y3in x4 temporary x4in y4 temporary y4in restore old map map save map x save x y save y z save z p save p RETURN 1 ENDIF nquad n_elements good2 x1 x1 good2 y1 y1 good2 x2 x2 good2 y2 y2 good2 x3 x3 good2 y3 y3 good2 x4 x4 good2 y4 y4 good2 ENDIF the point is inside the quadrilateral if test eq 1 with test equal to: test x x1 y2 y1 GE x2 x1 y y1 x x2 y3 y2 GT x3 x2 y y2 x x3 y4 y3 GT x4 x3 y y3 x x4 y1 y4 GE x1 x4 y y4 computation of test without any do loop for ntofind points x y and nquad quadrilateral x1 x2 x3 x4 y1 y2 y3 y4 test dimensions are ntofind nquad column i of test corresponds to the intersection of point i with all quadrilateral row j of test corresponds to all the points localized in cell j IF keyword_set double THEN one 1 d ELSE one 1 nquad_1 replicate one nquad ntofind_1 replicate one ntofind x_nquad x replicate one nquad y_nquad y replicate one nquad test x x1 y2 y1 GE x2 x1 y y1 x_nquad ntofind_1 x1 ntofind_1 y2 y1 GE ntofind_1 x2 x1 y_nquad ntofind_1 y1 AND x x2 y3 y2 GE x3 x2 y y2 x_nquad ntofind_1 x2 ntofind_1 y3 y2 GE ntofind_1 x3 x2 y_nquad ntofind_1 y2 AND x x3 y4 y3 GE x4 x3 y y3 x_nquad ntofind_1 x3 ntofind_1 y4 y3 GE ntofind_1 x4 x3 y_nquad ntofind_1 y3 AND x x4 y1 y4 GE x1 x4 y y4 x_nquad ntofind_1 x4 ntofind_1 y1 y4 GE ntofind_1 x1 x4 y_nquad ntofind_1 y4 nquad_1 1 ntofind_1 1 x_nquad 1 y_nquad 1 free memory check test if ntofind gt 1 if ntofind gt 1 each point must be localised in one uniq cell IF ntofind GT 1 THEN BEGIN each column of test must have only 1 position equal to one chtest total test 2 points out of the cells IF where chtest EQ 0 0 NE 1 THEN BEGIN IF NOT keyword_set noprint THEN BEGIN ras report Points number strjoin strtrim where chtest EQ 0 1 are out of the grid ENDIF stop ENDIF points in more than one cell IF where chtest GT 1 0 NE 1 THEN BEGIN IF NOT keyword_set noprint THEN BEGIN ras report Points number strjoin strtrim where chtest GT 1 1 are in more than one cell ENDIF stop ENDIF ENDIF find the points for which test eq 1 found where temporary test EQ 1 if ntofind eq 1 the point may be localised in more than one grid cell ou may also be out of the cells IF ntofind EQ 1 THEN BEGIN CASE 1 OF found 0 EQ 1:BEGIN IF NOT keyword_set noprint THEN BEGIN ras report The point is out of the cells ENDIF IF keyword_set onsphere THEN BEGIN restore old map map save map x save x y save y z save z p save p ENDIF return 1 END n_elements found GT ntofind:BEGIN IF NOT keyword_set noprint THEN BEGIN ras report The point is in more than one cell ENDIF END ELSE: ENDCASE ENDIF ELSE BEGIN if ntofind GT 1 found must be sorted i position of found this corresponds to one x y point forsort found MOD ntofind j position of found this corresponds to cell in which is one x y point found temporary found ntofind found must be sorted according to forsort found found sort forsort ENDELSE IF keyword_set onsphere THEN BEGIN IF arg_present newcoord THEN BEGIN found found 0 newcoord x1 found y1 found x2 found y2 found x3 found y3 found x4 found y4 found x y ENDIF found good good2 found restore the input parameters x temporary xin y temporary yin x1 temporary x1in y1 temporary y1in x2 temporary x2in y2 temporary y2in x3 temporary x3in y3 temporary y3in x4 temporary x4in y4 temporary y4in restore old map map save map x save x y save y z save z p save p ENDIF RETURN found END"); a[66] = new Array("./Interpolation/inrecgrid.html", "inrecgrid.pro", "", " file_comments given a list of points x y position the x and y limits of a rectangular grid find in which cell is located each given point categories Without loop param x1d in required type 1d array the x position on the points param y1d in required type 1d array the y position on the points param left in required type 1d monotonically increasing array the position of the left border of each cell param bottom in required type 1d monotonically increasing array the position of the bottom border of each cell keyword OUTPUT2D to get the output as a 2d array 2 n_elements x1d with res 0 the x index according to the 1d array defined by left and res 1 the y index according to the 1d array defined by bottom keyword CHECKOUT rbgrid ubgrid specify the right and upper boundaries of the grid and check if some points are out returns the index on the cell according to the 2d array defined by left and bottom examples IDL a indgen 5 IDL b indgen 7 IDL r inrecgrid 0 25 3 25 2 4 25 2 8 1 4 a b IDL print r 20 13 7 IDL r inrecgrid 0 25 3 25 2 4 25 2 8 1 4 a a 1 b b 1 output2d IDL print r 0 00000 4 00000 3 00000 2 00000 2 00000 1 00000 history S Masson smasson lodyc jussieu fr July 3rd 2002 October 3rd 2003: use value_locate version Id: inrecgrid pro 372 2008 08 08 12:31:53Z pinsard FUNCTION inrecgrid x1d y1d left bottom OUTPUT2D output2d CHECKOUT checkout compile_opt idl2 strictarrsubs ncellx n_elements left ncelly n_elements bottom xpos value_locate left x1d ypos value_locate bottom y1d IF n_elements checkout EQ 2 THEN BEGIN out where x1d GT checkout 0 IF out 0 NE 1 THEN xpos out 1 out where y1d GT checkout 1 IF out 0 NE 1 THEN ypos out 1 ENDIF IF keyword_set output2d THEN return transpose xpos transpose ypos IF NOT keyword_set checkout THEN RETURN xpos ncellx ypos res xpos ncellx ypos out where xpos EQ 1 OR ypos EQ 1 IF out 0 NE 1 THEN res out 1 RETURN res END"); a[67] = new Array("./Interpolation/lbcorca.html", "lbcorca.pro", "", " file_comments check the lateral boundaries condition east west and north of a 2D 3D 4D array located on a grif of the orca grid familly categories ORCA grid param arr in required type 2D 3D 4D array array to be checked and corrected if CORRECTION keyword is activated param grid in required type scalar string type of grid point on which is located the array: T U V or F param psign in optional type 1 or 1 default 1 keyword VERBOSE optional type 0 or 1 default 0 Activate to get error information when getting a wrong lateral boundaries condition keyword CORRECTION optional type 0 or 1 default 0 Activate to correct the wrong lateral boundary condition in arr in that case arr is changed returns the number of wrong lateral boundary condition found in arr 0 means arr is OK restrictions only ORCA2 ORCA05 and ORCA025 are coded but others are very easy to add examples IDL tst_initorca2 IDL a dist jpiglo jpjglo IDL print lbcorca a T IDL dummy lbcorca a T correction IDL print lbcorca a T history Mai 2007: Creation smasson locean ipsl upmc fr version Id: lbcorca pro 371 2008 08 07 09:32:02Z pinsard FUNCTION lbcorca arr grid psign VERBOSE verbose CORRECTION correction compile_opt idl2 strictarrsubs IF n_elements psign EQ 0 THEN psign 1 sz size arr jpi sz 1 jpj sz 2 res 0 east west periodicity checks IF array_equal arr 0 arr jpi 2 NE 1 THEN BEGIN IF keyword_set verbose THEN print east west periodicity 1 error IF keyword_set correction THEN arr 0 arr jpi 2 res res 1 ENDIF IF array_equal arr 1 arr jpi 1 NE 1 THEN BEGIN IF keyword_set verbose THEN print east west periodicity 2 error IF keyword_set correction THEN arr jpi 1 arr 1 res res 1 ENDIF north pole periodicity CASE 1 OF jpi EQ 182 AND jpj EQ 149 OR jpi EQ 1442 AND jpj EQ 1021 OR jpi EQ 4322 AND jpj EQ 3059 :BEGIN this is ORCA2 0RCA025 ORCA12 CASE grid OF T :BEGIN IF array_equal arr 1:jpi 1 jpj 1 psign reverse arr 1:jpi 1 jpj 3 NE 1 THEN BEGIN IF keyword_set verbose THEN print grid grid: north pole periodicity 1 error IF keyword_set correction THEN arr 1:jpi 1 jpj 1 psign reverse arr 1:jpi 1 jpj 3 res res 1 ENDIF IF array_equal arr 1:jpi 2 jpj 2 psign reverse arr jpi 2:jpi 1 jpj 2 NE 1 THEN BEGIN IF keyword_set verbose THEN print grid grid: north pole periodicity 2 error IF keyword_set correction THEN arr 1:jpi 2 jpj 2 psign reverse arr jpi 2:jpi 1 jpj 2 res res 1 ENDIF END U :BEGIN IF array_equal arr 1:jpi 1 jpj 1 psign reverse arr 0:jpi 2 jpj 3 NE 1 THEN BEGIN IF keyword_set verbose THEN print grid grid: north pole periodicity 1 error IF keyword_set correction THEN arr 1:jpi 1 jpj 1 psign reverse arr 0:jpi 2 jpj 3 res res 1 ENDIF IF array_equal arr 1:jpi 2 jpj 2 psign reverse arr jpi 2 1:jpi 2 jpj 2 NE 1 THEN BEGIN IF keyword_set verbose THEN print grid grid: north pole periodicity 2 error IF keyword_set correction THEN arr 1:jpi 2 jpj 2 psign reverse arr jpi 2 1:jpi 2 jpj 2 res res 1 ENDIF END V :BEGIN IF array_equal arr 1:jpi 1 jpj 1 psign reverse arr 1:jpi 1 jpj 4 NE 1 THEN BEGIN IF keyword_set verbose THEN print grid grid: north pole periodicity 1 error IF keyword_set correction THEN arr 1:jpi 1 jpj 1 psign reverse arr 1:jpi 1 jpj 4 res res 1 ENDIF IF array_equal arr 1:jpi 2 jpj 2 psign reverse arr jpi 2:jpi 1 jpj 3 NE 1 THEN BEGIN IF keyword_set verbose THEN print grid grid: north pole periodicity 2 error IF keyword_set correction THEN arr 1:jpi 2 jpj 2 psign reverse arr jpi 2:jpi 1 jpj 3 res res 1 ENDIF END F :BEGIN IF array_equal arr 1:jpi 1 jpj 1 psign reverse arr 0:jpi 2 jpj 4 NE 1 THEN BEGIN IF keyword_set verbose THEN print grid grid: north pole periodicity 1 error IF keyword_set correction THEN arr 1:jpi 1 jpj 1 psign reverse arr 0:jpi 2 jpj 4 res res 1 ENDIF IF array_equal arr 1:jpi 2 jpj 2 psign reverse arr jpi 2 1:jpi 2 jpj 3 NE 1 THEN BEGIN IF keyword_set verbose THEN print grid grid: north pole periodicity 2 error IF keyword_set correction THEN arr 1:jpi 2 jpj 2 psign reverse arr jpi 2 1:jpi 2 jpj 3 res res 1 ENDIF END ENDCASE END jpi EQ 722 AND jpj EQ 511:BEGIN this is ORCA05 CASE grid OF T :BEGIN IF array_equal arr 1:jpi 2 jpj 1 psign reverse arr 1:jpi 2 jpj 2 NE 1 THEN BEGIN IF keyword_set verbose THEN print grid grid: north pole periodicity error IF keyword_set correction THEN arr 1:jpi 2 jpj 1 psign reverse arr 1:jpi 2 jpj 2 res res 1 ENDIF END U :BEGIN IF array_equal arr 1:jpi 2 jpj 1 psign reverse arr 0:jpi 3 jpj 2 NE 1 THEN BEGIN IF keyword_set verbose THEN print grid grid: north pole periodicity error IF keyword_set correction THEN arr 1:jpi 2 jpj 1 psign reverse arr 0:jpi 3 jpj 2 res res 1 ENDIF END V :BEGIN IF array_equal arr 1:jpi 2 jpj 1 psign reverse arr 1:jpi 2 jpj 3 NE 1 THEN BEGIN IF keyword_set verbose THEN print grid grid: north pole periodicity error IF keyword_set correction THEN arr 1:jpi 2 jpj 1 psign reverse arr 1:jpi 2 jpj 3 res res 1 ENDIF END F :BEGIN IF array_equal arr 1:jpi 2 jpj 1 psign reverse arr 0:jpi 3 jpj 3 NE 1 THEN BEGIN IF keyword_set verbose THEN print grid grid: north pole periodicity error IF keyword_set correction THEN arr 1:jpi 2 jpj 1 psign reverse arr 0:jpi 3 jpj 3 res res 1 ENDIF END ENDCASE END ENDCASE east west periodicity correction again IF keyword_set correction THEN BEGIN arr 0 arr jpi 2 arr jpi 1 arr 1 ENDIF RETURN res END"); a[68] = new Array("./Interpolation/ll_narcs_distances.html", "ll_narcs_distances.pro", "", " file_comments This function returns the longitude and latitude lon lat of a point a given arc distance pi LL_ARC_DISTANCE but for n points without do loop Formula from Map Projections a working manual USGS paper 1395 Equations 5 5 and 5 6 categories Mapping geography param Lon0 in required An array containing the longitude of the starting point Values are assumed to be in radians unless the keyword DEGREES is set param Lat0 in required An array containing the latitude of the starting point Values are assumed to be in radians unless the keyword DEGREES is set param Arc_Dist in required The arc distance from Lon_lat0 The value must be between PI and PI To express distances in arc units divide by the radius of the globe expressed in the original units For example if the radius of the earth is 6371 km divide the distance in km by 6371 to obtain the arc distance param Az in required The azimuth from Lon_lat0 The value is assumed to be in radians unless the keyword DEGREES is set keyword DEGREES Set this keyword to express all measurements and results in degrees returns a 2 n array containing the longitude latitude of the resulting points Values are in radians unless the keyword DEGREES is set examples IDL Lon_lat0 1 0 2 0 Initial point specified in radians IDL Arc_Dist 2 0 Arc distance in radians IDL Az 1 0 Azimuth in radians IDL Result LL_ARC_DISTANCE Lon_lat0 Arc_Dist Az IDL PRINT Result 2 91415 0 622234 IDL lon0 10 20 100 IDL lat0 0 10 45 IDL lon1 10 60 280 IDL lat1 0 10 45 IDL dist map_npoints lon0 lat0 lon1 lat1 azimuth azi two_by_two IDL earthradius 6378206 4d0 IDL res ll_narcs_distances lon0 lat0 dist earthradius azi degrees IDL print reform res 0 10 000000 60 000000 280 00000 IDL print reform res 1 1 1999280e 15 10 000000 45 000000 history Based on the IDL function ll_arc_distance pro v 1 11 2003 02 03 Sebastien Masson smasson lodyc jussieu fr August 2005 version Id: ll_narcs_distances pro 371 2008 08 07 09:32:02Z pinsard FUNCTION ll_narcs_distances lon0 lat0 arc_dist az DEGREES degs compile_opt idl2 strictarrsubs IF n_elements lon0 NE n_elements lat0 OR n_elements lon0 NE n_elements arc_dist OR n_elements lon0 NE n_elements az THEN return 1 cdist cos arc_dist Arc_Dist is always in radians sdist sin arc_dist if keyword_set degs then s dpi 180 0 else s 1 0d0 ll lat0 s To radians sinll1 sin ll cosll1 cos ll azs az s phi asin sinll1 cdist cosll1 sdist cos azs ll lon0 s To radians lam ll atan sdist sin azs cosll1 cdist sinll1 sdist cos azs zero where arc_dist eq 0 count IF count NE 0 THEN BEGIN lam zero lon0 zero phi zero lat0 zero ENDIF if keyword_set degs then return transpose lam phi s ELSE return transpose lam phi end"); a[69] = new Array("./Interpolation/map_npoints.html", "map_npoints.pro", "", " file_comments Return the distance in meter between all np0 points P0 and all np1 points P1 on a sphere If keyword TWO_BY_TWO is given then returns the distances between number n of P0 points and number n of P1 points in that case np0 and np1 must be equal Same as MAP_2POINTS with the meter parameter but for n points without do loop categories Maps param Lon0 in required param Lat0 in required np0 elements vector longitudes and latitudes of np0 points P0 param Lon1 in required param Lat1 in required np1 elements vector longitude and latitude of np1 points P1 keyword AZIMUTH A named variable that will receive the azimuth of the great circle connecting the two points P0 to P1 keyword MIDDLE to get the longitude latitude of the middle point between P0 and P1 keyword RADIANS if set inputs and angular outputs are in radians otherwise degrees keyword RADIUS default 6378206 4d0 If given return the distance between the two points calculated using the given radius Default value is the Earth radius keyword TWO_BY_TWO If given then map_npoints returns the distances between number n of P0 points and number n of P1 pointsi In that case np0 and np1 must be equal returns An np0 np1 array giving the distance in meter between np0 points P0 and np1 points P1 Element i j of the output is the distance between element P0 i and P1 j If keyword TWO_BY_TWO is given then map_npoints returns an np elements vector giving the distance in meter between P0 i and P1 i in that case we have np0 np1 np if MIDDLE see this keyword examples IDL print IDL map_npoints 105 15 1 40 02 1 0 07 100 50 51 30 20 0 7551369 3 5600334 8 12864354 10921254 14919237 5455558 8 IDL lon0 10 20 100 IDL lat0 0 10 45 IDL lon1 10 60 280 IDL lat1 0 10 45 IDL dist map_npoints lon0 lat0 lon1 lat1 AZIMUTH azi IDL help dist azi DIST DOUBLE Array 3 3 AZI DOUBLE Array 3 3 IDL print dist 4 lindgen 3 azi 4 lindgen 3 2226414 0 4957944 5 10018863 90 000000 64 494450 4 9615627e 15 IDL dist map_npoints lon0 lat0 lon1 lat1 AZIMUTH azi TWO_BY_TWO IDL help dist azi DIST DOUBLE Array 3 AZI DOUBLE Array 3 IDL print dist azi 2226414 0 4957944 5 10018863 90 000000 64 494450 4 9615627e 15 IDL print map_2points lon0 0 lat0 0 lon1 0 lat1 0 20 000000 90 000000 IDL print map_npoints lon0 0 lat0 0 lon1 0 lat1 0 AZIMUTH azi 6378206 4d0 dtor azi 20 000000 90 000000 IDL lon0 10 20 100 IDL lat0 0 10 45 IDL lon1 10 60 280 IDL lat1 0 10 45 IDL mid map_npoints lon0 lat0 lon1 lat1 MIDDLE TWO_BY_TWO IDL print reform mid 0 reform mid 1 0 0000000 40 000000 190 00000 0 0000000 1 5902773e 15 90 000000 IDL print map_2points lon0 0 lat0 0 lon1 0 lat1 0 npath 3 1 0 0000000 0 0000000 IDL print map_2points lon0 1 lat0 1 lon1 1 lat1 1 npath 3 1 40 000000 1 5902773e 15 IDL print map_2points lon0 2 lat0 2 lon1 2 lat1 2 npath 3 1 190 00000 90 000000 history Based on the IDL function map_2points pro v 1 6 2001 01 15 Sebastien Masson smasson lodyc jussieu fr October 2003 version Id: map_npoints pro 371 2008 08 07 09:32:02Z pinsard FUNCTION map_npoints lon0 lat0 lon1 lat1 AZIMUTH azimuth RADIANS radians RADIUS radius MIDDLE middle TWO_BY_TWO two_by_two compile_opt idl2 strictarrsubs IF N_PARAMS LT 4 THEN ras report Incorrect number of arguments np0 n_elements lon0 IF n_elements lat0 NE np0 THEN ras report lon0 and lat0 must have the same number of elements np1 n_elements lon1 IF n_elements lat1 NE np1 THEN ras report lon1 and lat1 must have the same number of elements if keyword_set two_by_two AND np0 NE np1 then ras report When using two_by_two keyword P0 and P1 must have the same number of elements mx MAX ABS lat0 lat1 pi2 dpi 2 IF mx GT KEYWORD_SET radians pi2 : 90 THEN ras report Value of Latitude is out of allowed range k KEYWORD_SET radians 1 0d0 : dpi 180 0 Earth equatorial radius meters Clarke 1866 ellipsoid r_sphere n_elements RADIUS NE 0 RADIUS : 6378206 4d0 coslt1 cos k lat1 sinlt1 sin k lat1 coslt0 cos k lat0 sinlt0 sin k lat0 IF np0 EQ np1 AND np1 EQ 1 THEN two_by_two 1 if NOT keyword_set two_by_two THEN BEGIN coslt1 replicate 1 0d0 np0 temporary coslt1 sinlt1 replicate 1 0d0 np0 temporary sinlt1 coslt0 temporary coslt0 replicate 1 0d0 np1 sinlt0 temporary sinlt0 replicate 1 0d0 np1 ENDIF if keyword_set two_by_two THEN BEGIN cosl0l1 cos k lon1 lon0 sinl0l1 sin k lon1 lon0 ENDIF ELSE BEGIN cosl0l1 cos k replicate 1 0d0 np0 lon1 lon0 replicate 1 0d0 np1 sinl0l1 sin k replicate 1 0d0 np0 lon1 lon0 replicate 1 0d0 np1 ENDELSE cosc sinlt0 sinlt1 coslt0 coslt1 cosl0l1 Cos of angle between pnts Avoid roundoff problems by clamping cosine range to 1 1 cosc 1 0d0 cosc 1 0d0 if arg_present azimuth OR keyword_set middle then begin sinc sqrt 1 0d0 cosc cosc bad where abs sinc le 1 0e 7 IF bad 0 NE 1 THEN sinc bad 1 cosaz coslt0 sinlt1 sinlt0 coslt1 cosl0l1 sinc sinaz sinl0l1 coslt1 sinc IF bad 0 NE 1 THEN BEGIN sinc bad 0 0d0 sinaz bad 0 0d0 cosaz bad 1 0d0 ENDIF ENDIF IF keyword_set middle then BEGIN s0 0 5d0 acos cosc coss cos s0 sins sin s0 lats asin sinlt0 coss coslt0 sins cosaz k lons atan sins sinaz coslt0 coss sinlt0 sins cosaz k if keyword_set two_by_two THEN BEGIN return transpose lon0 lons lats ENDIF ELSE BEGIN return lon0 replicate 1 0d0 np1 lons lats ENDELSE ENDIF if arg_present azimuth then begin azimuth atan sinaz cosaz IF k NE 1 0d0 THEN azimuth temporary azimuth k ENDIF return acos cosc r_sphere end"); a[70] = new Array("./Interpolation/neighbor.html", "neighbor.pro", "", " file_comments find the closest point of P0 within a list of np1 points P1 which can be on a sphere categories Maps param p0lon in required type scalar longitudes of point P0 param p0lat in required type scalar latitudes of point P0 param neighlon in optional param neighlat in optional keyword RADIANS if set inputs and angular outputs are in radians otherwise degrees keyword DISTANCE dis to get back the distances between P0 and the np1 points P1 in the variable dis keyword SPHERE to activate if points are located on a sphere returns index giving the P1 index point that is the closest point of P0 examples IDL print neighbor 105 15 40 02 0 07 100 50 51 30 20 0 distance dis 0 IDL print dis 105 684 206 125 160 228 history Sebastien Masson smasson lodyc jussieu fr October 2003 version Id: neighbor pro 371 2008 08 07 09:32:02Z pinsard FUNCTION neighbor p0lon p0lat neighlon neighlat SPHERE sphere DISTANCE distance RADIANS radians compile_opt idl2 strictarrsubs some checks IF n_elements p0lon NE 1 THEN ras report Sorry p0lon must be a scalar p0lon p0lon 0 IF n_elements p0lat NE 1 THEN ras report Sorry p0lat must be a scalar p0lat p0lat 0 nneig n_elements neighlon IF n_elements neighlat NE nneig THEN ras report neighlon and neighlat must have the same number of elements distance between P0 and the others points IF keyword_set sphere THEN BEGIN IF sphere NE 1 THEN radius sphere distance Map_nPoints p0lon p0lat neighlon neighlat radius radius radians radians ENDIF ELSE BEGIN distance neighlon p0lon 2 neighlat p0lat 2 IF arg_present distance THEN distance sqrt distance ENDELSE RETURN where distance EQ min distance END"); a[71] = new Array("./Interpolation/quadrilateral2square.html", "quadrilateral2square.pro", "", " file_comments warm or map an arbitrary quadrilateral onto a unit square according to the 4 point correspondences: x0 y0 0 0 x1 y1 1 0 x2 y2 1 1 x3 y3 0 1 This is the inverse function of square2quadrilateral The mapping is done using perspective transformation which preserve lines in all orientations and permit quadrilateral to quadrilateral mappings see ref below categories Picture Grid param x0in in required param y0in in required param x1in in required param y1in in required param x2in in required param y2in in required param x3in in required param y3in in required the coordinates of the quadrilateral see above for correspondence with the unit square Can be scalar or array x0 y0 x1 y1 x2 y2 and x3 y3 are given in the anticlockwise order param xxin in required the coordinates of the point s for which we want to do the mapping Can be scalar or array param yyin in required the coordinates of the point s for which we want to do the mapping Can be scalar or array keyword PERF type salar 0 or 1 default 0 activate to print the elapsed time spent within quadrilateral2square keyword DOUBLE type salar 0 or 1 default 0 activate to perform double precision computation returns 2 n array: the new coordinates xout yout of the xin yin point s after mapping If xin is a scalar then n is equal to the number of elements of x0 If xin is an array then n is equal to the number of elements of xin restrictions I think degenerated quadrilateral e g flat of twisted is not work This has to be tested examples IDL splot 0 5 0 3 nodata xstyle 1 ystyle 1 IDL tracegrille findgen 11 1 findgen 11 1 color indgen 12 20 IDL xin findgen 11 1 replicate 1 11 IDL yin replicate 1 11 findgen 11 1 IDL out square2quadrilateral 2 1 3 0 5 1 2 3 xin yin IDL tracegrille reform out 0 11 11 reform out 1 11 11 color indgen 12 20 IDL inorg quadrilateral2square 2 1 3 0 5 1 2 3 out 0 out 1 IDL tracegrille reform inorg 0 11 11 reform inorg 1 11 11 color indgen 12 20 history Sebastien Masson smasson lodyc jussieu fr August 2003 Based on Digital Image Warping by G Wolberg IEEE Computer Society Press Los Alamitos California Chapter 3 see p 52 56 version Id: quadrilateral2square pro 372 2008 08 08 12:31:53Z pinsard FUNCTION quadrilateral2square x0in y0in x1in y1in x2in y2in x3in y3in xxin yyin PERF perf DOUBLE double compile_opt idl2 strictarrsubs tempsone systime 1 Warning wrong definition of x2 y2 and x3 y3 at the bottom of page 54 of Wolberg s book see figure 3 7 page 56 for the good definition IF keyword_set double THEN BEGIN x0 double x0in x1 double x1in x2 double x2in x3 double x3in y0 double y0in y1 double y1in y2 double y2in y3 double y3in xin double xxin yin double yyin ENDIF ELSE BEGIN x0 float x0in x1 float x1in x2 float x2in x3 float x3in y0 float y0in y1 float y1in y2 float y2in y3 float y3in xin float xxin yin float yyin ENDELSE get the matrix A a square2quadrilateral x0in y0in x1in y1in x2in y2in x3in y3in DOUBLE double compute the adjoint matrix IF keyword_set double THEN adj dblarr 9 n_elements x0 ELSE adj fltarr 9 n_elements x0 adj 0 a 4 a 7 a 5 adj 1 a 7 a 2 a 1 adj 2 a 1 a 5 a 4 a 2 adj 3 a 6 a 5 a 3 adj 4 a 0 a 6 a 2 adj 5 a 3 a 2 a 0 a 5 adj 6 a 3 a 7 a 6 a 4 adj 7 a 6 a 1 a 0 a 7 adj 8 a 0 a 4 a 3 a 1 IF n_elements xin EQ 1 THEN BEGIN xin replicate xin n_elements x0 yin replicate yin n_elements x0 ENDIF compute xprime yprime and wprime IF n_elements x0 EQ 1 THEN BEGIN wpr 1 adj 6 xin adj 7 yin adj 8 ENDIF ELSE BEGIN wpr 1 adj 6 xin adj 7 yin adj 8 ENDELSE xpr xin wpr ypr yin wpr IF keyword_set double THEN res dblarr 2 n_elements xin ELSE res fltarr 2 n_elements xin IF n_elements x0 EQ 1 THEN BEGIN res 0 xpr adj 0 ypr adj 1 wpr adj 2 res 1 xpr adj 3 ypr adj 4 wpr adj 5 ENDIF ELSE BEGIN res 0 xpr adj 0 ypr adj 1 wpr adj 2 res 1 xpr adj 3 ypr adj 4 wpr adj 5 ENDELSE IF keyword_set perf THEN print time quadrilateral2square systime 1 tempsone RETURN res END"); a[72] = new Array("./Interpolation/spl_fstdrv.html", "spl_fstdrv.pro", "", " file_comments returns the values of the first derivative of the interpolating function at the points X2i It is a double precision array Given the arrays X and Y which tabulate a function with the X i and Y i in ascending order and given an input value X2 the spl_incr function returns an interpolated value for the given values of X2 The interpolation method is based on cubic spline corrected in a way that interpolated value are also in ascending order examples IDL y2 spl_fstdrv x y yscd x2 param x in required An n elements at least 2 input vector that specifies the tabulate points in ascending order param y in required f x y An n elements input vector that specifies the values of the tabulated function F Xi corresponding to Xi param yscd in required The output from SPL_INIT for the specified X and Y param x2 in required type scalar or array The input values for which the first derivative values are desired returns y2: f x2 y2 history Sebastien Masson smasson lodyc jussieu fr : May 2005 version Id: spl_fstdrv pro 372 2008 08 08 12:31:53Z pinsard FUNCTION spl_fstdrv x y yscd x2 compile_opt idl2 strictarrsubs compute the first derivative of the spline function nx n_elements x ny n_elements y x must have at least 2 elements IF nx LT 2 THEN stop y must have the same number of elements than x IF nx NE ny THEN stop define loc in a way that if loc i eq 1 : x2 i x nx 1 else : x loc i extrapolation use x nx 2 and x nx 1 even if x2 i x nx 1 extrapolation loc 0 temporary loc nx 2 distance between to consecutive x deltax x loc 1 x loc distance between to consecutive y deltay y loc 1 y loc relative distance between x2 i and x loc i 1 a x loc 1 x2 deltax relative distance between x2 i and x loc i b 1 0d a compute the first derivative on x see numerical recipes Chap 3 3 yfrst temporary deltay deltax 1 0d 6 0d 3 0d a a 1 0d deltax yscd loc 1 0d 6 0d 3 0d b b 1 0d deltax yscd loc 1 beware of the computation precision force near zero values to be exactly 0 0 zero where abs yfrst LT 1 e 10 IF zero 0 NE 1 THEN yfrst zero 0 0d RETURN yfrst END"); a[73] = new Array("./Interpolation/spl_incr.html", "spl_incr.pro", "", " file_comments Given the arrays X and Y which tabulate a function with the X i AND Y i in ascending order and given an input value X2 the spl_incr function returns an interpolated value for the given values of X2 The interpolation method is based on cubic spline corrected in a way that interpolated values are also monotonically increasing param x1 in required An n elements at least 2 input vector that specifies the tabulate points in a strict ascending order param y1 in required f x y An n elements input vector that specifies the values of the tabulated function F Xi corresponding to Xi As f is supposed to be monotonically increasing y values must be monotonically increasing y can have equal consecutive values param x2 in required The input values for which the interpolated values are desired Its values must be strictly monotonically increasing param der2 param x returns y2: f x2 y2 Double precision array restrictions It might be possible that y2 i 1 y2 i has very small negative values amplitude smaller than 1 e 6 examples IDL n 100L IDL x dindgen n 2 IDL y abs randomn 0 n IDL y n 2:n 2 1 0 IDL y n n 3 0 IDL y n n 6:n n 6 5 0 IDL y total y cumulative double IDL x2 dindgen n 1 2 IDL n2 n_elements x2 IDL print min y 1:n 1 y 0:n 2 LT 0 IDL y2 spl_incr x y x2 IDL splot x y xstyle 1 ystyle 1 ysurx 25 petit 1 2 1 land IDL oplot x2 y2 color 100 IDL c y2 1:n2 1 y2 0:n2 2 IDL print min c LT 0 IDL print min c max ma ma IDL splot c xstyle 1 ystyle 1 yrange 01 05 ysurx 25 petit 1 2 2 noerase IDL oplot 0 n_elements c 0 0 linestyle 1 history Sebastien Masson smasson lodyc jussieu fr : May Dec 2005 version Id: spl_incr pro 371 2008 08 07 09:32:02Z pinsard FUNCTION pure_concave x1 x2 y1 y2 der2 x compile_opt idl2 strictarrsubs X n type xx double x double x1 double x2 double x1 f double x2 double x1 double y2 double y1 n der2 temporary f res xx n IF check_math GT 0 THEN BEGIN zero where abs res LT 1 e 10 IF zero 0 NE 1 THEN res zero 0 0d END res temporary res double y2 double y1 y1 IF array_equal sort res lindgen n_elements res NE 1 THEN stop RETURN res END param x1 in required An n elements at least 2 input vector that specifies the tabulate points in a strict ascending order param y1 in required f x y An n elements input vector that specifies the values of the tabulated function F Xi corresponding to Xi As f is supposed to be monotonically increasing y values must be monotonically increasing y can have equal consecutive values param x2 in required The input values for which the interpolated values are desired Its values must be strictly monotonically increasing param der2 param x FUNCTION pure_convex x1 x2 y1 y2 der2 x compile_opt idl2 strictarrsubs 1 1 X n type xx 1 0d double x double x1 double x2 double x1 f double x2 double x1 double y2 double y1 n der2 temporary f res xx n IF check_math GT 0 THEN BEGIN zero where abs res LT 1 e 10 IF zero 0 NE 1 THEN res zero 0 0d END res 1 0d temporary res res temporary res y2 y1 y1 IF array_equal sort res lindgen n_elements res NE 1 THEN stop RETURN res END param x param y param x2 keyword YP0 The first derivative of the interpolating function at the point X0 If YP0 is omitted the second derivative at the boundary is set to zero resulting in a natural spline keyword YPN_1 The first derivative of the interpolating function at the point Xn 1 If YPN_1 is omitted the second derivative at the boundary is set to zero resulting in a natural spline FUNCTION spl_incr x y x2 YP0 yp0 YPN_1 ypn_1 compile_opt idl2 strictarrsubs check and initialization nx n_elements x ny n_elements y nx2 n_elements x2 x must have at least 2 elements IF nx LT 2 THEN stop y must have the same number of elements than x IF nx NE ny THEN stop x be monotonically increasing IF min x 1:nx 1 x 0:nx 2 LE 0 THEN stop x2 be monotonically increasing IF N_ELEMENTS X2 GE 2 THEN IF min x2 1:nx2 1 x2 0:nx2 2 LE 0 THEN stop y be monotonically increasing IF min y 1:ny 1 y 0:ny 2 LT 0 THEN stop first check: check if two consecutive values are equal bad where y 1:ny 1 y 0:ny 2 EQ 0 cntbad IF cntbad NE 0 THEN BEGIN define the results: y2 y2 dblarr nx2 define xinx2: see help of value_locate if xinx2 i eq 1 : x bad i x2 nx2 1 else : x2 xinx2 i x2 nx2 1 else : x2 xinx2 i we have middle pieces for which we force yp0 0 0d and ypn_1 0 0d IF cntbad GT 1 THEN BEGIN we take care of the piece located between bad ib 1 and bad ib FOR ib 1 cntbad 1 DO BEGIN if there is x2 values smaller that x bad ib then the x2 values located between bad ib 1 and bad ib are xinx2 ib 1 1:xinx2 ib IF xinx2 ib NE 1 THEN begin y2 xinx2 ib 1 1 0 y i 1 y i 2 y reach its minimum value between x i and x i 1 0 y i 1 0 y i we do a first selection by looking for those points loc lindgen nx 1 maybebad where yscd loc LE 0 0d AND yscd loc 1 GE 0 0d cntbad IF cntbad NE 0 THEN BEGIN mbbloc loc maybebad aaa yscd mbbloc 1 yscd mbbloc 6 0d x mbbloc 1 x mbbloc bbb 0 5d yscd mbbloc ccc yifrst mbbloc ddd y mbbloc definitive selection: y can become negative if and only if 2b 2 4 3a c 0 y can become negative if and only if b 2 3a c 0 delta bbb bbb 3 0d aaa ccc bad where delta GT 0 cntbad IF cntbad NE 0 THEN BEGIN delta delta bad aaa aaa bad bbb bbb bad ccc ccc bad ddd ddd bad bad maybebad bad define xinx2_1: see help of value_locate if xinx2_1 i eq 1 : x bad i x2 nx2 1 else : x2 xinx2_1 i x2 nx2 1 else : x2 xinx2_2 i y bad ib 1 then we cannot applay the method we want to apply we use then convex concave case by changing by hand the value of yinfl and xinfl IF yzero GT y bad ib 1 THEN BEGIN yinfl 0 5d y bad ib 1 y bad ib xinfl 0 5d x bad ib 1 x bad ib GOTO convexconcave ENDIF define xinx2_3: see help of value_locate if xinx2_3 ib eq 1 : x bad ib xzero x2 nx2 1 else : x2 xinx2_3 we use then convex concave case by changing by hand the value of yinfl and xinfl IF yzero lt y bad ib THEN BEGIN yinfl 0 5d y bad ib 1 y bad ib xinfl 0 5d x bad ib 1 x bad ib GOTO convexconcave ENDIF define xinx2_3: see help of value_locate if xinx2_3 ib eq 1 : x bad ib xzero x2 nx2 1 else : x2 xinx2_3 x2 nx2 1 else : x2 xinx2_3 x bad ib xzero x2 xinx3_2 1 xinx2_3 value_locate x2 x bad ib xinfl IF xinx2_3 ge xinx2_1 ib 1 THEN BEGIN y2 xinx2_1 ib 1:xinx2_3 pure_convex x bad ib x bad ib xinfl y bad ib yinfl yifrst bad ib x2 xinx2_1 ib 1:xinx2_3 ENDIF IF xinx2_2 ib GE xinx2_3 1 THEN BEGIN y2 xinx2_3 1:xinx2_2 ib pure_concave x bad ib xinfl x bad ib 1 yinfl y bad ib 1 yifrst bad ib 1 x2 xinx2_3 1:xinx2_2 ib ENDIF END ENDCASE END ENDCASE ENDIF ENDFOR ENDIF ENDIF RETURN y2 END"); a[74] = new Array("./Interpolation/spl_keep_mean.html", "spl_keep_mean.pro", "", " file_comments Given the arrays X and Y which tabulate a function with the X i AND Y i in ascending order and given an input value X2 the spl_incr function returns an interpolated value for the given values of X2 The interpolation method is based on cubic spline corrected in a way that integral of the interpolated values is the same as the integral of the input values for example to build daily data from monthly mean and keep the monthly mean of the computed daily data equal to the original values param x in required An n elements at least 2 input vector that specifies the tabulate points in a strict ascending order param yin in required type array an array with one element less than x y i represents the mean value between x i and x i 1 if GE0 is activated y must have positive values param x2 in required The input values for which the interpolated values are desired Its values must be strictly monotonically increasing keyword GE0 to force that y2 is always GE than 0 In that case y must also be GE than 0 keyword YP0 The first derivative of the interpolating function at the point X0 If YP0 is omitted the second derivative at the boundary is set to zero resulting in a natural spline keyword YPN_1 The first derivative of the interpolating function at the point Xn 1 If YPN_1 is omitted the second derivative at the boundary is set to zero resulting in a natural spline returns y2: the mean value between two consecutive values of x2 This array has one element less than y2 y2 has double precision restrictions It might be possible that y2 has very small negative values amplitude smaller than 1 e 6 examples 12 monthly values of precipitations into daily values: IDL yr1 1990 IDL yr2 1992 IDL nyr yr2 yr1 1 IDL n1 12 nyr 1 IDL x julday 1 findgen n1 replicate 1 n1 IDL replicate yr1 n1 fltarr n1 IDL n2 365 nyr total leapyr yr1 indgen nyr 1 IDL x2 julday replicate 1 n2 1 findgen n2 IDL replicate yr1 n2 fltarr n2 IDL y abs randomn 0 n1 1 IDL y2 spl_keep_mean x y x2 ge0 IDL print min x max ma ma IDL print min x2 max ma ma IDL print vairdate min x max ma ma IDL print total y x 1:n1 1 x 0:n1 2 IDL print total y2 x2 1:n2 1 x2 0:n2 2 history Sebastien Masson smasson lodyc jussieu fr : May 2005 version Id: spl_keep_mean pro 372 2008 08 08 12:31:53Z pinsard FUNCTION spl_keep_mean x yin x2 YP0 yp0 YPN_1 ypn_1 GE0 ge0 compile_opt idl2 strictarrsubs check and initialization nx n_elements x ny n_elements yin nx2 n_elements x2 x must have at least 2 elements IF nx LT 2 THEN stop x2 must have at least 2 elements IF nx2 LT 2 THEN stop x be monotonically increasing IF min x 1:nx 1 x 0:nx 2 LE 0 THEN stop x2 be monotonically increasing IF min x2 1:nx2 1 x2 0:nx2 2 LE 0 THEN stop compute the integral of y if spl_keep_mean is called by the user and not by itself we must compute the integral of y yin must have one element less than x IF nx NE ny 1 THEN stop y double yin double x 1:nx 1 x 0:nx 2 y 0 0d temporary y y total temporary y cumulative double compute the spline interpolation IF keyword_set ge0 THEN BEGIN if the want that the interpolated values are always 0 we must have yin 0 0d IF min yin LT 0 THEN stop call spl_incr y2 spl_incr x temporary y x2 yp0 yp0 ypn_1 ypn_1 ENDIF ELSE BEGIN yscd spl_init x y yp0 yp0 ypn_1 ypn_1 double y2 spl_interp x y temporary yscd x2 double ENDELSE Compute the derivative of y yfrst y2 1:nx2 1 y2 0:nx2 2 x2 1:nx2 1 x2 0:nx2 2 it can happen that we have very small negative values 1 e 6 for ex yfrst 0 0d temporary yfrst RETURN yfrst END"); a[75] = new Array("./Interpolation/square2quadrilateral.html", "square2quadrilateral.pro", "", " file_comments warm or map a unit square onto an arbitrary quadrilateral according to the 4 point correspondences: 0 0 x0 y0 1 0 x1 y1 1 1 x2 y2 0 1 x3 y3 The mapping is done using perspective transformation which preserve lines in all orientations and permit quadrilateral to quadrilateral mappings see ref below categories Picture Grid param x0in in required param y0in in required param x1in in required param y1in in required param x2in in required param y2in in required param x3in in required param y3in in required the coordinates of the quadrilateral see above for correspondence with the unit square Can be scalar or array x0 y0 x1 y1 x2 y2 and x3 y3 are given in the anticlockwise order param xxin in optional first coordinates of the point s for which we want to do the mapping param yyin in optional second coordinates of the point s for which we want to do the mapping keyword DOUBLE type salar 0 or 1 default 0 activate to perform double precision computation returns 2 n array: the new coordinates xout yout of the xin yin point s after mapping If xin is a scalar then n is equal to the number of elements of x0 If xin is an array then n is equal to the number of elements of xin If xin and yin are omitted square2quadrilateral returns the matrix A which is used for the inverse transformation restrictions I think degenerated quadrilateral e g flat of twisted is not work This has to be tested examples IDL splot 0 5 0 3 nodata xstyle 1 ystyle 1 IDL tracegrille findgen 11 1 findgen 11 1 color indgen 12 20 IDL xin findgen 11 1 replicate 1 11 IDL yin replicate 1 11 findgen 11 1 IDL out square2quadrilateral 2 1 3 0 5 1 2 3 xin yin IDL tracegrille reform out 0 11 11 reform out 1 11 11 color indgen 12 20 history Sebastien Masson smasson lodyc jussieu fr August 2003 Based on Digital Image Warping by G Wolberg IEEE Computer Society Press Los Alamitos California Chapter 3 see p 52 56 version Id: square2quadrilateral pro 372 2008 08 08 12:31:53Z pinsard FUNCTION square2quadrilateral x0in y0in x1in y1in x2in y2in x3in y3in xxin yyin DOUBLE double Warning wrong definition of x2 y2 and x3 y3 at the bottom of page 54 of Wolberg s book see figure 3 7 page 56 for the good definition compile_opt idl2 strictarrsubs IF keyword_set double THEN BEGIN x0 double x0in x1 double x1in x2 double x2in x3 double x3in y0 double y0in y1 double y1in y2 double y2in y3 double y3in IF arg_present xxin THEN BEGIN xin double xxin yin double yyin ENDIF ENDIF ELSE BEGIN x0 float x0in x1 float x1in x2 float x2in x3 float x3in y0 float y0in y1 float y1in y2 float y2in y3 float y3in IF arg_present xxin THEN BEGIN xin float xxin yin float yyin ENDIF ENDELSE IF keyword_set double THEN a dblarr 8 n_elements x0 ELSE a fltarr 8 n_elements x0 delx3 x0 x1 x2 x3 dely3 y0 y1 y2 y3 affinemap where delx3 EQ 0 AND dely3 EQ 0 IF affinemap 0 NE 1 THEN BEGIN xx0 x0 affinemap xx1 x1 affinemap xx2 x2 affinemap yy0 y0 affinemap yy1 y1 affinemap yy2 y2 affinemap a 0 affinemap xx1 xx0 a 1 affinemap xx2 xx1 a 2 affinemap xx0 a 3 affinemap yy1 yy0 a 4 affinemap yy2 yy1 a 5 affinemap yy0 a 6 affinemap 0 a 7 affinemap 0 ENDIF projectivemap where delx3 NE 0 OR dely3 NE 0 IF projectivemap 0 NE 1 THEN BEGIN xx0 x0 projectivemap xx1 x1 projectivemap xx2 x2 projectivemap xx3 x3 projectivemap yy0 y0 projectivemap yy1 y1 projectivemap yy2 y2 projectivemap yy3 y3 projectivemap delx1 xx1 xx2 dely1 yy1 yy2 delx2 xx3 xx2 dely2 yy3 yy2 delx3 delx3 projectivemap dely3 dely3 projectivemap div delx1 dely2 dely1 delx2 zero where div EQ 0 IF zero 0 NE 1 THEN BEGIN stop ENDIF a13 delx3 dely2 dely3 delx2 div a23 delx1 dely3 dely1 delx3 div a 0 projectivemap xx1 xx0 a13 xx1 a 1 projectivemap xx3 xx0 a23 xx3 a 2 projectivemap xx0 a 3 projectivemap yy1 yy0 a13 yy1 a 4 projectivemap yy3 yy0 a23 yy3 a 5 projectivemap yy0 a 6 projectivemap a13 a 7 projectivemap a23 ENDIF IF NOT arg_present xxin THEN return a IF n_elements xin EQ 1 THEN BEGIN xin replicate xin n_elements x0 yin replicate yin n_elements x0 ENDIF IF keyword_set double THEN res dblarr 2 n_elements xin ELSE res fltarr 2 n_elements xin IF n_elements x0 EQ 1 THEN BEGIN div a 6 xin a 7 yin 1 zero where div EQ 0 IF zero 0 NE 1 THEN BEGIN stop ENDIF res 0 a 0 xin a 1 yin a 2 div res 1 a 3 xin a 4 yin a 5 div ENDIF ELSE BEGIN div a 6 xin a 7 yin 1 zero where div EQ 0 IF zero 0 NE 1 THEN BEGIN stop ENDIF res 0 a 0 xin a 1 yin a 2 div res 1 a 3 xin a 4 yin a 5 div ENDELSE RETURN res END"); a[76] = new Array("./Matrix/cmapply.html", "cmapply.pro", "", " file_comments Utility function adapted from CMPRODUCT param X version Id: cmapply pro 325 2007 12 06 10:04:53Z pinsard todo seb FUNCTION cmapply_product x compile_opt idl2 strictarrsubs sz size x n sz 1 while n GT 1 do begin if n mod 2 EQ 1 then x 0 x 0 x n 1 n2 floor n 2 x x 0:n2 1 x n2: n n2 endwhile return reform x 0 overwrite end file_comments cmapply_redim : Utility function used to collect collaped dimensions param newarr param dimapply param dimkeep param nkeep param totcol param totkeep todo seb PRO cmapply_redim newarr dimapply dimkeep nkeep totcol totkeep compile_opt idl2 strictarrsubs sz size newarr First task: rearrange dimensions so that the dimensions that are kept ie uncollapsed are at the back dimkeep where histogram dimapply min 1 max sz 0 ne 1 nkeep if nkeep EQ 0 then return newarr transpose temporary newarr dimapply 1 dimkeep totcol is the total number of collapsed elements totcol sz dimapply 0 for i 1 n_elements dimapply 1 do totcol totcol sz dimapply i totkeep sz dimkeep 0 1 for i 1 n_elements dimkeep 1 do totkeep totkeep sz dimkeep i 1 this new array has two dimensions: the first all elements that will be collapsed the second all dimensions that will be preserved the ordering is so that all elements to be collapsed are adjacent in memory newarr reform newarr totcol totkeep overwrite end Main function file_comments Applies a function to specified dimensions of an array Description: CMAPPLY will apply one of a few select functions to specified dimensions of an array Unlike some IDL functions you do have a choice of which dimensions that are to be collapsed by this function Iterative loops are avoided where possible for performance reasons The possible functions are: and number of loop iterations: Performs a sum as in TOTAL number of collapsed dimensions AND Finds LOGICAL AND not bitwise same OR Finds LOGICAL OR not bitwise same Performs a product LOG_2 no of collapsed elts MIN Finds the minimum value smaller of no of collapsed MAX Finds the maximum value or output elements USER Applies user defined function no of output elements It is possible to perform user defined operations arrays using CMAPPLY The OP parameter is set to USER:FUNCTNAME where FUNCTNAME is the name of a user defined function The user defined function should be defined such that it accepts a single parameter a vector and returns a single scalar value Here is a prototype for the function definition: FUNCTION FUNCTNAME x KEYWORD1 key1 scalar function of x or keywords RETURN scalar END The function may accept keywords Keyword values are passed in to CMAPPLY through the FUNCTARGS keywords parameter and passed to the user function via the _EXTRA mechanism Thus while the definition of the user function is highly constrained in the number of positional parameters there is absolute freedom in passing keyword parameters It s worth noting however that the implementation of user defined functions is not particularly optimized for speed Users are encouraged to implement their own array if the number of output elements is large categories Array param OP in required type string The operation to perform as a string May be upper or lower case If a user defined operation is to be passed then OP is of the form USER:FUNCTNAME where FUNCTNAME is the name of the user defined function param ARRAY in required type array An array of values to be operated on Must not be of type STRING 7 or STRUCTURE 8 param dimapply in optional default 1 ie first dimension type array An array of dimensions that are to be collapsed where the first dimension starts with 1 ie same convention as IDL function TOTAL Whereas TOTAL only allows one dimension to be added you can specify multiple dimensions to CMAPPLY Order does not matter since all operations are associative and transitive NOTE: the dimensions refer to the input array not the output array IDL allows a maximum of 8 dimensions keyword DOUBLE default not set Set this if you wish the internal computations to be done in double precision if necessary If ARRAY is double precision real or complex then DOUBLE 1 is implied keyword TYPE default same as input type Set this to the IDL code of the desired output type refer to documentation of SIZE Internal results will be rounded to the nearest integer if the output type is an integer type keyword FUNCTARGS If OP is USER: then the contents of this keyword are passed to the user function using the _EXTRA mechanism This way you can pass additional data to your user supplied function via keywords without using common blocks DEFAULT: undefined i e no keywords passed by _EXTRA returns An array of the required TYPE whose elements are the result of the requested operation Depending on the operation and number of elements in the input array the result may be vulnerable to overflow or underflow examples First example: Shows how cmapply can be used to total the second dimension of the array called IN This is equivalent to OUT TOTAL IN 2 IDL IN INDGEN 5 5 IDL OUT CMAPPLY IN 2 IDL HELP OUT OUT INT Array 5 Second example: Input is assumed to be an 5x100 array of 1 s and 0 s indicating the status of 5 detectors at 100 points in time The desired output is an array of 100 values indicating whether all 5 detectors are on 1 at one time Use the logical AND operation IDL IN detector_status 5x100 array IDL OUT CMAPPLY AND IN 1 collapses 1st dimension IDL HELP OUT OUT BYTE Array 100 note that MIN could also have been used in this particular case although there would have been more loop iterations Third example: Shows sum over first and third dimensions in an array with dimensions 4x4x4: IDL IN INDGEN 4 4 4 IDL OUT CMAPPLY IN 1 3 IDL PRINT OUT 408 472 536 600 Fourth example: A user function MEDIAN is used: IDL IN RANDOMN SEED 10 10 5 IDL OUT CMAPPLY USER:MEDIAN IN 3 IDL HELP OUT OUT FLOAT Array 10 10 OUT i j is the median value of IN i j history Mar 1998 Written CM Changed usage message to not bomb 24 Mar 2000 CM Significant rewrite for MIN and MAX inspired by Todd Clements FOR loop indices are now type LONG copying terms are liberalized CM 22 Aug 2000 More efficient MAX MIN inspired by Alex Schuster CM 25 Jan 2002 Make new MAX MIN actually work with 3d arrays CM 08 Feb 2002 Add user defined functions ON_ERROR CM 09 Feb 2002 Correct bug in MAX MIN initialization of RESULT CM 05 Dec 2002 Author: Craig B Markwardt NASA GSFC Code 662 Greenbelt MD 20770 craigm lheamail gsfc nasa gov version Id: cmapply pro 325 2007 12 06 10:04:53Z pinsard FUNCTION cmapply op array dimapply DOUBLE dbl TYPE type FUNCTARGS functargs NOCATCH nocatch compile_opt idl2 strictarrsubs if n_params LT 2 then begin message USAGE: XX CMAPPLY OP ARRAY 2 info message where OP is AND OR MIN MAX info return 1L endif if NOT keyword_set nocatch then on_error 2 else on_error 0 Parameter checking 1 the dimensions of the array sz size array if sz 0 EQ 0 then message ERROR: ARRAY must be an array 2 The type of the array if sz sz 0 1 EQ 0 OR sz sz 0 1 EQ 7 OR sz sz 0 1 EQ 8 then message ERROR: Cannot apply to UNDEFINED STRING or STRUCTURE if n_elements type EQ 0 then type sz sz 0 1 3 The type of the operation szop size op if szop szop 0 1 NE 7 then message ERROR: operation OP was not a string 4 The dimensions to apply default is to apply to first dim if n_params EQ 2 then dimapply 1 dimapply dimapply dimapply dimapply sort dimapply Sort in ascending order napply n_elements dimapply 5 Use double precision if requested or if needed if n_elements dbl EQ 0 then begin dbl 0 if type EQ 5 OR type EQ 9 then dbl 1 endif newop strupcase op newarr array newarr reform newarr sz 1:sz 0 overwrite case 1 of Addition newop EQ : begin for i 0L napply 1 do begin newarr total temporary newarr dimapply i i double dbl endfor end Multiplication newop EQ : begin Multiplication by summation of logarithms cmapply_redim newarr dimapply dimkeep nkeep totcol totkeep if nkeep EQ 0 then begin newarr reform newarr n_elements newarr 1 overwrite return cmapply_product newarr 0 endif result cmapply_product newarr result reform result sz dimkeep 1 overwrite return result end LOGICAL AND or OR newop EQ AND OR newop EQ OR : begin newarr temporary newarr NE 0 totelt 1L for i 0L napply 1 do begin newarr total temporary newarr dimapply i i totelt totelt sz dimapply i endfor if newop EQ AND then return round newarr EQ totelt if newop EQ OR then return round newarr NE 0 end Operations requiring a little more attention over how to iterate newop EQ MAX OR newop EQ MIN : begin cmapply_redim newarr dimapply dimkeep nkeep totcol totkeep if nkeep EQ 0 then begin if newop EQ MAX then return max newarr if newop EQ MIN then return min newarr endif Next task: create result array result make_array totkeep type type Now either iterate over the number of output elements or the number of collapsed elements whichever is smaller if totcol LT totkeep then begin Iterate over the number of collapsed elements result 0 reform newarr 0 totkeep overwrite case newop of MAX : for i 1L totcol 1 do result 0 result newarr i MIN : for i 1L totcol 1 do result 0 result newarr i endcase endif else begin Iterate over the number of output elements case newop of MAX : for i 0L totkeep 1 do result i max newarr i MIN : for i 0L totkeep 1 do result i min newarr i endcase endelse result reform result sz dimkeep 1 overwrite return result end User function strmid newop 0 4 EQ USER : begin functname strmid newop 5 if functname EQ then message ERROR: newop is not a valid operation cmapply_redim newarr dimapply dimkeep nkeep totcol totkeep if nkeep EQ 0 then begin if n_elements functargs GT 0 then return call_function functname newarr _EXTRA functargs return call_function functname newarr endif Next task: create result array result make_array totkeep type type Iterate over the number of output elements if n_elements functargs GT 0 then begin for i 0L totkeep 1 do result i call_function functname newarr i _EXTRA functargs endif else begin for i 0L totkeep 1 do result i call_function functname newarr i endelse result reform result sz dimkeep 1 overwrite return result end endcase newsz size newarr if type EQ newsz newsz 0 1 then return newarr Cast the result into the desired type if necessary castfns UNDEF BYTE FIX LONG FLOAT DOUBLE COMPLEX UNDEF UNDEF DCOMPLEX if type GE 1 AND type LE 3 then return call_function castfns type round newarr else return call_function castfns type newarr end"); a[77] = new Array("./Matrix/cmset_op.html", "cmset_op.pro", "", " hidden file_comments Simplified version of CMSET_OP_UNIQ which sorts and takes the first value whatever that may mean todo seb FUNCTION cmset_op_uniq a compile_opt idl2 strictarrsubs if n_elements a LE 1 then return 0L ii sort a b a ii wh where b NE shift b 1L ct if ct GT 0 then return ii wh return 0L end file_comments Performs an AND OR or XOR operation between two sets Description: SET_OP performs three common operations between two sets The three supported functions of OP are: OP Meaning AND to find the intersection of A and B OR to find the union of A and B XOR to find the those elements who are members of A or B but not both Sets as defined here is one dimensional array composed of numeric or string types Comparisons of equality between elements are done using the IDL EQ operator The complements of either set can be taken as well by using the NOT1 and NOT2 keywords For example it may be desirable to find the elements in A but not B or B but not A they are different The following IDL expressions achieve each of those effects: SET CMSET_OP A AND NOT2 B A but not B SET CMSET_OP NOT1 A AND B B but not A Note the distinction between NOT1 and NOT2 NOT1 refers to the first set A and NOT2 refers to the second B Their ordered placement in the calling sequence is entirely optional but the above ordering makes the logical meaning explicit NOT1 and NOT2 can only be set for the AND operator and never simultaneously This is because the results of an operation with OR or XOR and any combination of NOTs or with AND and both NOTs formally cannot produce a defined result The implementation depends on the type of operands For integer types a fast technique using HISTOGRAM is used However this algorithm becomes inefficient when the dynamic range in the data is large For those cases and for other data types a technique based on SORT is used Thus the compute time should scale roughly as A B ALOG A B or better rather than A B for the brute force approach For large arrays this is a significant benefit categories Array param A in required The two sets to be operated on A one dimensional array of either numeric or string type A and B must be of the same type Empty sets are permitted and are either represented as an undefined variable or by setting EMPTY1 or EMPTY2 param B in required See A param OP0 in required type string a string the operation to be performed Must be one of AND OR or XOR lower or mixed case is permitted Other operations will cause an error message to be produced keyword NOT1 If set and OP is AND then the complement of A for NOT1 or B for NOT2 will be used in the operation NOT1 and NOT2 cannot be set simultaneously keyword NOT2 See NOT1 keyword EMPTY1 If set then A for EMPTY1 or B for EMPTY2 are assumed to be the empty set The actual values passed as A or B are then ignored keyword EMPTY2 See EMPTY1 keyword INDEX if set then return a list of indexes instead of the array values themselves The slower set operations are always performed in this case The indexes refer to the combined array A B To clarify in the following call: I CMSET_OP INDEX returned values from 0 to NA 1 refer to A I and values from NA to NA NB 1 refer to B I NA keyword COUNT upon return the number of elements in the result set This is only important when the result set is the empty set in which case COUNT is set to zero returns The resulting set as a one dimensional array The set may be represented by either an array of data values default or an array of indexes if INDEX is set Duplicate elements if any are removed and element order may not be preserved The empty set is represented as a return value of 1L and COUNT is set to zero Note that the only way to recognize the empty set is to examine COUNT SEE ALSO: SET_UTILS PRO by RSI history Written CM 23 Feb 2000 Added empty set capability CM 25 Feb 2000 Documentation clarification CM 02 Mar 2000 Incompatible but more consistent reworking of EMPTY keywords CM 04 Mar 2000 Minor documentation clarifications CM 26 Mar 2000 Corrected bug in empty_arg special case CM 06 Apr 2000 Add INDEX keyword CM 31 Jul 2000 Clarify INDEX keyword documentation CM 06 Sep 2000 Made INDEX keyword always force SLOW_SET_OP CM 06 Sep 2000 Added CMSET_OP_UNIQ and ability to select FIRST_UNIQUE or LAST_UNIQUE values CM 18 Sep 2000 Removed FIRST_UNIQUE and LAST_UNIQUE and streamlined CMSET_OP_UNIQ until problems with SORT can be understood CM 20 Sep 2000 thanks to Ben Tupper Still trying to get documentation of INDEX and NOT right CM 28 Sep 2000 no code changes Correct bug for AND case when input sets A and B each only have one unique value and the values are equal CM 04 Mar 2004 thanks to James B jbattat at cfa dot harvard dot edu Add support for the cases where the input data types are mixed but still compatible also attempt to return the same data type that was passed in CM 05 Feb 2005 Fix bug in type checking thanks to marit CM 10 Dec 2005 Work around a stupidity in the built in IDL HISTOGRAM routine which tries to help you by restricting the MIN MAX to the range of the input variable thanks to Will Maddox CM 16 Jan 2006 Author: Craig B Markwardt NASA GSFC Code 662 Greenbelt MD 20770 craigm lheamail gsfc nasa gov version Id: cmset_op pro 372 2008 08 08 12:31:53Z pinsard examples Utility function similar to UNIQ but allowing choice of taking first or last unique element or non unique elements Unfortunately this doesn t work because of implementation dependent versions of the SORT function function cmset_op_uniq a first first non non count ct sort sortit if n_elements a LE 1 then return 0L sh 2L keyword_set first 1L 2L keyword_set non 1 if keyword_set sortit then begin Sort it manually ii sort a b a ii if keyword_set non then wh where b EQ shift b sh ct else wh where b NE shift b sh ct if ct GT 0 then return ii wh endif else begin Use the user s values directly if keyword_set non then wh where a EQ shift a sh ct else wh where a NE shift a sh ct if ct GT 0 then return wh endelse if keyword_set first then return 0L else return n_elements a 1 end Simplified version of CMSET_OP_UNIQ which sorts and takes the first value whatever that may mean FUNCTION cmset_op a op0 b NOT1 not1 NOT2 not2 COUNT count EMPTY1 empty1 EMPTY2 empty2 MAXARRAY ma INDEX index compile_opt idl2 strictarrsubs on_error 2 return on error count 0L index0 1L Histogram technique is used for array sizes max2 nbins maxx minn 1 if maxx minn GT floor ma 0 then goto SLOW_SET_OP Work around a stupidity in the built in IDL HISTOGRAM routine if tp1 EQ 2 OR tp2 EQ 2 AND minn LT 32768 OR maxx GT 32767 then goto SLOW_SET_OP Following operations create a histogram of the integer values ha histogram a min minn max maxx 1 hb histogram b min minn max maxx 1 Compute NOT cases if keyword_set not1 then ha 1b ha if keyword_set not2 then hb 1b hb case op of Boolean operations AND : mask temporary ha AND temporary hb OR : mask temporary ha OR temporary hb XOR : mask temporary ha XOR temporary hb endcase wh where temporary mask count if count EQ 0 then return 1L result temporary wh minn if tp1 NE tp2 then return result szr size result tpr szr szr 0 1 Cast to the original type if necessary if tpr NE tp1 then begin fresult make_array n_elements result type tp1 fresult 0 temporary result result temporary fresult endif return result endelse return 1L DEFAULT CASE end Here is how I did the INDEX stuff with fast histogramming It works but is complicated so I forced it to go to SLOW_SET_OP ha histogram a min minn max maxx reverse ra 1 rr ra 0:nbins mask rr NE rr 1: ra ra rr mask 1L mask hb histogram b min minn max maxx reverse rb 1 rr rb 0:nbins mask rr NE rr 1: rb rb rr mask 1L mask AND OR XOR NOT masking here ra ra wh rb rb wh return ra ra GE 0 rb n1 ra LT 0 is last ra right "); a[78] = new Array("./Matrix/different.html", "different.pro", "", " file_comments find the different elements of 2 matrixes of positive whole numbers see also union and inter categories Calculation param a in required arrays of positive integers which need not be sorted Duplicate elements are ignored as they have no effect on the result param b in required see a returns an array containing the set of values in only a The empty set is denoted by an array with the first element equal to 1 restrictions These functions will not be efficient on sparse sets with wide ranges as they trade memory for efficiency The HISTOGRAM function is used which creates arrays of size equal to the range of the resulting set examples IDL a 2 4 6 8 IDL b 6 1 3 2 IDL res different a b 4 8 Right because 4 and 8 are in a but not in b IDL res different b a IDL print res 1 3 Right because 1 and 3 are in b but not in a history version Id: different pro 373 2008 08 08 14:11:31Z pinsard FUNCTION different a b compile_opt idl2 strictarrsubs a and not b elements in A but not in B mina Min a Max maxa minb Min b Max maxb IF minb GT maxa OR maxb LT mina THEN RETURN a No intersection r Where Histogram a Min mina Max maxa 1 Histogram b Min mina Max maxa count IF count eq 0 THEN RETURN 1 ELSE RETURN r mina END"); a[79] = new Array("./Matrix/extrac2.html", "extrac2.pro", "", " file_comments extraction of subdomains of matrices Even if the subdomain is pierced see the example By default IDL can make extractions of subdomain: IDL a indgen 5 5 IDL print a 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 IDL print a 0 2 3 15 17 IDL print a 0 2 0 2 5 7 10 12 15 17 20 22 but IDL print a 0 2 3 4 15 22 while IDL print extrac2 a 0 2 3 4 15 17 20 22 categories Utilities param array in required a 1d 2d 3d or 4d input array param index1 in required can have 2 forms: 1 a vector containing indexes of lines we want to keep 2 the string if we want to keep all lines param index2 in required the same thing that index1 but for dim 2 param index3 in required the same thing that index1 but for dim 3 param index4 in required the same thing that index1 but for dim 4 returns a matrix 1d 2d 3d or 4d extract from input array 1 in case of mistake restrictions examples I have a 2d matrix named A I want extract a small intersection matrix 2d of the line 2 3 and 7 and of the column 0 and 1: IDL res extrac2 A 2 3 7 0 1 other ex: IDL a a b c d e f g h i IDL print a a b c d e f g h i IDL print extrac2 a 0 2 0 2 a c g i history Sebastien Masson smasson lodyc jussieu fr 12 1 1999 29 4 1999: correction of a bug and complement of the heading version Id: extrac2 pro 373 2008 08 08 14:11:31Z pinsard FUNCTION extrac2 array index1 index2 index3 index4 compile_opt idl2 strictarrsubs taille size array test of the number of parameters and of the nature of the index for THE case x if n_params NE taille 0 1 THEN return report we need as many indexes as the number of dimensions of the input array IF n_params GE 5 THEN BEGIN if size index4 type EQ 7 then index4 lindgen taille 4 ELSE index4 long index4 nt n_elements index4 ENDIF IF n_params GE 4 THEN BEGIN if size index3 type EQ 7 then index3 lindgen taille 3 ELSE index3 long index3 nz n_elements index3 ENDIF IF n_params GE 3 THEN BEGIN if size index2 type EQ 7 then index2 lindgen taille 2 ELSE index2 long index2 ny n_elements index2 ENDIF IF n_params GE 2 THEN BEGIN if size index1 type EQ 7 then index1 lindgen taille 1 ELSE index1 long index1 nx n_elements index1 ENDIF construction of an array of indexes and of results following the size of array case taille 0 of 1:res array index1 2:BEGIN index index1 replicate 1 ny taille 1 replicate 1 nx index2 res array index END 3:BEGIN index index1 replicate 1 ny taille 1 replicate 1 nx index2 index temporary index replicate 1 nz taille 1 taille 2 replicate 1 nx ny index3 res array reform index nx ny nz over END 4:BEGIN index index1 replicate 1 ny taille 1 replicate 1 nx index2 index temporary index replicate 1 nz taille 1 taille 2 replicate 1 nx ny index3 index temporary index replicate 1 nt taille 1 taille 2 taille 3 replicate 1 nx ny nz index4 res array reform index nx ny nz nz over END endcase return res end"); a[80] = new Array("./Matrix/inter.html", "inter.pro", "", " file_comments find the intersection between 2 matrices of whole numbers see also different and union categories Calculation param a in required arrays of positive integers which need not to be sorted Duplicate elements are ignored as they have no effect on the result param b in required see a returns an array containing the set of values in both a and b The empty set is denoted by an array with the first element equal to 1 restrictions These functions will not be efficient on sparse sets with wide ranges as they trade memory for efficiency The HISTOGRAM function is used which creates arrays of size equal to the range of the resulting set examples IDL a 2 4 6 8 IDL b 6 1 3 2 IDL res inter a b 2 6 Right because 2 and 6 are in a and B history version Id: inter pro 378 2008 08 12 12:35:46Z pinsard FUNCTION inter a b compile_opt idl2 strictarrsubs case 1 of n_elements a EQ 0:return 1 n_elements b EQ 0:return 1 n_elements a EQ 1 AND n_elements b NE 1: if where b EQ a 0 0 EQ 1 then return 1 ELSE return a 0 n_elements b EQ 1 AND n_elements a NE 1: if where a EQ b 0 0 EQ 1 then return 1 ELSE return b 0 n_elements a EQ 1 AND n_elements b EQ 1: if where a 0 EQ b 0 0 EQ 1 then return 1 ELSE return a 0 ELSE: ENDCASE minab Min a Max maxa Min b Max maxb Only need intersection of ranges maxab maxa maxb If either set is empty or their ranges don t intersect: result NULL IF maxab LT minab OR maxab LT 0 THEN RETURN 1 r Where Histogram a Min minab Max maxab Histogram b Min minab Max maxab count IF count EQ 0 THEN RETURN 1 ELSE RETURN r minab END"); a[81] = new Array("./Matrix/make_selection.html", "make_selection.pro", "", " file_comments Convert an array of selected values to an index array that identifies the selected values in a list or data array categories tools param NAMES in required A list or array of values to choose from param SELNAMES in required A list of selected values keyword ONLY_VALID Return only indexes of found values Values not found are skipped Default is to return 1 index value for each SELNAME which is 1 if SELNAME is not contained in NAMES If ONLY_VALID is set the 1 values will be deleted and a value of 1 indicates that no SELNAME has been found at all keyword REQUIRED Normally MAKE_SELECTION will return indexes for all values that are found simply ignoring the selected values that are not in the NAMES array although an error message is displayed Set this keyword to return with 1 as soon as a selected value is not found keyword QUIET Suppress printing of the error message if a selected value is not found the error condition will still be set returns A long array with indexes to reference the selected values in the NAMES array restrictions If the NAMES array contains multiple entries of the same value only the index to the first entry will be returned A selection can contain multiple instances of the same value The index array will contain one entry per selected item See example below examples IDL names Alfred Anton Peter John Mary IDL index MAKE_SELECTION names Peter Mary IDL print index 2 4 IDL vals indgen 20 IDL index MAKE_SELECTION vals 9 5 8 7 7 8 9 IDL print index 9 1 8 7 7 8 9 IDL index MAKE_SELECTION vals 9 5 8 7 7 8 9 ONLY_VALID IDL print index 9 8 7 7 8 9 IDL index MAKE_SELECTION vals 9 5 8 7 7 8 9 REQUIRED IDL print index 1 IDL index MAKE_SELECTION vals 9 5 8 7 7 8 9 REQUIRED QUIET MAKE_SELECTION: Selected name not found in names array 5 IDL print index 1 history mgs 28 Aug 1998: VERSION 1 00 mgs 29 Aug 1998: changed behavior and added ONLY_VALID keyword Copyright C 1998 Martin Schultz Harvard University This software is provided as is without any warranty whatsoever It may be freely used copied or distributed for non commercial purposes This copyright notice must be kept with any copy of this software If this software shall be used commercially or sold as part of a larger package please contact the author to arrange payment Bugs and comments should be directed to mgs io harvard edu with subject IDL routine make_selection version Id: make_selection pro 372 2008 08 08 12:31:53Z pinsard FUNCTION make_selection names selnames ONLY_VALID only_valid REQUIRED required QUIET quiet compile_opt idl2 strictarrsubs return an index array with a number for each element in selnames that is found in names Set the REQUIRED keyword to return 1 if one element is not found otherwise 1 will only be returned if no element is found reset error state to 0 message reset quiet keyword_set quiet result 1L for i 0 n_elements selnames 1 do begin test where names eq selnames i result result test 0 if test 0 lt 0 then begin if keyword_set ONLY_VALID OR keyword_set REQUIRED then message Selected name not found in names array strtrim selnames i 2 CONT NOPRINT quiet if keyword_set required then return 1L endif endfor if n_elements result gt 1 then result result 1: if keyword_set only_valid then begin ind where result ge 0 if ind 0 ge 0 then result result ind else result 1L endif return result end"); a[82] = new Array("./Matrix/union.html", "union.pro", "", " file_comments find the union between 2 matrices of whole numbers see also different and inter categories Calculation param a in required arrays of positive integers which need not be sorted Duplicate elements are ignored as they have no effect on the result param b in required see a returns an array containing the set of values in a and b restrictions These functions will not be efficient on sparse sets with wide ranges as they trade memory for efficiency The HISTOGRAM function is used which creates arrays of size equal to the range of the resulting set examples IDL a 2 4 6 8 IDL b 6 1 3 2 IDL res union a b IDL print res 1 2 3 4 5 6 8 this is the list ao all elements in either sets history version Id: union pro 378 2008 08 12 12:35:46Z pinsard FUNCTION union a b compile_opt idl2 strictarrsubs IF a 0 LT 0 THEN RETURN b A union NULL a IF b 0 LT 0 THEN RETURN a B union NULL b RETURN Where Histogram a b OMin omin omin Return combined set END"); a[83] = new Array("./Matrix/zero_one.html", "zero_one.pro", "", " file_comments Send back a vector or a matrix constituted of 0 and 1 in alternation categories Matrix param n1 in required type integer number of elements in the first dimension param n2 in type integer number of elements in the second dimension examples IDL a zero_one 3 IDL help a A FLOAT Array 3 IDL print a 0 00000 1 00000 0 00000 IDL a zero_one 2 3 IDL help a A FLOAT Array 2 3 IDL print a 0 00000 1 00000 1 00000 0 00000 0 00000 1 00000 returns an array of n1 dimension or n1xn2 dimensions history Sebastien Masson smasson lodyc jussieu fr 1 12 98 version Id: zero_one pro 373 2008 08 08 14:11:31Z pinsard FUNCTION zero_one n1 n2 compile_opt idl2 strictarrsubs CASE N_PARAMS OF 1:return findgen n1 mod 2 2:BEGIN if fix n1 2 EQ n1 2 then BEGIN even number of columns res findgen n1 1 n2 mod 2 return res 0:n1 1 ENDIF ELSE return findgen n1 n2 mod 2 odd number of columns END else: return report bad number of arguments endcase end"); a[84] = new Array("./Obsolete/common.html", "common.pro", "", ""); a[85] = new Array("./Obsolete/congridseb.html", "congridseb.pro", "", " file_comments Used to avoid a bug in congrid in a old version of IDL Useless now examples old example: based on a old version of IDL 5 IDL print congrid 1 2 3 4 5 6 7 8 12 4 1 1 1 2 2 2 3 3 3 3 4 4 1 1 1 2 2 2 3 3 3 3 4 4 5 5 5 6 6 6 7 7 7 7 8 8 5 5 5 6 6 6 7 7 7 7 8 8 IDL print rebin 1 2 3 4 5 6 7 8 12 4 1 1 1 2 2 2 3 3 3 4 4 4 3 3 3 4 4 4 5 5 5 6 6 6 5 5 5 6 6 6 7 7 7 8 8 8 5 5 5 6 6 6 7 7 7 8 8 8 IDL print congridseb 1 2 3 4 5 6 7 8 12 4 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 5 5 5 6 6 6 7 7 7 8 8 8 obsolete param tableau in required 1d or 2d array param x in required first dimension of the result which must be a multiple of the first dimension of the input array param y in required second dimension of the result which must be a multiple of the second dimension of the input array returns an array which dimensions are x y history Sebastien Masson smasson lodyc jussieu fr 20 3 98 18 6 1999 supression d une horrible boucle version Id: congridseb pro 371 2008 08 07 09:32:02Z pinsard FUNCTION congridseb tableau x y compile_opt idl2 strictarrsubs CASE N_PARAMS OF 2: return congrid tableau x 3:return congrid tableau x y else: return report Bad number or arguments in the call of congridseb endcase end"); a[86] = new Array("./Obsolete/cp.html", "cp.pro", "", " file_comments copy files file_copy should be used instead obsolete param filenamein in required param filenameout in required keyword _EXTRA Used to pass keywords history June 2005: Sebastien Masson obsolete routine version Id: cp pro 327 2007 12 13 16:22:35Z pinsard PRO cp filenamein filenameout _EXTRA ex compile_opt idl2 strictarrsubs obsolete file_copy filenamein filenameout _extra ex RETURN END"); a[87] = new Array("./Obsolete/extrait.html", "extrait.pro", "", " file_comments extraction of subdomains of matrices Even if the subdomain is pierced see the example By default IDL can make extractions of subdomain: IDL a indgen 5 5 IDL print a 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 IDL print a 0 2 3 15 17 IDL print a 0 2 0 2 5 7 10 12 15 17 20 22 but IDL print a 0 2 3 4 15 22 while IDL print extrait a 0 2 3 4 15 17 20 22 you better use extrac2 obsolete categories Utilities param tab in required a 1d 2d 3d or 4d table param indicex in required can have 2 forms: 1 a vector containing indexes of lines we want to keep 2 the string if we want to keep all lines param indicey in required the same thing that indicex but for dim 2 param indicez in required the same thing that indicex but for dim 3 param indicet in required the same thing that indicex but for dim 4 returns a matrix 1d 2d 3d or 4d extract from tab 1 in case of mistake examples I have a dim 2 matrix named A I want extract a small intersection matrix 2d of the line 2 3 and 7 and of the column 0 and 1: IDL res extrait A 2 3 7 0 1 other ex: IDL print a a b c d e f g h i IDL print extrait a 0 2 0 2 a c g i history Sebastien Masson smasson lodyc jussieu fr 12 1 1999 29 4 1999: correction of a bug and complement of the heading version Id: extrait pro 378 2008 08 12 12:35:46Z pinsard FUNCTION extrait tab indicex indicey indicez indicet compile_opt idl2 strictarrsubs case n_params of 0:return extrac2 1:return extrac2 tab 2:return extrac2 tab indicex 3:return extrac2 tab indicex indicey 4:return extrac2 tab indicex indicey indicez 5:return extrac2 tab indicex indicey indicez indicet endcase end"); a[88] = new Array("./Obsolete/ficdate.html", "ficdate.pro", "", " file_comments sets s_fichier to name of the vairmer file associated to the given date in vairmer format yymmdd obsolete param vdate in date vairmer ex:930124 param dim in so ou vo par defaut so est choisi param nomexp in nom de l experience en trois lettres par defaut prefix returns le nom du fichier vairmer depuis iodir uses common examples IDL fic ficdate 930124 history Jerome Vialard jv lodyc jussieu fr 1 7 98 version Id: ficdate pro 371 2008 08 07 09:32:02Z pinsard function ficdate vdate dim nomexp compile_opt idl2 strictarrsubs obsolete common case n_params of 1: dim SO 2: dim strupcase dim 3: begin prefix nomexp dim strupcase dim end endcase constitution de l adresse ou aller chercher le fichier date yymmdd vdate sets month year and day to the good value : rien juldate vdate constitution de la date yymmdd case 1 of year lt 10: s_year 0 string format i1 year year ge 10 and year lt 100:s_year string format i2 year year ge 100:BEGIN year year 1900 if year LT 10 then s_year 0 string format i1 year ELSE s_year string format i2 year end endcase if month lt 10 then s_month 0 string format i1 month else s_month string format i2 month if day lt 10 then s_day 0 string format i1 day else s_day string format i2 day case dim of SO : begin case 1 of year eq 0 and month eq 0 : s_fichier iodir prefix O EX SO year eq 0 and month ne 0 and day eq 0 : s_fichier iodir prefix O SE SO s_month year ne 0 and month eq 0 : s_fichier iodir prefix O AN SO s_year year ne 0 and day eq 0 : s_fichier iodir prefix O MO SO s_year s_month else: s_fichier iodir prefix O SO s_year s_month s_day endcase end VO : begin case 1 of year eq 0 and month eq 0 : s_fichier iodir prefix O EX VO year eq 0 and month ne 0 and day eq 0 : s_fichier iodir prefix O SE VO s_month year ne 0 and month eq 0 : s_fichier iodir prefix O AN VO s_year year ne 0 and day eq 0 : s_fichier iodir prefix O MO VO s_year s_month else: s_fichier iodir prefix O VO s_year s_month s_day endcase end else: return report le fichier doit etre VO ou SO endcase print print adresse du fichier: fichier return s_fichier end "); a[89] = new Array("./Obsolete/fictype.html", "fictype.pro", "", " file_comments gives fictype DA MO AN SE EX corresponding to the given date in vairmer format yymmdd param vdate in required param dim unused uses common examples IDL fictype fictype 930124 history Jerome Vialard jv lodyc jussieu fr 2 7 98 version Id: fictype pro 371 2008 08 07 09:32:02Z pinsard function fictype vdate dim compile_opt idl2 strictarrsubs obsolete common constitution de l adresse ou aller chercher le fichier date yymmdd vdate jul juldate vdate case 1 of year eq 0 and month eq 0 : return EX year eq 0 and month ne 0 and day eq 0 : return SE year ne 0 and month eq 0 : return AN year ne 0 and day eq 0 : return MO else : return DA endcase fini: return 1 end "); a[90] = new Array("./Obsolete/imprime.html", "imprime.pro", "", " file_comments use printps instead obsolete param filename in required keyword TRANS keyword NB uses printps history June 2005: Sebastien Masson english version version Id: imprime pro 327 2007 12 13 16:22:35Z pinsard PRO imprime filename TRANS trans NB nb this is working only with unix linux osX machines compile_opt idl2 strictarrsubs obsolete thisOS strupcase strmid version os_family 0 3 CASE thisOS OF MAC :return WIN :return ELSE: ENDCASE call printps CASE N_PARAMS OF 0:printps 1:printps filename ELSE: BEGIN ras report imprime accept only one element: psfilename return END ENDCASE return END "); a[91] = new Array("./Obsolete/jourdsmois.html", "jourdsmois.pro", "", " file_comments use daysinmonth instead obsolete param mois in optional param annee in optional history Sebastien Masson smasson lodyc jussieu fr June 2005: Sebastien Masson english version version Id: jourdsmois pro 325 2007 12 06 10:04:53Z pinsard function jourdsmois mois annee compile_opt idl2 strictarrsubs obsolete case n_params OF 0:return daysinmonth 1:return daysinmonth mois 2:return daysinmonth mois annee endcase end"); a[92] = new Array("./Obsolete/juldate.html", "juldate.pro", "", " file_comments gives julian date equivalent of a date in vairmer yymmdd or yyyymmdd format sets month day and year to the corresp values you better use date2jul obsolete categories Calendar param vvdate in date de la forme yymmdd ou yyyymmdd keyword _EXTRA Used to pass keywords uses common vraidate returns date en jour julien l annee 0 n existant pas qd year est nulle on calcule le jour julien de l annee 1 COMPATIBLE AVEC L AN 2000 : une date de la forme yymmdd est convertit sous la forme yyyymmdd a l aide de vraidate Attention les variables globales year month day sont attribuees examples IDL date juldate 930124 history Jerome Vialard jv lodyc jussieu fr 2 7 98 version Id: juldate pro 371 2008 08 07 09:32:02Z pinsard function juldate vvdate _EXTRA ex compile_opt idl2 strictarrsubs obsolete vdate vvdate vdate vraidate vdate _EXTRA ex common year vdate 10000 month vdate 100 year 100 day abs vdate year 10000 month 100 month abs month mm month dd day yy year ndate n_elements vdate if total mm EQ 0 EQ ndate then mm 6 if total dd EQ 0 EQ ndate then dd 15 if total yy EQ 0 EQ ndate THEN yy 1 return julday mm dd yy _EXTRA ex return 1 end "); a[93] = new Array("./Obsolete/lec.html", "lec.pro", "", " file_comments lit les fichiers Vairmer en sort: un tableau 2d ou 3d en fonction de nomchamp qui est le nom du champ a extraire 2d s il commence par SO et 3d s il commence par VO cette fonction modifie aussi les variables globales: varname: trois lettres: nom de l experience vargrid: nom de la grille vardate: date yy yymmdd varexp: nom Vairmer du champ a tracer obsolete categories Graphics Reading examples IDL resultat lec nom_Vairmer date nom_experience param nomchamp in required 2 choix possibles: 1 nom de champ Vairmer chaine de 8 caracteres en majuscule ou minuscule commencant par vo ou so Dans cette methode on saute directement d en tete en en tete jusqu a trouver le bon fichier 2 chaine de caracteres commencant par vo ou so suivit du numero de champ a aller chercher par ex vo5 Cette methode est un peu plus rapide car elle va directement chercher le fichier qui nous interesse param date in optional nombres de 6 ou 8 chiffres anneemoisjour par ex:19980507 param nomexp in optional trois lettres designant le nom de l experience keyword ANOM in type du fichier vairmer par rapport auquel on doit calculer l anomalie EX AN SE MO keyword ECRIT in permet d imprimer tous les noms vairmer que contient le fichier ds ce cas en input on met seulement vo ou so la fonction retourne le nombre de fichiers lus keyword BOITE keyword EXPANOM in si on calcule l anom par rapport a une exper differente keyword FILENAME string pour passer directement le nom du champ sans utiliser les inputs: nom_Vairmer date nom_experience Rq si ces inputs sont qd meme donnes ils ne sont pas modifies par filename keyword GRID lorsque ce mot clef est active lec retourne la liste des types de grilles T U auxquelles se rapportent les variables ds ce cas en input on met seulement vo ou so keyword NAME lorsque ce mot clef est active lec retourne la liste des noms des variables ds ce cas en input on met seulement vo ou so keyword TOUT oblige lec a lire le champ sur tout le domaine qui a etait selectionne pour la cession en cours jpi jpj jpk returns un tableau 2d ou 3d sans le mot cle TOUT sa taille est celle du sous domaine definit par domdef nx ny nz avec TOUT le champ a la taille du domaine qui a etait selectionne pour la cession en cours jpi jpj jpk pour les sous domaines cf: Retourne 1 en cas d erreur uses common isnumber ficdate history Sebastien Masson smasson lodyc jussieu fr 26 5 98 Jerome Vialard : adaptation au format vairmer keyword anom et expanom 1 7 98 Sebastien Masson masque des terres 14 8 98 Sebastien Masson decoupe pour les sous domaines 2 99 version Id: lec pro 378 2008 08 12 12:35:46Z pinsard FUNCTION lec nomchamp date nomexp ECRIT ecrit ANOM anom BOITE boite EXPANOM expanom TOUT tout GRID grid NAME name filename FILENAME compile_opt idl2 strictarrsubs obsolete common tempsun systime 1 pour key_performance z 1 if keyword_set filename then BEGIN CASE strupcase strmid version os_family 0 3 of MAC :sep : WIN :sep ELSE:sep ENDCASE fname strmid filename rstrpos filename sep 1 if n_elements nomchamp EQ 0 then nomchamp strmid fname 6 2 if n_elements date EQ 0 then date long strmid fname 8 if n_elements nomexp EQ 0 then nomexp strmid fname 0 3 endif nomchamp strupcase nomchamp dim string format a2 nomchamp print nom de l experience: nomchamp specification de la date et de l experience case n_params OF 0:BEGIN if keyword_set filename then begin rien juldate date prefix nomexp ENDIF ELSE return report Donnez un argument en entree ou utilisez le mot clef FILENAME END 1:date long day long month 100 long year 10000 2:rien juldate date 3:begin rien juldate date prefix nomexp end endcase verification de la dim du fichier if dim ne SO and dim ne VO then return report le nom du champ doit commencer par VO ou SO constitution de l adresse ou aller chercher le fichier s_fichier ficdate date dim ouverture du fichier a l adresse s_fichier openr numlec s_fichier get_lun ERROR err swap_if_little_endian if err ne 0 then begin print err_string return 1 endif taille en octet du fichier infofichier fstat numlec definition de la taille du fichier a aller chercher: jpidta jpjdta jpkdta if n_elements jpidta EQ 0 THEN BEGIN if n_elements ixmindta EQ 0 OR n_elements ixmaxdta EQ 0 then jpidta jpiglo else jpidta ixmaxdta ixmindta 1 endif if n_elements jpjdta EQ 0 THEN BEGIN if n_elements iymindta EQ 0 OR n_elements iymaxdta EQ 0 then jpjdta jpjglo else jpjdta iymaxdta iymindta 1 endif if n_elements jpkdta EQ 0 THEN BEGIN if n_elements izmindta EQ 0 OR n_elements izmaxdta EQ 0 then jpkdta jpkglo else jpkdta izmaxdta izmindta 1 endif lecture des champs directement vers le champ ou l en tete que l on recherche il faut savoir que: le fortran ajoute au debut et a la fin de chaque write 4 octets de controle les reels du model sont codes sur 4 octets un caractere fait 1 octet 4 chaines de 8 caracteres un tableau de reels 4 trucs de controle pour les 2 write : if dim eq VO then taillebloc 4 8 long jpidta jpjdta jpkdta 4 4 4 else taillebloc 4 8 long jpidta jpjdta 4 4 4 choix du type de lecture typelec strmid nomchamp 2 strlen nomchamp test isnumber typelec numerochamp if test eq 0 then begin 1 LECTURE DIRECTE D EN TETE en EN TETE numerochamp 1 lecture des noms de champ resname resgrid while numerochamp taillebloc le infofichier size do begin offset numerochamp 1 taillebloc 4 a assoc numlec bytarr 8 nozero offset varname string a 0 if keyword_set ecrit OR keyword_set name OR keyword_set grid then begin vargrid a 1 vargrid string vargrid 7 vardate strtrim long string a 2 2 varexp strtrim a 3 2 if keyword_set ecrit THEN print numerochamp varname vargrid vardate varexp resname resname varname resgrid resgrid vargrid endif if nomchamp eq varname then begin vargrid a 1 vargrid string vargrid 7 vardate strtrim long string a 2 2 varexp strtrim a 3 2 goto sortieboucle endif numerochamp numerochamp 1 ENDWHILE free_lun numlec close numlec case 1 of keyword_set ecrit :return numerochamp 1 keyword_set name :return resname 1:numerochamp 1 keyword_set grid : return strmid resgrid 1:numerochamp 1 0 strlen resgrid 0 2 ELSE:return report Ce nom Vairmer de champ n existe pas ds le fichier: infofichier name endcase endif else begin 2 LECTURE DIRECTEMENT DU CHAMP QUE L ON VEUT test pour savoir si numero de champ est accessible if taillebloc numerochamp gt infofichier size then return report Ce numero de champ n existe pas Le fichier infofichier name ne contient que infofichier size taillebloc champs lecture de l en tete numero numerochamp offset numerochamp 1 taillebloc 4 a assoc numlec bytarr 8 nozero offset varname string a 0 vargrid a 1 vargrid string vargrid 7 vardate string a 2 varexp string a 3 endelse sortieboucle: lecture du champ lui meme offset numerochamp 1 taillebloc 8 4 8 4 if dim eq VO then a assoc numlec fltarr jpidta jpjdta jpkdta nozero offset else a assoc numlec fltarr jpidta jpjdta nozero offset z a 0 on initialise les ixmindta iymindta au besoin if n_elements ixmindta EQ 0 OR n_elements ixmaxdta EQ 0 then BEGIN ixmindta 0 ixmaxdta jpidta 1 endif if n_elements iymindta EQ 0 OR n_elements iymaxdta EQ 0 then BEGIN iymindta 0 iymaxdta jpjdta 1 endif if n_elements izmin EQ 0 OR n_elements izmax EQ 0 then BEGIN izmindta 0 izmaxdta jpkdta 1 endif on reduit z selon les valeurs de ixmindta iymindta if dim EQ SO then z z ixminmesh ixmindta:ixmaxmesh ixmindta iyminmesh iymindta:iymaxmesh iymindta ELSE z z ixminmesh ixmindta:ixmaxmesh ixmindta iyminmesh iymindta:iymaxmesh iymindta izminmesh izmindta:izmaxmesh izmindta on shift z si key_shift est defini if n_elements key_shift NE 0 THEN BEGIN if dim EQ SO then z shift z key_shift 0 ELSE z shift z key_shift 0 0 endif si TOUT n est pas active on coupe z pour qu il soit a la taille du zoom: nx ny nz if NOT keyword_set tout then BEGIN changement de domaine if keyword_set boite then BEGIN Case 1 Of N_Elements Boite Eq 1:bte lon1 lon2 lat1 lat2 0 boite 0 N_Elements Boite Eq 2:bte lon1 lon2 lat1 lat2 boite 0 boite 1 N_Elements Boite Eq 4:bte Boite prof1 prof2 N_Elements Boite Eq 5:bte Boite 0:3 0 Boite 4 N_Elements Boite Eq 6:bte Boite Else: return report Mauvaise Definition de Boite endcase oldboite lon1 lon2 lat1 lat2 prof1 prof2 domdef bte GRILLE vargrid ENDIF grille mask glam gphi gdep nx ny nz premierx premiery premierz dernierx derniery dernierz if nx EQ 1 OR ny EQ 1 OR nz EQ 1 then mask reform mask nx ny nz over if dim EQ SO then z z premierx:dernierx premiery:derniery ELSE z z premierx:dernierx premiery:derniery premierz:dernierz ENDIF ELSE BEGIN case vargrid OF on recupere le mask en entier ds le cas ou TOUT U :mask umask n est pas active et on le choisit en fonction T :mask tmask de la valeur de vargrid W :mask tmask V :mask vmask F :mask fmask ENDCASE ENDELSE calcul d une anomalie si le keyword anom est active if keyword_set anom then begin case anom of EX : adate 0 AN : adate floor date 10000 10000 SE : adate floor date floor date 10000 10000 100 100 MO : adate floor date 100 100 DA : adate date floor date 10000 10000 : adate date floor date 10000 10000 else : return report Anom doit etre egal a EX AN SE MO DA endcase if keyword_set expanom then nomexpa expanom else nomexpa nomexp if keyword_set bavard THEN print nomchamp adate nomexpa z z lec nomchamp adate nomexpa TOUT tout endif on masque les terres par valmask IF n_elements valmask EQ 0 THEN valmask 1e20 if dim EQ SO then BEGIN terre where mask 0 EQ 0 if terre 0 NE 1 then z terre valmask ENDIF ELSE BEGIN terre where mask 0 EQ 0 if terre 0 NE 1 then z where mask EQ 0 valmask ENDELSE free_lun numlec close numlec if n_elements oldboite NE 0 then domdef oldboite IF keyword_set key_performance EQ 1 THEN print temps lec systime 1 tempsun return reform z end "); a[94] = new Array("./Obsolete/lect.html", "lect.pro", "", " file_comments lit les fichiers Vairmer de date1 a date2 et en sort un tableau 1D 2D ou 3D qui peut etre reutilise pour une courbe hov animation cette fonction modifie aussi les variables globales: varname: huit lettres: nom Vairmer du champ a tracer vargrid:1 lettre : nom de la grille varexp: trois lettres :nom de l experience obsolete categories Graphics Reading examples IDL resultat lec nom_Vairmer date1 date2 nomexp direc BOITE boite param nomchamp in required nom de champ Vairmer chaine de 8 caracteres commencant par VO ou SO param date1 in required date de depart de la serie temporelle a extraire param date2 in required date de fin de la serie temporelle a extraire param nomexp in required default prefix nom de l experience a lire param direc in required x y z xy xz yz xyz xt yt zt xyt xzt yzt xyzt directions selon lesquelles effectuer les moyennes si rien n est donne on n effectue pas de moyenne keyword BOITE in boite sur laquelle integrer par defaut tout le domaine keyword ANOM in type de fichiers SE AN a relire pour calc une anomalie keyword EXPANOM in experience pour laquelle on veut calculer une anomalie par defaut la meme que nomexp uses common vraidate juldate history Jerome Vialard jv lodyc jussieu fr 2 7 98 version Id: lect pro 371 2008 08 07 09:32:02Z pinsard function lect nomchamp date1 date2 nomexp direc BOITE boite ANOM anom EXPANOM expanom REPEAT repeat compile_opt idl2 strictarrsubs obsolete common tempsun systime 1 pour key_performance nomchamp strupcase nomchamp date1 vraidate date1 date2 vraidate date2 dim string format a2 nomchamp specification de la date et de l experience if fictype date1 ne fictype date2 then return report Les deux dates doivent correspondre au meme type de fic vairmer fictyp fictype date1 creation du nom du fichier if n_elements nomexp EQ 0 then nomexp prefix ficname iodir nomchamp strcompress date1 remove_all ficname ficname fictyp strcompress date2 remove_all nomexp if keyword_set anom then ficname ficname anom if keyword_set expanom then ficname ficname expanom case n_elements boite of 4 : box strcompress string format i4 _ i4 _ i4 _ i4 boite remove_all 6 : box strcompress string format i4 _ i4 _ i4 _ i4 _ i4 _ i4 boite remove_all else: box strcompress string format i4 _ i4 _ i4 _ i4 _ i4 _ i4 lon1 lon2 lat1 lat2 prof1 prof2 remove_all ENDCASE if n_elements direc EQ 0 then direc ficname ficname box direc hovdat Est ce que le fichier de hovmoeller existe structure du fichier : jpt valeur de la dim temporelle dimtableau dimension du tableau dimttab 0 dimttab 1 valeur des dim time axe des tps ttab tableau a lire def du domaine lon1 lon2 prof1 prof2 get_lun numlec openr numlec ficname get_lun ERROR err swap_if_little_endian if err eq 0 then begin jpt long 1 dimtableau long 1 readu numlec jpt dimtableau case dimtableau of 1 : begin n1 long 1 readu numlec n1 ttab fltarr n1 end 2 : begin n1 long 1 n2 long 1 readu numlec n1 n2 ttab fltarr n1 n2 end 3 : begin n1 long 1 n2 long 1 n3 long 1 readu numlec n1 n2 n3 ttab fltarr n1 n2 n3 end endcase time lonarr jpt lecture axe des tps et du tableau readu numlec time ttab newboite fltarr 6 lecture du domaine readu numlec newboite domdef newboite lecture info complementaire : nom du champs de l experience varname aaaaaaaa readu numlec varname vargrid a readu numlec vargrid varexp aaa readu numlec varexp close numlec free_lun numlec return ttab ENDIF close numlec free_lun numlec changement de domaine if keyword_set boite then BEGIN Case 1 Of N_Elements Boite Eq 1:bte lon1 lon2 lat1 lat2 0 boite 0 N_Elements Boite Eq 2:bte lon1 lon2 lat1 lat2 boite 0 boite 1 N_Elements Boite Eq 4:bte Boite prof1 prof2 N_Elements Boite Eq 5:bte Boite 0:3 0 Boite 4 N_Elements Boite Eq 6:bte Boite Else: return report Mauvaise Definition de Boite endcase oldboite lon1 lon2 lat1 lat2 prof1 prof2 domdef bte ENDIF Boucle de lecture des fichiers case fictyp of DA : dec 0 MO : dec 14 SE : dec 14 AN : dec 182 endcase initialisation des variables associees au tps time lonarr jptmax jpt 0 vdat date1 debut de la boucle while vdat le date2 do begin lecture du fichier a la date vdat vairmer tab lec nomchamp vdat nomexp ANOM anom EXPANOM expanom attribution du mask et des tableaux de longitude et latitude if jpt EQ 0 THEN grille mask glam gphi gdep nx ny nz premierx premiery premierz dernierx derniery dernierz if n_elements tab eq 1 and tab 0 eq 1 then begin goto incrdate endif else begin jpt jpt 1 if jpt gt jptmax then return report lect : augmenter jptmax endelse Moyenne du champs tab IF n_params EQ 5 THEN if direc NE then BEGIN if nx EQ 1 OR ny EQ 1 OR nz EQ 1 THEN BEGIN if string format a2 nomchamp EQ SO then tab reform tab nx ny over ELSE tab reform tab nx ny nz over ENDIF tab moyenne tab direc endif if jpt eq 1 then begin ttab tab endif else BEGIN ttab colle ttab tab size tab 0 1 endelse time jpt 1 juldate vdat dec Incrementation de la date incrdate : case fictyp of DA : caldat juldate vdat 1 month day year MO : begin caldat julday month 1 year jourdsmois month day year day 0 end SE : month month 1 AN : year year 1 endcase Fin de boucle de lecture des fichiers vdat long 10000 year long 100 month day ENDWHILE if ttab 0 EQ 1 then return report Aucun fichier n a ete lu Ecriture du fichier get_lun numlec openw numlec ficname get_lun swap_if_little_endian taille size ttab writeu numlec long jpt long taille 0 case taille 0 of 1 : writeu numlec long taille 1 2 : writeu numlec long taille 1 long taille 2 3 : writeu numlec long taille 1 long taille 2 long taille 3 endcase writeu numlec long time 0:jpt 1 ttab writeu numlec float lon1 lon2 lat1 lat2 prof1 prof2 ecriture info complementaire : nom du champs de l experience writeu numlec strmid varname 0 8 writeu numlec strmid vargrid 0 1 writeu numlec strmid varexp 0 3 close numlec free_lun numlec if keyword_set repeat then begin jpt jpt repeat if jpt gt jptmax then begin print lect : augmenter jptmax goto fini endif tabadd ttab ti endif if n_elements oldboite NE 0 then domdef oldboite close all IF keyword_set key_performance THEN print temps lect systime 1 tempsun return ttab end "); a[95] = new Array("./Obsolete/meshlec.html", "meshlec.pro", "", " file_comments lecture du mask des sorties d OPA les sources se trouvent ds les repertoires sur maia du type: nom_exp RESTARTS obsolete examples IDL meshmask nomfich param nomfich in required string c est le nom du fichier a lire Par defaut c est meshmask keyword GLAMBOUNDARY in un vecteur de 2 elements specifaint le min et le max qui doivent etre imposes en longitude obligatoire si le tableau depasse 360 degres keyword PASBLABLA in pour supprimer les blablas keyword DOUBLE in pour forcer a lire les tableaux en double precision ce Mot clef est maintenant active automatiquement keyword GETDIMENSIONS uses common restrictions La definition de ixminmesh ixmaxmesh iyminmesh iymaxmesh izminmesh izmaxmesh doit etre faite avant l entree dans cette routine pour attribuer automatiquement ces valeurs au maximum possible les mettre toutes a 1 et meshlec les calculera history Sebastien Masson smasson lodyc jussieu fr Marina Levy : lecture en double precision cas calcul sur shine version Id: meshlec pro 371 2008 08 07 09:32:02Z pinsard PRO meshlec nomfich PASBLABLA pasblabla DOUBLE double GLAMBOUNDARY glamboundary GETDIMENSIONS GETDIMENSIONS compile_opt idl2 strictarrsubs obsolete common tempsun systime 1 pour key_performance jpiglo 0L jpjglo 0L jpkglo 0L tab aaaaa definition du domaine de la grille sur lequel sont effectuees les sorties les indices des tableaux commencant a 1: cf le fichier wrivr2 F ds WKOPA sur le cray LECTURE DU MASK trouve ds les fichiers restart constitution de l adresse s_fichier et ouverture du fichier a l adresse s_fichier IF n_params EQ 0 then nomfich meshmask s_fichier isafile file nomfich iodir iodir if not keyword_set pasblabla then print if not keyword_set pasblabla then print adresse du fichier: s_fichier openr numlec s_fichier get_lun f77_unformatted swap_if_little_endian filepamameters fstat numlec lecture readu numlec jpiglo jpjglo jpkglo if not keyword_set pasblabla then print taille de la grille d origine: jpiglo jpjglo jpkglo if keyword_set getdimensions then begin free_lun numlec close numlec return endif on determine si le fichier a ete ecrit en double precision on non sizenumber 8l sizefile8 4l 3l 4l 4l 4l 4l jpiglo jpjglo sizenumber 4l 4l 4l jpiglo jpjglo sizenumber 4l 4l 4l jpiglo jpjglo sizenumber 4l 4l 4l jpiglo jpjglo sizenumber 4l 4l 4l jpiglo jpjglo jpkglo sizenumber 4l 1l 4l jpiglo jpjglo sizenumber 4l 4l 4l jpkglo sizenumber 4l if filepamameters size GE sizefile8 THEN double 1 sizenumber 4l sizefile4 4l 3l 4l 4l 4l 4l jpiglo jpjglo sizenumber 4l 4l 4l jpiglo jpjglo sizenumber 4l 4l 4l jpiglo jpjglo sizenumber 4l 4l 4l jpiglo jpjglo sizenumber 4l 4l 4l jpiglo jpjglo jpkglo sizenumber 4l 1l 4l jpiglo jpjglo sizenumber 4l 4l 4l jpkglo sizenumber 4l print filepamameters size sizefile4 sizefile8 case filepamameters size of sizefile8:double 1 sizefile4:double 0 ELSE:BEGIN nothing report The OPA Mesh file as not the good size free_lun numlec close numlec return END endcase if n_elements ixminmesh EQ 0 THEN ixminmesh 0 if n_elements ixmaxmesh EQ 0 then ixmaxmesh jpiglo 1 if ixminmesh EQ 1 THEN ixminmesh 0 IF ixmaxmesh EQ 1 then ixmaxmesh jpiglo 1 if n_elements iyminmesh EQ 0 THEN iyminmesh 0 IF n_elements iymaxmesh EQ 0 then iymaxmesh jpjglo 1 if iyminmesh EQ 1 THEN iyminmesh 0 IF iymaxmesh EQ 1 then iymaxmesh jpjglo 1 if n_elements izminmesh EQ 0 THEN izminmesh 0 IF n_elements izmaxmesh EQ 0 then izmaxmesh jpkglo 1 if izminmesh EQ 1 THEN izminmesh 0 IF izmaxmesh EQ 1 then izmaxmesh jpkglo 1 jpi long ixmaxmesh ixminmesh 1 jpj long iymaxmesh iyminmesh 1 jpk long izmaxmesh izminmesh 1 doit on reellement lire la grille meshparameters jpiglo:jpiglo jpjglo:jpjglo jpkglo:jpkglo jpi:jpi jpj:jpj jpk:jpk ixminmesh:ixminmesh ixmaxmesh:ixmaxmesh iyminmesh:iyminmesh iymaxmesh:iymaxmesh izminmesh:izminmesh izmaxmesh:izmaxmesh key_shift:key_shift noticebase xnotice Lecture du fichier C s_fichier C IF NOT keyword_set double THEN BEGIN z3d fltarr jpiglo jpjglo jpkglo z2d fltarr jpiglo jpjglo z1d fltarr jpkglo ENDIF ELSE BEGIN z3d dblarr jpiglo jpjglo jpkglo z2d dblarr jpiglo jpjglo z1d dblarr jpkglo ENDELSE if not keyword_set pasblabla then print readu numlec tab z2d GLAMT float z2d ixminmesh:ixmaxmesh iyminmesh:iymaxmesh if not keyword_set pasblabla then print tableau: tab exemple de valeur GLAMT 25 31 : GLAMT 25 31 readu numlec tab z2d GLAMU float z2d ixminmesh:ixmaxmesh iyminmesh:iymaxmesh if not keyword_set pasblabla then print tableau: tab exemple de valeur GLAMU 25 31 : GLAMU 25 31 readu numlec tab z2d GLAMV float z2d ixminmesh:ixmaxmesh iyminmesh:iymaxmesh if not keyword_set pasblabla then print tableau: tab exemple de valeur GLAMV 25 31 : GLAMV 25 31 readu numlec tab z2d GLAMF float z2d ixminmesh:ixmaxmesh iyminmesh:iymaxmesh if not keyword_set pasblabla then print tableau: tab exemple de valeur GLAMF 25 31 : z2d 25 31 if not keyword_set pasblabla then print readu numlec tab z2d GPHIT float z2d ixminmesh:ixmaxmesh iyminmesh:iymaxmesh if not keyword_set pasblabla then print tableau: tab exemple de valeur GPHIT 25 31 : GPHIT 25 31 readu numlec tab z2d GPHIU float z2d ixminmesh:ixmaxmesh iyminmesh:iymaxmesh if not keyword_set pasblabla then print tableau: tab exemple de valeur GPHIU 25 31 : GPHIU 25 31 readu numlec tab z2d GPHIV float z2d ixminmesh:ixmaxmesh iyminmesh:iymaxmesh if not keyword_set pasblabla then print tableau: tab exemple de valeur GPHIV 25 31 : GPHIV 25 31 readu numlec tab z2d GPHIF float z2d ixminmesh:ixmaxmesh iyminmesh:iymaxmesh if not keyword_set pasblabla then print tableau: tab exemple de valeur GPHIF 25 31 : z2d 25 31 if not keyword_set pasblabla then print readu numlec tab z2d E1T float z2d ixminmesh:ixmaxmesh iyminmesh:iymaxmesh if not keyword_set pasblabla then print tableau: tab exemple de valeur E1T 25 5 : z2d 25 5 readu numlec tab z2d E1U float z2d ixminmesh:ixmaxmesh iyminmesh:iymaxmesh if not keyword_set pasblabla then print tableau: tab exemple de valeur E1U 25 5 : z2d 25 5 readu numlec tab z2d E1V float z2d ixminmesh:ixmaxmesh iyminmesh:iymaxmesh if not keyword_set pasblabla then print tableau: tab exemple de valeur E1V 25 5 : z2d 25 5 readu numlec tab z2d E1F float z2d ixminmesh:ixmaxmesh iyminmesh:iymaxmesh if not keyword_set pasblabla then print tableau: tab exemple de valeur E1F 25 5 : z2d 25 5 if not keyword_set pasblabla then print readu numlec tab z2d E2T float z2d ixminmesh:ixmaxmesh iyminmesh:iymaxmesh if not keyword_set pasblabla then print tableau: tab exemple de valeur E2T 25 5 : z2d 25 5 readu numlec tab z2d E2U float z2d ixminmesh:ixmaxmesh iyminmesh:iymaxmesh if not keyword_set pasblabla then print tableau: tab exemple de valeur E2U 25 5 : z2d 25 5 readu numlec tab z2d E2V float z2d ixminmesh:ixmaxmesh iyminmesh:iymaxmesh if not keyword_set pasblabla then print tableau: tab exemple de valeur E2V 25 5 : z2d 25 5 readu numlec tab z2d E2F float z2d ixminmesh:ixmaxmesh iyminmesh:iymaxmesh if not keyword_set pasblabla then print tableau: tab exemple de valeur E2F 25 5 : z2d 25 5 if not keyword_set pasblabla then print readu numlec tab z3d TMASK byte z3d ixminmesh:ixmaxmesh iyminmesh:iymaxmesh izminmesh:izmaxmesh if not keyword_set pasblabla then print tableau: tab exemple de valeur TMASK 25 5 0 : TMASK 25 5 0 readu numlec tab z3d UMASKred byte z3d ixmaxmesh iyminmesh:iymaxmesh izminmesh:izmaxmesh umaskred reform umaskred if not keyword_set pasblabla then print tableau: tab exemple de valeur UMASK 25 5 0 : z3d 25 5 0 readu numlec tab z3d VMASKred byte z3d ixminmesh:ixmaxmesh iymaxmesh izminmesh:izmaxmesh vmaskred reform vmaskred if not keyword_set pasblabla then print tableau: tab exemple de valeur VMASK 25 5 0 : z3d 25 5 0 readu numlec tab z3d fmaskredy byte z3d ixmaxmesh iyminmesh:iymaxmesh izminmesh:izmaxmesh coast where fmaskredy NE 0 and fmaskredy NE 1 IF coast 0 NE 1 THEN fmaskredy coast 0b fmaskredx byte z3d ixminmesh:ixmaxmesh iymaxmesh izminmesh:izmaxmesh coast where fmaskredx NE 0 and fmaskredx NE 1 IF coast 0 NE 1 THEN fmaskredx coast 0b fmaskredx reform fmaskredx fmaskredy reform fmaskredy if not keyword_set pasblabla then print tableau: tab exemple de valeur FMASK 25 5 0 : z3d 25 5 0 if not keyword_set pasblabla then print readu numlec tab z2d FF z2d ixminmesh:ixmaxmesh iyminmesh:iymaxmesh if not keyword_set pasblabla then print tableau: tab exemple de valeur FF 25 5 : z2d 25 5 readu numlec tab z1d GDEPT float z1d izminmesh:izmaxmesh if not keyword_set pasblabla then print tableau: tab exemple de valeur GDEPT 1 : GDEPT 1 readu numlec tab z1d GDEPW float z1d izminmesh:izmaxmesh if not keyword_set pasblabla then print tableau: tab exemple de valeur GDEPW 1 : GDEPW 1 readu numlec tab z1d E3T float z1d izminmesh:izmaxmesh if not keyword_set pasblabla then print tableau: tab exemple de valeur E3T 3 : E3T 3 readu numlec tab z1d E3W float z1d izminmesh:izmaxmesh if not keyword_set pasblabla then print tableau: tab exemple de valeur E3W 3 : E3W 3 free_lun numlec close numlec bornes de glam qui ne doivent pas depasser 360 degres minglam min glamt max maxglam if maxglam minglam GE 360 AND NOT keyword_set glamboundary then nothing execute glamboundary xquestion What are the longitudes boundary 180 180 chkwidget if keyword_set glamboundary then begin if glamboundary 0 NE glamboundary 1 then begin glamt glamt MOD 360 smaller where glamt LT glamboundary 0 if smaller 0 NE 1 then glamt smaller glamt smaller 360 bigger where glamt GE glamboundary 1 if bigger 0 NE 1 then glamt bigger glamt bigger 360 glamu glamu MOD 360 smaller where glamu LT glamboundary 0 if smaller 0 NE 1 then glamu smaller glamu smaller 360 bigger where glamu GE glamboundary 1 if bigger 0 NE 1 then glamu bigger glamu bigger 360 glamv glamv MOD 360 smaller where glamv LT glamboundary 0 if smaller 0 NE 1 then glamv smaller glamv smaller 360 bigger where glamv GE glamboundary 1 if bigger 0 NE 1 then glamv bigger glamv bigger 360 glamf glamf MOD 360 smaller where glamf LT glamboundary 0 if smaller 0 NE 1 then glamf smaller glamf smaller 360 bigger where glamf GE glamboundary 1 if bigger 0 NE 1 then glamf bigger glamf bigger 360 endif endif shift en x if keyword_set key_shift AND jpi NE 1 then begin glamt shift glamt key_shift 0 gphit shift gphit key_shift 0 e1t shift e1t key_shift 0 e2t shift e2t key_shift 0 glamu shift glamu key_shift 0 gphiu shift gphiu key_shift 0 e1u shift e1u key_shift 0 e2u shift e2u key_shift 0 glamv shift glamv key_shift 0 gphiv shift gphiv key_shift 0 e1v shift e1v key_shift 0 e2v shift e2v key_shift 0 glamf shift glamf key_shift 0 gphif shift gphif key_shift 0 e1f shift e1f key_shift 0 e2f shift e2f key_shift 0 if jpk EQ 1 then begin tmask shift tmask key_shift 0 vmaskred shift vmaskred key_shift fmaskredx shift fmaskredx key_shift ENDIF ELSE BEGIN tmask shift tmask key_shift 0 0 vmaskred shift vmaskred key_shift 0 fmaskredx shift fmaskredx key_shift 0 ENDELSE endif key_yreverse 0 key_zreverse 0 key_partialstep 0 key_stride 1 1 1 key_gridtype c if not keyword_set pasblabla then print lecture nomfich finie widget_control noticebase bad_id toto destroy if keyword_set key_performance THEN print temps meshlec systime 1 tempsun return end "); a[96] = new Array("./Obsolete/ncdf_meshlec.html", "ncdf_meshlec.pro", "", " file_comments use ncdf_meshread instead obsolete param filename keyword _EXTRA Used to pass keywords history Aug 2005 Sebastien Masson: switch to ncdf_meshread version Id: ncdf_meshlec pro 327 2007 12 13 16:22:35Z pinsard PRO ncdf_meshlec filename _EXTRA ex compile_opt idl2 strictarrsubs obsolete CASE n_params OF 0:ncdf_meshread _EXTRA ex 1:ncdf_meshread filename _EXTRA ex ENDCASE return END"); a[97] = new Array("./Obsolete/nlec.html", "nlec.pro", "", " file_comments lit les fichiers Net Cdf de l experience TOTEM ECMWF qui sont sur maia: u rech eee reee217 TOTEM REF OUTPUTS obsolete param name in required nom du tableau contenant le champ que l on veut le trouver avec ncdflec fichier var param debut in nombres de 6 ou 8 chiffres anneemoisjour par ex:19980507 param fin in nombres de 6 ou 8 chiffres anneemoisjour par ex:19980507 param nomexperience in optional trois lettres designant le nom de l experience keyword BOITE boite sur laquelle integrer par defaut tt le domaine keyword DIREC x y z xy xz yz xyz directions selon lesquelles effectuer les moyennes si rien n est donne on n effectue pas de moyenne keyword GRILLE impose la grille a laquelle est rapporte le champ rq permet d aller plus vite ds la lecture keyword TOUT oblige a lire le tableau entier en non pas celui reduit a domdef keyword STRUCTURE keyword SEUILMIN keyword SEUILMAX keyword NAN keyword _EXTRA Used to pass keywords uses common vraidate juldate nlec5j nlecserie history Sebastien Masson smasson lodyc jussieu fr 14 8 98 version Id: nlec pro 370 2008 08 07 07:59:15Z pinsard FUNCTION nlec name debut fin nomexperience BOITE boite DIREC direc GRILLE grille TOUT tout STRUCTURE structure SEUILMIN seuilmin SEUILMAX seuilmax NAN nan _EXTRA ex REF 07 790101 grid T nc REF 07 790101 grid U nc REF 07 790101 grid V nc REF 07 790101 grid W nc compile_opt idl2 strictarrsubs obsolete common tempsun systime 1 pour key_performance nom strlowcase name specification de la date et de l experience case n_params of 1:BEGIN year year 1900 year ne 0 and year ne 1 and year lt 100 date day 100 month 10000 year end 2:BEGIN if size debut tname EQ STRING then begin prefix strupcase debut year year 1900 year ne 0 and year ne 1 and year lt 100 date day 100 month 10000 year ENDIF ELSE BEGIN date debut rien juldate date ENDELSE end 3:begin date debut rien juldate date if size fin tname EQ STRING then begin prefix strupcase fin ENDIF ELSE BEGIN date2 vraidate fin year2 date2 10000 month2 date2 100 year2 100 day2 date2 year2 10000 month2 100 ENDELSE end 4:BEGIN date debut rien juldate date if size nomexperience tname EQ STRING then begin prefix strupcase nomexperience date2 fin ENDIF ELSE BEGIN prefix strupcase fin date2 nomexperience ENDELSE date2 vraidate date2 year2 date2 10000 month2 date2 100 year2 100 day2 date2 year2 10000 month2 100 end endcase date long date if n_elements date2 NE 0 then date2 long date2 if n_elements date2 NE 0 then if date2 eq date then tempvar SIZE TEMPORARY date2 verification de la coherence des dates if n_elements date2 ne 0 then begin if day EQ 0 AND day2 NE 0 OR month EQ 0 AND month2 NE 0 OR year EQ 0 AND year2 NE 0 or day2 EQ 0 AND day NE 0 OR month2 EQ 0 AND month NE 0 OR year2 EQ 0 AND year NE 0 then return report verifier la coherence des dates if date2 le date then return report date2 doit etre posterieure a date endif case sur le type de fichiers que l on veut lire determination ds chaque cas de numsortie et nbretps if day NE 0 then begin SORTIES A 5 JOURS numsortie testjour: numsortie 1 julday month day year julday 1 1 year 5 0 if numsortie ne floor numsortie then begin if n_elements date2 ne 0 then begin caldat julday month day 1 year month day year goto testjour endif return 1 ENDIF numsortie long numsortie determination du nombre de pas de tps a extraire pour la serie temporelle entiere: nbretps if n_elements date2 ne 0 then begin testjour2: numsortie2 1 julday month2 day2 year2 julday 1 1 year2 5 if numsortie2 ne floor numsortie2 then begin caldat julday month2 day2 1 year2 month2 day2 year2 goto testjour2 endif if year eq year2 then nbretps numsortie2 numsortie 1 else nbretps 73 numsortie 1 year2 year 1 73 numsortie2 numsortie2 long numsortie2 endif else nbretps 1 nbretps long nbretps si on fait une serie temporelle on cherche a lire plutot un fichier contenant deja une serie temporelle par contre pour une sortie unique on cherche d abord a lire un fichier contenant toutes les variables IF n_elements date2 ne 0 THEN BEGIN serie: IF n_elements dejaserie eq 1 then return 1 datejul 5 numsortie 1 julday 1 1 year if n_elements date2 ne 0 then date2jul 5 numsortie2 1 julday 1 1 year2 ELSE date2jul datejul res nlecserie nom datejul date2jul BOITE boite GRILLE grille TOUT tout _EXTRA ex IF res 0 EQ 1 THEN BEGIN dejaserie 1 GOTO passerie ENDIF ENDIF ELSE BEGIN passerie: IF n_elements dejapasserie eq 1 then return 1 res nlec5j nom numsortie nbretps BOITE boite GRILLE grille TOUT tout _EXTRA ex IF res 0 EQ 1 THEN BEGIN dejapasserie 1 GOTO serie ENDIF endelse ENDIF ELSE BEGIN CASE 1 of month NE 0 AND year NE 0:BEGIN SORTIES MENSUELLES numsortie79 year 1979 12 month if n_elements date2 ne 0 then nbretps month2 month 1 12 year2 year ELSE nbretps 1 res nlecmois nom numsortie79 nbretps BOITE boite GRILLE grille TOUT tout _EXTRA ex end month EQ 0 AND year NE 0:BEGIN SORTIES ANNUELLES numsortie79 year 1978 if n_elements date2 ne 0 then nbretps year2 year 1 ELSE nbretps 1 res nlecan nom numsortie79 nbretps BOITE boite GRILLE grille TOUT tout _EXTRA ex end month NE 0 AND year EQ 0:BEGIN SORTIES SAISONNIERES numsortie79 month if n_elements date2 ne 0 then nbretps month2 month 1 ELSE nbretps 1 res nlecsaison nom numsortie79 nbretps BOITE boite GRILLE grille TOUT tout _EXTRA ex end month EQ 0 AND year EQ 0:BEGIN SORTIES CLIMATOLOGIQUE numsortie79 13 nbretps 1 res nlecsaison nom numsortie79 nbretps BOITE boite GRILLE grille TOUT tout _EXTRA ex end endcase endelse seuil if n_elements seuilmin NE 0 then BEGIN if n_elements valmask EQ 0 then valmask 1e20 terre where res GT valmask 10 res seuilmin res if terre 0 NE 1 then res terre valmask undefine terre endif if n_elements seuilmax NE 0 then begin if n_elements valmask EQ 0 then valmask 1e20 terre where res GT valmask 10 res res seuilmax if terre 0 NE 1 then res terre valmask undefine terre endif points a mettre a nan if n_elements nan NE 0 then BEGIN if n_elements valmask EQ 0 then valmask 1e20 if abs valmask LT 1e6 then terre where abs res GT abs valmask 10 ELSE terre where res EQ valmask if abs nan LT 1e6 then notan where res EQ nan ELSE notan where abs res GT abs nan if notan 0 NE 1 then res notan values f_nan notan notan 0 NE 1 if terre 0 NE 1 then res terre valmask undefine terre endif ajustement de niveau pour les tableau 2d simples if jpt EQ 1 then begin taille size res IF taille 0 EQ 2 THEN niveau 1 endif moyenne eventuelle IF keyword_set direc THEN BEGIN IF jpt EQ 1 THEN res moyenne res direc BOITE boite nan notan ELSE res grossemoyenne res direc BOITE boite nan notan ENDIF mise en placer des parametres pour le trace if keyword_set boite then legende_pltt boite ELSE legende_pltt lon1 lon2 lat1 lat2 IF n_elements res NE 1 THEN res reform res over IF NOT keyword_set direc THEN domdef lon1 lon2 lat1 lat2 prof1 prof2 _extra ex grille vargrid ELSE if direc eq t then domdef lon1 lon2 lat1 lat2 prof1 prof2 _extra ex grille vargrid if keyword_set structure then res tab:res grille:vargrid unite:varunit experience:varexp nom:varname if keyword_set key_performance THEN print temps nlec systime 1 tempsun time time 2l return res end"); a[98] = new Array("./Obsolete/nlec5j.html", "nlec5j.pro", "", " file_comments lit les fichiers Net Cdf de l experience TOTEM ECMWF qui contiennent les sorties a 5j regroupees par type de grille par paquets de 6 mois sur maia: u rech eee reee217 TOTEM REF OUTPUTS obsolete categories Reading examples IDL res nlec5j nom numsortie nbretps param nom in required nom du tableau contenant le champ que l on veut le trouver avec ncdflec fichier var param numsortie in required le numero du pas de temps que l on veut sortir du fichier compte a partir de 1 a partir de year param nbretps in required nombre de pas de temps a extraire keyword BOITE boite sur laquelle integrer par defaut tt le domaine keyword GRILLE impose la grille a laquelle est rapporte le champ rq permet d aller plus vite ds la lecture keyword TOUT oblige a lire le tableau entier en non pas celui reduit a domdef keyword _EXTRA Used to pass keywords returns tableau 2d qd on ne demande pas de serie ou 3d ou 4d ds le cas dune serie uses common restrictions appele par nlec history Sebastien Masson smasson lodyc jussieu fr version Id: nlec5j pro 371 2008 08 07 09:32:02Z pinsard function nlec5j nom numsortie nbretps BOITE boite GRILLE grille TOUT tout _EXTRA ex compile_opt idl2 strictarrsubs obsolete common res 1 anneedepart 1979 gestion du nom du fichier if numsortie le 36 then BEGIN mmdd 0101 numsort numsortie ENDIF else BEGIN if leapyr year then mmdd 0629 else mmdd 0630 numsort numsortie 36 endelse case 1 of year lt 10: s_year 0 string format i1 year year lt 100 and year ge 10 :s_year string format i2 year year ge 100: s_year string format i2 year 1900 year LT 2000 endcase numfich year anneedepart 2 7 mmdd ne 0101 s_date s_year mmdd if numfich lt 10 then numfich 0 string format i1 numfich else numfich string format i2 numfich gestion du nom de la grille en testant les differentes possibilites et ouverture du fichier if keyword_set grille then begin vargrid grille nomfich prefix numfich s_date grid vargrid nc IF version OS_FAMILY EQ unix THEN spawn file iodir nomfich dev null cdfid ncdf_open iodir nomfich varcontient ncdf_varinq cdfid nom endif else begin liste des fichiers pouvant convenir quelsfichiers findfile iodir prefix numfich s_date grid IF quelsfichiers 0 EQ THEN BEGIN liste vide if keyword_set bavard then ras report LES FICHIERS: iodir prefix numfich s_date grid n existe pas return 1 ENDIF for i 0 n_elements quelsfichiers 1 do begin IF version OS_FAMILY EQ unix THEN spawn file quelsfichiers i dev null cdfid ncdf_open quelsfichiers i contient ncdf_inquire cdfid for varid 0 contient nvars 1 do BEGIN ds les fichiers existants on varcontient ncdf_varinq cdfid varid cherche le nom des variables if varcontient name eq nom then BEGIN vargrid strmid quelsfichiers i strpos quelsfichiers i grid 5 1 nom de grille goto grilletrouvee ENDIF endfor ncdf_close cdfid endfor if keyword_set bavard then ras report La variable nom n existe pas ds les fichiers iodir prefix numfich s_date grid return 1 endelse grilletrouvee: lecture de certains attributs ncdf_attget cdfid nom title value varname string value ncdf_attget cdfid nom units value varunit string value if rstrpos varname eq 1 then varname varname varunit if month lt 10 then s_month 0 string format i1 month else s_month string format i2 month if day lt 10 then s_day 0 string format i1 day else s_day string format i2 day vardate s_year s_month s_day ncdf_attget cdfid file_name value global varexp string value 0: where value EQ byte 0 0 1 extraction du tableau qui nous interesse determination du domaine geographique if keyword_set tout then begin nx jpi ny jpj nz jpk premierx 0 premiery 0 premierz 0 endif else BEGIN redefinition eventuelle du domaine ajuste a boite a 6 elements on recupere la dim du nouveau domaine if keyword_set boite then BEGIN Case N_Elements Boite Of 1:Domdef lon1 lon2 lat1 lat2 0 boite 0 GRILLE vargrid _EXTRA ex 2:Domdef lon1 lon2 lat1 lat2 boite 0 boite 1 GRILLE vargrid _EXTRA ex 4:Domdef Boite prof1 prof2 GRILLE vargrid _EXTRA ex 5:Domdef Boite 0:3 0 Boite 4 GRILLE vargrid _EXTRA ex 6:Domdef Boite GRILLE vargrid _EXTRA ex Else: return report Mauvaise Definition de Boite endcase ENDIF grille mask glam gphi gdep nx ny nz premierx premiery premierz dernierx derniery dernierz ENDELSE determination du nombre de pas de tps a extraire ds ce fichier if nbretps gt 36 1 mmdd ne 0101 numsort 1 then nt 36 1 mmdd ne 0101 numsort 1 else nt nbretps if varcontient ndims eq 3 then ncdf_varget cdfid nom res offset premierx premiery numsort 1 count nx ny nt else ncdf_varget cdfid nom res offset premierx premiery premierz numsort 1 count nx ny nz nt rappel en boucle de nlec si il faut ouvrir de nouveaux fichiers pour constituer la serie temporelle if nbretps gt 36 1 mmdd ne 0101 numsort 1 then begin if mmdd ne 0101 then year year 1 if varcontient ndims eq 3 then res res nlec5j nom 1 36 mmdd eq 0101 nbretps nt tout tout GRILLE vargrid BOITE boite ELSE BEGIN res res nlec5j nom 1 36 mmdd eq 0101 nbretps nt tout tout GRILLE vargrid BOITE boite res reform res nx ny nz nbretps over ENDELSE ncdf_varget cdfid time_counter temps offset numsort 1 count nt time long temps julday 1 5 1979 time jpt nt jpt endif else BEGIN ncdf_varget cdfid time_counter temps offset numsort 1 count nt time long temps julday 1 5 1979 jpt nt endelse ncdf_close cdfid return res end"); a[99] = new Array("./Obsolete/nlecan.html", "nlecan.pro", "", " file_comments lit les moyennes annuelles sur maia: u rech eee reee217 TOTEM REF OUTPUTS obsolete categories Reading examples IDL res nlecan nom numsortie79 nbretps param nom in required nom du tableau contenant le champ que l on veut le trouver avec ncdflec fichier var param numsortie79 in required le numero du pas de temps que l on veut sortir du fichier compte a partir de 1 a partir de 79 param nbretps in required nombre de pas de temps a extraire keyword BOITE boite sur laquelle integrer par defaut tt le domaine keyword GRILLE impose la grille a laquelle est rapporte le champ rq permet d aller plus vite ds la lecture keyword TOUT oblige a lire le tableau entier en non pas celui reduit a domdef keyword _EXTRA Used to pass keywords returns tableau 2d qd la serie ne fait que 1 pas de temps ou 3d valable ds 1 premier tps que pour les tableaux 2d uses common restrictions appele par nlec history Sebastien Masson smasson lodyc jussieu fr version Id: nlecan pro 371 2008 08 07 09:32:02Z pinsard function nlecan nom numsortie79 nbretps BOITE boite GRILLE grille TOUT tout _EXTRA ex REF moyenne annuelle grid T nc compile_opt idl2 strictarrsubs obsolete common res 1 anneedepart 1979 gestion du nom de la grille en testant les differentes possibilites et ouverture du fichier if keyword_set grille then begin vargrid grille nomfich prefix moyenne annuelle grid vargrid nc IF version OS_FAMILY EQ unix THEN spawn file iodir nomfich dev null cdfid ncdf_open iodir nomfich varcontient ncdf_varinq cdfid nom endif else begin liste des fichiers pouvant convenir quelsfichiers findfile iodir prefix moyenne annuelle grid IF quelsfichiers 0 EQ THEN liste vide return report LES FICHIERS: iodir prefix moyenne annuelle grid n existe pas for i 0 n_elements quelsfichiers 1 do begin IF version OS_FAMILY EQ unix THEN spawn file quelsfichiers i dev null cdfid ncdf_open quelsfichiers i contient ncdf_inquire cdfid for varid 0 contient nvars 1 do BEGIN ds les fichiers existants on varcontient ncdf_varinq cdfid varid cherche le nom des variables if varcontient name eq nom then BEGIN vargrid strmid quelsfichiers i strpos quelsfichiers i grid 5 1 nom de grille goto grilletrouvee ENDIF endfor ncdf_close cdfid endfor return report La variable nom n existe pas ds les fichiers iodir prefix moyenne annuelle grid endelse grilletrouvee: lecture de certains attributs et de l axe des temps ncdf_attget cdfid nom title value varname string value ncdf_attget cdfid nom units value varunit string value if rstrpos varname eq 1 then varname varname varunit varexp prefix lecture de l axe des temps ncdf_varget cdfid time_counter time offset numsortie79 1 count nbretps time long time julday 12 31 1978 jpt nbretps IF jpt EQ 1 THEN BEGIN caldat time 0 month day year case 1 of year lt 10: s_year 0 string format i1 year year lt 100 and year ge 10 :s_year string format i2 year year ge 100: s_year string format i2 year 1900 endcase vardate annee: s_year endif extraction du tableau qui nous interesse determination du domaine geographique if keyword_set tout then begin nx jpi ny jpj nz jpk glam 1 gphi 1 gdep 1 premierx 0 premiery 0 premierz 0 endif else BEGIN redefinition eventuelle du domaine ajuste a boite a 6 elements on recupere la dim du nouveau domaine if keyword_set boite then BEGIN Case N_Elements Boite Of 1:Domdef lon1 lon2 lat1 lat2 0 boite 0 GRILLE vargrid _EXTRA ex 2:Domdef lon1 lon2 lat1 lat2 boite 0 boite 1 GRILLE vargrid _EXTRA ex 4:Domdef Boite prof1 prof2 GRILLE vargrid _EXTRA ex 5:Domdef Boite 0:3 0 Boite 4 GRILLE vargrid _EXTRA ex 6:Domdef Boite GRILLE vargrid _EXTRA ex Else:return report Mauvaise Definition de Boite endcase ENDIF grille mask glam gphi gdep nx ny nz premierx premiery premierz ENDELSE if varcontient ndims eq 3 then ncdf_varget cdfid nom res offset premierx premiery numsortie79 1 count nx ny nbretps else ncdf_varget cdfid nom res offset premierx premiery premierz numsortie79 1 count nx ny nz nbretps ncdf_close cdfid return res end"); a[100] = new Array("./Obsolete/nlecmois.html", "nlecmois.pro", "", " file_comments lit les fichiers Net Cdf de moyenne mensuel de l experience TOTEM ECMWF qui sont sur maia: u rech eee reee217 TOTEM REF OUTPUTS obsolete keyword BOITE boite sur laquelle integrer par defaut tt le domaine keyword GRILLE impose la grille a laquelle est rapporte le champ rq permet d aller plus vite ds la lecture keyword TOUT oblige a lire le tableau entier en non pas celui reduit a domdef keyword _EXTRA Used to pass keywords uses common history Sebastien Masson smasson lodyc jussieu fr version Id: nlecmois pro 370 2008 08 07 07:59:15Z pinsard function nlecmois nom numsortie79 nbretps BOITE boite GRILLE grille TOUT tout _EXTRA ex REF moyenne mensuelle 79 81 grid T nc compile_opt idl2 strictarrsubs obsolete common res 1 annee du nom du 1er fichier annee floor floor numsortie79 1 12 3 3 79 gestion du nom de la grille en testant les differentes possibilites et ouverture du fichier if keyword_set grille then begin vargrid grille nomfich prefix moyenne mensuelle strtrim annee 1 strtrim annee 2 1 grid vargrid nc IF version OS_FAMILY EQ unix THEN spawn file iodir nomfich dev null cdfid ncdf_open iodir nomfich varcontient ncdf_varinq cdfid nom endif else begin liste des fichiers pouvant convenir quelsfichiers findfile iodir prefix moyenne mensuelle strtrim annee 1 strtrim annee 2 1 grid IF quelsfichiers 0 EQ THEN liste vide return report LES FICHIERS: iodir prefix moyenne mensuelle strtrim annee 1 strtrim annee 2 1 grid n existe pas for i 0 n_elements quelsfichiers 1 do begin IF version OS_FAMILY EQ unix THEN spawn file quelsfichiers i dev null cdfid ncdf_open quelsfichiers i contient ncdf_inquire cdfid for varid 0 contient nvars 1 do BEGIN ds les fichiers existants on varcontient ncdf_varinq cdfid varid cherche le nom des variables if varcontient name eq nom then BEGIN vargrid strmid quelsfichiers i strpos quelsfichiers i grid 5 1 nom de grille goto grilletrouvee ENDIF endfor ncdf_close cdfid endfor return report La variable nom n existe pas ds les fichiers iodir prefix moyenne mensuelle strtrim annee 1 strtrim annee 2 1 grid endelse grilletrouvee: lecture de certains attributs et de l axe des temps ncdf_attget cdfid nom title value varname string value ncdf_attget cdfid nom units value varunit string value if rstrpos varname eq 1 then varname varname varunit varexp prefix determination du domaine geographique if keyword_set tout then begin nx jpi ny jpj nz jpk premierx 0 premiery 0 premierz 0 endif else BEGIN redefinition eventuelle du domaine ajuste a boite a 6 elements on recupere la dim du nouveau domaine if keyword_set boite then BEGIN Case N_Elements Boite Of 1:Domdef lon1 lon2 lat1 lat2 0 boite 0 GRILLE vargrid _EXTRA ex 2:Domdef lon1 lon2 lat1 lat2 boite 0 boite 1 GRILLE vargrid _EXTRA ex 4:Domdef Boite prof1 prof2 GRILLE vargrid _EXTRA ex 5:Domdef Boite 0:3 0 Boite 4 GRILLE vargrid _EXTRA ex 6:Domdef Boite GRILLE vargrid _EXTRA ex Else:return report Mauvaise Definition de Boite endcase ENDIF grille mask glam gphi gdep nx ny nz premierx premiery premierz ENDELSE determination du nombre de pas de tps a extraire ds ce fichier numsortie numsortie79 12 annee 79 if nbretps numsortie 1 gt 36 then nt 36 numsortie 1 else nt nbretps numsortie numsortie79 12 annee 79 if varcontient ndims eq 3 then ncdf_varget cdfid nom res offset premierx premiery numsortie 1 count nx ny nt else ncdf_varget cdfid nom res offset premierx premiery premierz numsortie 1 count nx ny nz nt rappel en boucle de nlec si il faut ouvrir de nouveaux fichiers pour constituer la serie temporelle if nbretps gt 36 numsortie 1 then begin if varcontient ndims eq 3 then res res nlecmois nom numsortie79 nt nbretps nt tout tout GRILLE vargrid BOITE boite else BEGIN res res nlecmois nom numsortie79 nt nbretps nt tout tout GRILLE vargrid BOITE boite res reform res nx ny nz nbretps over ENDELSE ncdf_varget cdfid time_counter temps offset numsortie 1 count nt time long temps julday 12 31 1978 time jpt nt jpt endif else BEGIN ncdf_varget cdfid time_counter temps offset numsortie 1 count nt time long temps julday 12 31 1978 jpt nt endelse ncdf_close cdfid IF n_elements time EQ 1 THEN BEGIN caldat time m d y if m lt 10 then m 0 string format i1 m else m string format i2 m if n_elements langage EQ 0 then langage non definit if langage EQ gb then vardate strtrim y 1 string format C CMoA 31 m 1 ELSE vardate string format C CMoA 31 m 1 strtrim y 1 endif return res end"); a[101] = new Array("./Obsolete/nlecsaison.html", "nlecsaison.pro", "", " file_comments lit les moyennes annuelles sur maia: u rech eee reee217 TOTEM REF OUTPUTS obsolete categories Reading examples IDL res nlecsaison nom numsortie79 nbretps param nom in required nom du tableau contenant le champ que l on veut le trouver avec ncdflec fichier var param numsortie79 in required le numero du pas de temps que l on veut sortir du fichier compte a partir de 1 a partir de 79 param nbretps in required nombre de pas de temps a extraire keyword BOITE boite sur laquelle integrer par defaut tt le domaine keyword GRILLE impose la grille a laquelle est rapporte le champ rq permet d aller plus vite ds la lecture keyword TOUT oblige a lire le tableau entier en non pas celui reduit a domdef keyword _EXTRA Used to pass keywords returns tableau 2d qd la serie ne fait que 1 pas de temps ou 3d valable ds 1 premier tps que pour les tableaux 2d uses common restrictions appele par nlec history Sebastien Masson smasson lodyc jussieu fr version Id: nlecsaison pro 371 2008 08 07 09:32:02Z pinsard function nlecsaison nom numsortie79 nbretps BOITE boite GRILLE grille TOUT tout _EXTRA ex REF saisonnier climato grid T nc compile_opt idl2 strictarrsubs obsolete common res 1 anneedepart 1979 gestion du nom de la grille en testant les differentes possibilites et ouverture du fichier if keyword_set grille then begin vargrid grille nomfich prefix saisonnier climato grid vargrid nc IF version OS_FAMILY EQ unix THEN spawn file iodir nomfich dev null cdfid ncdf_open iodir nomfich varcontient ncdf_varinq cdfid nom endif else begin liste des fichiers pouvant convenir quelsfichiers findfile iodir prefix saisonnier climato grid IF quelsfichiers 0 EQ THEN liste vide return report LES FICHIERS: iodir prefix saisonnier climato grid n existe pas for i 0 n_elements quelsfichiers 1 do begin IF version OS_FAMILY EQ unix THEN spawn file quelsfichiers i dev null cdfid ncdf_open quelsfichiers i contient ncdf_inquire cdfid for varid 0 contient nvars 1 do BEGIN ds les fichiers existants on varcontient ncdf_varinq cdfid varid cherche le nom des variables if varcontient name eq nom then BEGIN vargrid strmid quelsfichiers i strpos quelsfichiers i grid 5 1 nom de grille goto grilletrouvee ENDIF endfor ncdf_close cdfid endfor return report La variable nom n existe pas ds les fichiers iodir prefix saisonnier climato grid endelse grilletrouvee: lecture de certains attributs et de l axe des temps ncdf_attget cdfid nom title value varname string value ncdf_attget cdfid nom units value varunit string value if rstrpos varname eq 1 then varname varname varunit varexp prefix lecture de l axe des temps ncdf_varget cdfid time_counter time offset numsortie79 1 count nbretps time long time julday 12 31 1978 jpt nbretps IF jpt EQ 1 THEN BEGIN IF numsortie79 EQ 13 THEN vardate CLIMATOLOGIE prefix ELSE begin vardate climato mensuelle strtrim numsortie79 1 endelse endif extraction du tableau qui nous interesse determination du domaine geographique if keyword_set tout then begin nx jpi ny jpj nz jpk glam 1 gphi 1 gdep 1 premierx 0 premiery 0 premierz 0 endif else BEGIN redefinition eventuelle du domaine ajuste a boite a 6 elements on recupere la dim du nouveau domaine if keyword_set boite then BEGIN CASE N_Elements Boite Of 1:Domdef lon1 lon2 lat1 lat2 0 boite 0 GRILLE vargrid _EXTRA ex 2:Domdef lon1 lon2 lat1 lat2 boite 0 boite 1 GRILLE vargrid _EXTRA ex 4:Domdef Boite prof1 prof2 GRILLE vargrid _EXTRA ex 5:Domdef Boite 0:3 0 Boite 4 GRILLE vargrid _EXTRA ex 6:Domdef Boite GRILLE vargrid _EXTRA ex Else:return report Mauvaise Definition de Boite endcase ENDIF grille mask glam gphi gdep nx ny nz premierx premiery premierz ENDELSE if varcontient ndims eq 3 then ncdf_varget cdfid nom res offset premierx premiery numsortie79 1 count nx ny nbretps else ncdf_varget cdfid nom res offset premierx premiery premierz numsortie79 1 count nx ny nz nbretps ncdf_close cdfid return res end"); a[102] = new Array("./Obsolete/nlecserie.html", "nlecserie.pro", "", " file_comments lit les series temporelles se rapportant a une variable sur maia: u rech eee reee217 TOTEM REF OUTPUTS obsolete categories Reading examples IDL res nlecserie nom date1 date2 param nom in required nom du tableau contenant le champ que l on veut le trouver avec ncdflec fichier var param date1 in required param date2 in required les dates vermairs qui delimitent la serie temporelle keyword BOITE boite sur laquelle integrer par defaut tt le domaine keyword GRILLE impose la grille a laquelle est rapporte le champ rq permet d aller plus vite ds la lecture keyword TOUT oblige a lire le tableau entier en non pas celui reduit a domdef keyword _EXTRA Used to pass keywords returns tableau 2d qd la serie ne fait que 1 pas de temps ou 3d valable ds 1 premier tps que pour les tableaux 2d uses common restrictions appele par nlec history Sebastien Masson smasson lodyc jussieu fr version Id: nlecserie pro 371 2008 08 07 09:32:02Z pinsard function nlecserie nom date1 date2 BOITE boite GRILLE grille TOUT tout _EXTRA ex REF sss grid T nc compile_opt idl2 strictarrsubs obsolete common res 1 anneedepart 1979 gestion du nom de la grille et ouverture du fichier liste des fichiers pouvant convenir quelsfichiers findfile iodir prefix nom grid IF quelsfichiers 0 EQ THEN BEGIN liste vide print LES FICHIERS: iodir prefix nom grid n existe pas return 1 ENDIF ELSE BEGIN vargrid strmid quelsfichiers 0 strpos quelsfichiers 0 grid 5 1 nom de grille IF version OS_FAMILY EQ unix THEN spawn file quelsfichiers 0 dev null cdfid ncdf_open quelsfichiers 0 ENDELSE lecture de certains attributs et de l axe des temps ncdf_attget cdfid nom title value varname string value ncdf_attget cdfid nom units value varunit string value if rstrpos varname eq 1 then varname varname varunit ncdf_attget cdfid file_name value global varexp string value varexp strmid varexp 0 strpos varexp lecture de l axe des temps en entier on ja reperer la place des dates debut et fin pour faire l extraction temporelle ncdf_varget cdfid time_counter time time long time julday 1 5 1979 debut where time EQ juldate date1 fin where time EQ juldate date2 debut where time EQ date1 fin where time EQ date2 if debut 0 EQ 1 then return report l axe des temps ne contient pas la date de debut strtrim date1 1 if fin 0 EQ 1 then return report l axe des temps ne contient pas la date de fin strtrim date2 1 time time debut 0 :fin 0 jpt fin 0 debut 0 1 IF jpt EQ 1 THEN BEGIN caldat time 0 month day year case 1 of year lt 10: s_year 0 string format i1 year year lt 100 and year ge 10 :s_year string format i2 year year ge 100: s_year string format i2 year 1900 endcase if month lt 10 then s_month 0 string format i1 month else s_month string format i2 month if day lt 10 then s_day 0 string format i1 day else s_day string format i2 day vardate s_year s_month s_day endif extraction du tableau qui nous interesse determination du domaine geographique if keyword_set tout then begin nx jpi ny jpj nz jpk premierx 0 premiery 0 premierz 0 endif else BEGIN redefinition eventuelle du domaine ajuste a boite a 6 elements on recupere la dim du nouveau domaine if keyword_set boite then BEGIN Case N_Elements Boite Of 1:Domdef lon1 lon2 lat1 lat2 0 boite 0 GRILLE vargrid _EXTRA ex 2:Domdef lon1 lon2 lat1 lat2 boite 0 boite 1 GRILLE vargrid _EXTRA ex 4:Domdef Boite prof1 prof2 GRILLE vargrid _EXTRA ex 5:Domdef Boite 0:3 0 Boite 4 GRILLE vargrid _EXTRA ex 6:Domdef Boite GRILLE vargrid _EXTRA ex Else:return report Mauvaise Definition de Boite endcase ENDIF grille mask glam gphi gdep nx ny nz premierx premiery ENDELSE ncdf_varget cdfid nom res offset premierx premiery debut 0 count nx ny fin 0 debut 0 1 ncdf_close cdfid return res end"); a[103] = new Array("./Obsolete/norme.html", "norme.pro", "", " file_comments calculate the norm of vectors field located on Arakawa C grid obsolete param COMPOSANTEU in required Matrix representing the zonal coordinates at U V point of a field of vectors A 2D xy 3D xyz or yt 4D xyzt or a structure readable by litchamp and containing a 2D xy 3D xyz or yt 4D xyzt array Note that the dimension of the array must suit the domain dimension param COMPOSANTEV in required Matrix representing the meridional coordinates at V U point of a field of vectors A 2D xy 3D xyz or yt 4D xyzt or a structure readable by litchamp and containing a 2D xy 3D xyz or yt 4D xyzt array Note that the dimension of the array must suit the domain dimension keyword BOXZOOM boxzoom on which do the average by default the domain selected by the last domdef done keyword DIREC t x y z xys xz yz xyz xt yt zt xyt xzt yzt xyzt Direction on which do averages returns A 2D xy 3D xyz or yt 4D xyzt Array uses common restrictions The norm is calculated on points T To do this calculation we average field U and V on points T before calculate the norme At the edge of coast and of domain we can not calculate fields U and V at points T that is why these points are at value values f_nan When we calculate on a reduce geographic domain field U and V have not necessarily the same number of point In this case we recut U and V to keep only common points We profit of this to redo a domdef which redefine a geographic domain on which fields U and V are extracted on same points To know what type of array we work with we test its size and dates gave by time 0 and time jpt 1 to know if thee is a temporal dimension Before to start norme make sure that time and jpt are defined how they have to examples To calculate the average of the norme of streams on all the domain between 0 and 50: IDL res norme un vn boxzoom 0 50 dir xyz history 9 6 1999 Sebastien Masson smasson lodyc jussieu fr December 2007: Sebastien Masson move to obsolete version Id: norme pro 371 2008 08 07 09:32:02Z pinsard FUNCTION norme composanteu composantev BOXZOOM boxzoom DIREC direc _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh cm_4data cm_4cal IF NOT keyword_set key_forgetold THEN BEGIN updatenew updatekwd ENDIF if keyword_set boxzoom then BEGIN Case 1 Of N_Elements Boxzoom Eq 1:bte lon1 lon2 lat1 lat2 0 boxzoom 0 N_Elements Boxzoom Eq 2:bte lon1 lon2 lat1 lat2 boxzoom 0 boxzoom 1 N_Elements Boxzoom Eq 4:bte Boxzoom vert1 vert2 N_Elements Boxzoom Eq 5:bte Boxzoom 0:3 0 Boxzoom 4 N_Elements Boxzoom Eq 6:bte Boxzoom Else: return report wrong number of element in Boxzoom ENDCASE domdef boxzoom ENDIF return norm composanteu composantev DIREC direc _EXTRA ex end"); a[104] = new Array("./Obsolete/strrepl.html", "strrepl.pro", "", " file_comments replace one or more character s string s in a string OBSOLETE you should better use strsed categories String param STR in required the string to be changed param ARG2 in required position of the character s to be replaced or a string to be changed in STR param RCHAR in required replacement character string returns another string restrictions Known shortcoming: if index is an array it must contain all valid elements only the first entry is checked examples Convert one letter into upper case IDL abc abcdefghijklmnopqrstuvwxyz IDL print strrepl abc strpos abc m M abcdefghijklMnopqrstuvwxyz Use with strwhere function IDL a abcabcabc IDL print strrepl a strwhere a a bc bc bc bc bc IDL print strrepl a bc eeee a eeee a eeee a eeee IDL print strrepl a b 0000 a0000ca0000ca0000 IDL print strrepl a toto 0000 abcabcabc history mgs 02 Jun 1998: VERSION 1 00 Copyright C 1998 Martin Schultz Harvard University This software is provided as is without any warranty whatsoever It may be freely used copied or distributed for non commercial purposes This copyright notice must be kept with any copy of this software If this software shall be used commercially or sold as part of a larger package please contact the author to arrange payment Bugs and comments should be directed to mgs io harvard edu with subject IDL routine strrepl sebastien Masson smlod ipsl jussieu fr version Id: strrepl pro 371 2008 08 07 09:32:02Z pinsard FUNCTION strrepl str arg2 rchar compile_opt idl2 strictarrsubs obsolete if n_elements str eq 0 then return convert strign and replace character to byte BStr byte str new byte rchar if size arg2 type EQ 7 then begin old byte arg2 index strpos str arg2 pos index while strpos str arg2 pos 1 NE 1 do BEGIN pos strpos str arg2 pos 1 index index pos ENDWHILE make sure index is in range if index 0 lt 0 OR index 0 ge n_elements BStr THEN return Str ENDIF ELSE BEGIN index arg2 if index 0 lt 0 OR index 0 ge n_elements BStr then return Str old BStr index 0 ENDELSE replace indexed characters in string nelenew n_elements new neleold n_elements old nindex n_elements index if nelenew neleold NE 1 then begin if index 0 EQ 0 then BStr NEW BStr index 0 neleold: n_elements BStr 1 ELSE BStr BStr 0:index 0 1 NEW BStr index 0 neleold: n_elements BStr 1 if nindex EQ 1 then return string BStr if nindex GT 2 then for i 1 nindex 2 do BStr BStr 0:index i i nelenew neleold 1 NEW BStr index i i nelenew neleold neleold: n_elements BStr 1 BStr BStr 0:index n_elements index 1 nindex 1 nelenew neleold 1 NEW ENDIF ELSE BStr index NEW return result as string return string BStr end"); a[105] = new Array("./Obsolete/vairdate.html", "vairdate.pro", "", " file_comments gives vairmer date equivalent of a date in julian format sets month day and year to the corresp values you better use jul2date obsolete examples IDL vdate vairdate 1755087 param jdate in required date en jours juliens keyword MENSUEL a activer si on veut pour que les dates dont le jour est 15 deviennent avec un jour egale a 0 par ex: 19990115 19990100 keyword ANNUEL a activer si on veut pour que les dates dont le mois est 6 et dont le jour est 1 deviennent avec un mois et jour egale a 0 par ex: 19990601 19990000 keyword _EXTRA Used to pass keywords returns vdate date vairmer plus year month et day uses common history Jerome Vialard jv lodyc jussieu fr 2 7 98 13 9 1999 Sebastien Masson smasson lodyc jussieu fr ANNUEL MENSUEL _EXTRA et possibilite d utiliser vairdate avec des scalaire ou des tableaux version Id: vairdate pro 371 2008 08 07 09:32:02Z pinsard function vairdate jdate ANNUEL annuel MENSUEL mensuel _EXTRA ex compile_opt idl2 strictarrsubs obsolete common caldat jdate month day year _EXTRA ex index where year eq 1 if index 0 NE 1 then year index 0 if keyword_set mensuel THEN BEGIN index where day EQ 15 if index 0 NE 1 then day index 0 endif if keyword_set annuel THEN BEGIN index where day EQ 1 AND month EQ 6 if index 0 NE 1 then BEGIN day index 0 month index 0 endif endif return 10000L year 100L month day end "); a[106] = new Array("./Obsolete/vraidate.html", "vraidate.pro", "", " file_comments donne la date en long obsolete param date in required une date du type yyyymmdd keyword GRADS if 1 le year le 49 then year 2000 year if 50 le year le 99 then year 1900 year keyword _EXTRA Used to pass keywords returns une date vairmer du type yyyymmdd si year est nulle ou egale a 1 ne change rien examples IDL res vraidate date IDL vraidate 980703 donne 19980703 qui est un long history Sebastien Masson smasson lodyc jussieu fr 3 7 98 remove automatic change from year 1 to 1901 Aug 2004 version Id: vraidate pro 371 2008 08 07 09:32:02Z pinsard function vraidate date GRADS grads _EXTRA ex compile_opt idl2 strictarrsubs obsolete IF NOT keyword_set GRADS THEN return long date date long date annee date 10000 return date 19000000L annee GE 50 and date lt 1000000 20000000L annee LT 50 and date lt 1000000 end"); a[107] = new Array("./Obsolete/zeroun.html", "zeroun.pro", "", " file_comments Send back a vector or a matrix constituate of 0 and 1 in alternation you better use zero_one obsolete categories Function Matrix param n1 in required number of elements in the first dimension param n2 in required number of elements in the second dimension returns resultat history Sebastien Masson smasson lodyc jussieu fr 1 12 98 version Id: zeroun pro 325 2007 12 06 10:04:53Z pinsard FUNCTION zeroun n1 n2 compile_opt idl2 strictarrsubs case n_params of 0:return zero_one 1:return zero_one n1 2:return zero_one n1 n2 endcase end"); a[108] = new Array("./Picture/image_viewer.html", "image_viewer.pro", "", " file_comments The purpose of this program is to provide an interactive tool that can be used to view JPEG BMP GIF PNG and TIFF picture files Images are loaded into memory so the initial file access may take a while but once each picture has been opened they can all be viewed in a very rapid fashion categories Visualization Widget param EVENT in required restrictions While this program is running in an IDL session it will change the current working directory enables disables color decomposition and sets QUIET 1 ORDER 0 P BACKGROUND 0 These settings are returned to their initial settings before the program was initiated once it is terminated restrictions This program is supported in IDL version 5 5 and newer In order to open GIF files or TIFF files with LZW compression the copy of IDL being used must be licensed with these features IDL only supports BMP files in the standard Windows format and does not support OS2 bitmaps history Written by: AEB 1 02 version Id: image_viewer pro 325 2007 12 06 10:04:53Z pinsard _ PRO image_viewer_open_files event THIS PROCEDURE IS CALLED WHEN A USER SELECTS File Open Picture Files FROM THE MAIN MENU compile_opt idl2 strictarrsubs error handling: ERROR_STATE CODE 0 CATCH error if error NE 0 then begin HELP LAST_MESSAGE OUTPUT traceback messageStr Error Caught : traceback dummy DIALOG_MESSAGE messageStr ERROR if status report dialog is still active destroy it: if SIZE tlb TYPE NE 0 then WIDGET_CONTROL tlb DESTROY RETURN endif obtain state structure for top level base from its UVALUE: WIDGET_CONTROL event top GET_UVALUE pState prompt user to select files with native file selection dialog: if pState gifFlag EQ 1 then filter JPG jpg JPEG jpeg JPE jpe JFIF jfif GIF gif BMP bmp TIF tif TIFF tiff PNG png else filter JPG jpg JPEG jpeg JPE jpe JFIF jfif BMP bmp TIF tif TIFF tiff PNG png files DIALOG_PICKFILE TITLE Select picture files to open MULTIPLE_FILES FILTER filter GET_PATH path if user hit Cancel then return to previous program level: if files 0 EQ then RETURN change current working directory to location of selected files: CD path nFiles N_ELEMENTS files pState nFiles nFiles pState increment 100 nFiles files files SORT files create status report dialog: xCenter pState screenSize 0 2 yCenter pState screenSize 1 2 tlb2 WIDGET_BASE TITLE Status Report COLUMN ALIGN_CENTER TLB_FRAME_ATTR 19 MODAL GROUP_LEADER pState tlb spacer WIDGET_LABEL tlb2 VALUE label1 WIDGET_LABEL tlb2 VALUE LOADING SELECTED IMAGE FILES INTO MEMORY spacer WIDGET_LABEL tlb2 VALUE label2 WIDGET_LABEL tlb2 VALUE PLEASE WAIT spacer WIDGET_LABEL tlb2 VALUE statusBase WIDGET_BASE tlb2 ROW FRAME BASE_ALIGN_CENTER ALIGN_CENTER EVENT_PRO image_viewer_timer cancelBut WIDGET_BUTTON statusBase VALUE Cancel EVENT_PRO image_viewer_cancel progressLabel WIDGET_LABEL statusBase Value Progress : 0 statusSlider WIDGET_SLIDER statusBase SENSITIVE 0 TITLE XSIZE 200 percentLabel WIDGET_LABEL statusBase VALUE 100 geom WIDGET_INFO tlb2 GEOMETRY xHalfSize geom Scr_XSize 2 yHalfSize geom Scr_YSize 2 WIDGET_CONTROL tlb2 XOFFSET xCenter xHalfSize YOFFSET yCenter yHalfSize WIDGET_CONTROL tlb2 REALIZE pState statusBase statusBase pState statusSlider statusSlider WIDGET_CONTROL tlb2 SET_UVALUE pState reset settings of GUI: WIDGET_CONTROL pState fileText SET_VALUE WIDGET_CONTROL pState imageDraw GET_VALUE drawID WSET drawID TVLCT 0 0 0 0 ERASE re create thumbnails base with appropriate size for number of images selected: nRows CEIL nFiles 3 0 WIDGET_CONTROL pState thumbBase DESTROY pState thumbBase WIDGET_BASE pState controlsBase COLUMN ALIGN_TOP FRAME XSIZE 260 YSIZE nRows 89 SCROLL X_SCROLL_SIZE 260 Y_SCROLL_SIZE 650 initialize pointer array to reference image data: numImages N_ELEMENTS pState images if numImages NE 0 then PTR_FREE pState images pState images PTRARR nFiles ALLOCATE_HEAP pState files files loop through each file: pState timer 1B WIDGET_CONTROL statusBase TIMER 0 01 END param event in required PRO image_viewer_open_folder event THIS PROCEDURE IS CALLED WHEN A USER SELECTS File Open All In Folder FROM THE MAIN MENU compile_opt idl2 strictarrsubs error handling: ERROR_STATE CODE 0 CATCH error if error NE 0 then begin HELP LAST_MESSAGE OUTPUT traceback messageStr Error Caught : traceback dummy DIALOG_MESSAGE messageStr ERROR if status report dialog is still active destroy it: if SIZE tlb TYPE NE 0 then WIDGET_CONTROL tlb DESTROY RETURN endif obtain state structure for top level base from its UVALUE: WIDGET_CONTROL event top GET_UVALUE pState prompt user to select files with native file selection dialog: folder DIALOG_PICKFILE TITLE Select folder that contains picture files DIRECTORY if user hit Cancel then return to previous program level: if folder EQ then RETURN change current working directory to location of selected files: CD folder if pState gifFlag EQ 1 then filter JPG JPEG JPE JFIF GIF BMP TIF TIFF PNG else filter JPG JPEG JPE JFIF BMP TIF TIFF PNG files FILE_SEARCH filter COUNT nFiles FOLD_CASE FULLY_QUALIFY_PATH NOSORT if nFiles EQ 0 then begin dummy DIALOG_MESSAGE No valid picture files were found in the selected folder INFO RETURN endif pState nFiles nFiles pState increment 100 nFiles files files SORT files create status report dialog: xCenter pState screenSize 0 2 yCenter pState screenSize 1 2 tlb2 WIDGET_BASE TITLE Status Report COLUMN ALIGN_CENTER TLB_FRAME_ATTR 19 MODAL GROUP_LEADER pState tlb spacer WIDGET_LABEL tlb2 VALUE label1 WIDGET_LABEL tlb2 VALUE LOADING SELECTED IMAGE FILES INTO MEMORY spacer WIDGET_LABEL tlb2 VALUE label2 WIDGET_LABEL tlb2 VALUE PLEASE WAIT spacer WIDGET_LABEL tlb2 VALUE statusBase WIDGET_BASE tlb2 ROW FRAME BASE_ALIGN_CENTER ALIGN_CENTER EVENT_PRO image_viewer_timer cancelBut WIDGET_BUTTON statusBase VALUE Cancel EVENT_PRO image_viewer_cancel progressLabel WIDGET_LABEL statusBase Value Progress : 0 statusSlider WIDGET_SLIDER statusBase SENSITIVE 0 TITLE XSIZE 200 percentLabel WIDGET_LABEL statusBase VALUE 100 geom WIDGET_INFO tlb2 GEOMETRY xHalfSize geom Scr_XSize 2 yHalfSize geom Scr_YSize 2 WIDGET_CONTROL tlb2 XOFFSET xCenter xHalfSize YOFFSET yCenter yHalfSize WIDGET_CONTROL tlb2 REALIZE pState statusBase statusBase pState statusSlider statusSlider WIDGET_CONTROL tlb2 SET_UVALUE pState reset settings of GUI: WIDGET_CONTROL pState fileText SET_VALUE WIDGET_CONTROL pState imageDraw GET_VALUE drawID WSET drawID TVLCT 0 0 0 0 ERASE re create thumbnails base with appropriate size for number of images selected: nRows CEIL nFiles 3 0 WIDGET_CONTROL pState thumbBase DESTROY pState thumbBase WIDGET_BASE pState controlsBase COLUMN ALIGN_TOP FRAME XSIZE 260 YSIZE nRows 89 SCROLL X_SCROLL_SIZE 260 Y_SCROLL_SIZE 650 initialize pointer array to reference image data: numImages N_ELEMENTS pState images if numImages NE 0 then PTR_FREE pState images pState images PTRARR nFiles ALLOCATE_HEAP pState files files loop through each file: pState timer 1B WIDGET_CONTROL statusBase TIMER 0 01 END param event in required PRO image_viewer_cancel event compile_opt idl2 strictarrsubs obtain state structure for top level base from its UVALUE: WIDGET_CONTROL event top GET_UVALUE pState shut off timer: pState timer 0B END param event in required PRO image_viewer_timer event compile_opt idl2 strictarrsubs obtain state structure for top level base from its UVALUE: WIDGET_CONTROL event top GET_UVALUE pState if pState timer EQ 1 then begin continue processing files: if pState currFile LE pState nFiles 1 then begin i pState currFile extension STRUPCASE STRMID pState files i STRPOS pState files i REVERSE_SEARCH 1 if extension EQ JPG or extension EQ JPEG or extension EQ JPE or extension EQ JFIF then begin result QUERY_JPEG pState files i info if result NE 1 then begin dummy DIALOG_MESSAGE Selected file: pState files i does not appear to be a valid JPEG file ERROR if i MOD 3 EQ 0 then pState rowBase WIDGET_BASE pState thumbBase ROW ALIGN_LEFT if pState currFile EQ pState nFiles 1 then begin last file terminate timer: pState timer 0B pState currFile 0L WIDGET_CONTROL event top DESTROY endif else begin increment file number and update progress slider: pState currFile pState currFile 1 progressValue ROUND i 1 pState increment Exit FROM THE MAIN MENU terminate the program by destroying the top level base widgetID always stored in event top : WIDGET_CONTROL event top DESTROY END param event in required PRO image_viewer_help event THIS PROCEDURE IS CALLED WHEN A USER SELECTS Help Help on IMAGE_VIEWER FROM THE MAIN MENU compile_opt idl2 strictarrsubs display a simple message: messageStr IMAGE_VIEWER written by AEB 2002 The purpose of this program is to provide an interactive tool that can be used to view JPEG BMP GIF PNG and TIFF picture files In order to provide rapid viewing capabilities the images are loaded into memory which can cause the initial file access to take a bit of time while the pictures are opened and thumbnails are created dummy DIALOG_MESSAGE messageStr info END param event in required PRO image_viewer_thumbs event THIS PROCEDURE IS CALLED WHEN A USER CLICKS ON ONE OF THE THUMBNAIL PICTURES compile_opt idl2 strictarrsubs error handling: ERROR_STATE CODE 0 CATCH error if error NE 0 then begin HELP LAST_MESSAGE OUTPUT traceback messageStr Error Caught : traceback dummy DIALOG_MESSAGE messageStr ERROR RETURN endif if event press EQ 1 then begin WIDGET_CONTROL HOURGLASS obtain state structure for top level base from its UVALUE: WIDGET_CONTROL event top GET_UVALUE pState WIDGET_CONTROL pState imageDraw GET_VALUE drawID WSET drawID TVLCT 0 0 0 0 ERASE obtain current image data: WIDGET_CONTROL event id GET_UVALUE fileID imageStruct pState images fileID 1 xOffset ROUND 710 imageStruct xSize 2 yOffset ROUND 650 imageStruct ySize 2 if pState colorMode EQ PSEUDO then begin TVLCT imageStruct red imageStruct green imageStruct blue TV TEMPORARY imageStruct image xOffset yOffset endif else begin pState colorMode EQ TRUE : if imageStruct imageColorMode EQ PSEUDO then begin DEVICE DECOMPOSED 0 TVLCT imageStruct red imageStruct green imageStruct blue TV TEMPORARY imageStruct image xOffset yOffset endif else begin imageStruct imageColorMode EQ TRUE : DEVICE DECOMPOSED 1 TV TEMPORARY imageStruct image xOffset yOffset TRUE 1 endelse endelse WIDGET_CONTROL pState fileText SET_VALUE pState files fileID 1 endif END param widgetID in required PRO image_viewer_cleanup widgetID THIS PROCEDURE IS CALLED WHEN THE PROGRAM IS TERMINATED AND XMANAGER REGISTERS A CLEANUP: compile_opt idl2 strictarrsubs obtain state structure for top level base from its uvalue: WIDGET_CONTROL widgetID GET_UVALUE pState test for validity of state structure pointer: if PTR_VALID pState then begin reset original settings: QUIET pState quietInit ORDER pState orderInit P BACKGROUND pState backInit CD pState currentDir DEVICE DECOMPOSED pState dc TVLCT pState r pState g pState b cleanup heap memory: PTR_FREE TEMPORARY pState files numImages N_ELEMENTS pState images if numImages NE 0 then PTR_FREE pState images PTR_FREE TEMPORARY pState images PTR_FREE TEMPORARY pState endif END param event in required PRO image_viewer_event event THIS PROCEDURE IS CALLED WHEN A USER RESIZES THE TOP LEVEL BASE compile_opt idl2 strictarrsubs error handling: ERROR_STATE CODE 0 CATCH error if error NE 0 then begin HELP LAST_MESSAGE OUTPUT traceback messageStr Error Caught : traceback dummy DIALOG_MESSAGE messageStr ERROR RETURN endif obtain state structure for top level base from its UVALUE: WIDGET_CONTROL event top GET_UVALUE pState reset widget size: WIDGET_CONTROL event top XSIZE pState tlbWidth YSIZE pState tlbHeight XOFFSET 0 YOFFSET 0 END PRO image_viewer compile_opt idl2 strictarrsubs error handling: ERROR_STATE CODE 0 CATCH error if error NE 0 then begin HELP LAST_MESSAGE OUTPUT traceback messageStr Error Caught : traceback dummy DIALOG_MESSAGE messageStr ERROR QUIET quietInit ORDER orderInit P BACKGROUND backInit CD currentDir RETURN endif ignore beta and development build versions of IDL because string to float conversion will fail: betaTest STRPOS STRLOWCASE VERSION RELEASE beta buildTest STRPOS STRLOWCASE VERSION RELEASE build check to make sure the version of IDL running is 5 5 or newer: if betaTest EQ 1 and buildTest EQ 1 then begin if FLOAT VERSION RELEASE LT 5 5 then begin dummy dialog_message IMAGE_VIEWER is only supported in IDL version 5 5 or newer ERROR RETURN endif endif check to make sure there is adequate real estate: DEVICE GET_SCREEN_SIZE screenSize if LONG screenSize 0 screenSize 1 LT 786432 then begin messageStr IMAGE_VIEWER requires the computer monitor Display to be configured in 1024 x 768 mode or better dummy DIALOG_MESSAGE messageStr RETURN endif check in auxiliary license: result LMGR idl_tifflzw VERSION 1 0 result LMGR idl_gif VERSION 1 0 gifFlag 1B if result NE 1 then begin messageStr The ability to read GIF and TIFF LZW compressed images requires an auxiliary license in order to conform with the patent rights of the Unisys Corporation IMAGE_VIEWER was unable to find the required license in this installation Consequently the ability to read GIF files will be disabled dummy DIALOG_MESSAGE messageStr gifFlag 0B endif warn users of color flashing if monitor in PseudoColor mode: if D N_COLORS LE 256 then begin messageStr The computer monitor Display is currently configured in 8 bit 256 Colors PseudoColor mode Due to the dynamic read write nature of the colormap system for this visual when a colortable is loaded for an image it affects all visible graphics windows including the thumbnails of other images This can lead to a phenomenon known as color flashing If possible it is recommended that you exit this program reconfigure your monitor in 24 bit TrueColor mode or better and restart IMAGE_VIEWER dummy DIALOG_MESSAGE messageStr endif obtain the current working directory: CD CURRENT currentDir if STRUPCASE VERSION OS_FAMILY EQ WINDOWS then begin executeStr cd USERPROFILE My Documents My Pictures cd SPAWN executeStr pathInit HIDE pathInit pathInit 0 result FILE_TEST pathInit READ if result EQ 1 then begin CD pathInit endif else begin result FILE_TEST C: My Documents My Pictures READ if result EQ 1 then begin CD C: My Documents My Pictures endif else begin result FILE_TEST C: READ if result EQ 1 then CD C: endelse endelse endif suppress informational messaging: quietInit QUIET QUIET 1 make sure color decomposition is disabled: DEVICE GET_DECOMPOSED dc if D N_COLORS GT 256 then colorMode TRUE else colorMode PSEUDO obtain the current color table: TVLCT r g b GET LOADCT 0 SILENT force ORDER 0: orderInit ORDER ORDER 0 force P BACKGROUND 0: backInit P BACKGROUND P BACKGROUND 0 create GUI: tlb WIDGET_BASE TITLE Image Viewer ROW MBAR menuBar TLB_SIZE_EVENTS XOFFSET 0 YOFFSET 0 fileMenu WIDGET_BUTTON menuBar VALUE File MENU fileBttn1 WIDGET_BUTTON fileMenu VALUE Open Picture Files EVENT_PRO image_viewer_open_files fileBttn2 WIDGET_BUTTON fileMenu VALUE Open All In Folder EVENT_PRO image_viewer_open_folder fileBttn3 WIDGET_BUTTON fileMenu VALUE Exit EVENT_PRO image_viewer_exit helpMenu WIDGET_BUTTON menuBar VALUE Help MENU helpBttn1 WIDGET_BUTTON helpMenu VALUE Help on IMAGE_VIEWER EVENT_PRO image_viewer_help controlsBase WIDGET_BASE tlb COLUMN FRAME ALIGN_TOP labelBase WIDGET_BASE controlsBase COLUMN SCR_XSIZE 280 thumbLabel WIDGET_LABEL labelBase ALIGN_CENTER VALUE CLICK ON THUMBNAIL TO VIEW IMAGE thumbBase WIDGET_BASE controlsBase COLUMN ALIGN_TOP FRAME XSIZE 260 YSIZE 700 SCROLL X_SCROLL_SIZE 260 Y_SCROLL_SIZE 650 imageBase WIDGET_BASE tlb COLUMN FRAME ALIGN_TOP fileBase WIDGET_BASE imageBase ROW ALIGN_CENTER fileLabel WIDGET_LABEL fileBase VALUE Current Image File fileText WIDGET_TEXT fileBase XSIZE 75 YSIZE 1 imageDraw WIDGET_DRAW imageBase XSIZE 710 YSIZE 650 RETAIN 2 display the GUI on the computer monitor: WIDGET_CONTROL tlb REALIZE obtain the top level base geometry: tlbGeom WIDGET_INFO tlb GEOMETRY tlbWidth tlbGeom xsize tlbHeight tlbGeom ysize if tlbWidth EQ 0 or tlbHeight EQ 0 then begin WIDGET_CONTROL tlb TLB_GET_SIZE tlbSize tlbWidth tlbSize 0 tlbHeight tlbSize 1 endif create state structure to store information needed by the other event handling procedures: pState PTR_NEW files:PTR_NEW ALLOCATE_HEAP images:PTR_NEW ALLOCATE_HEAP screenSize:screenSize quietInit:quietInit orderInit:orderInit tlb:tlb statusBase:0L controlsBase:controlsBase thumbBase:thumbBase fileText:fileText timer:0B nFiles:0L currentDir:currentDir imageDraw:imageDraw dc:dc r:r g:g b:b gifFlag:gifFlag statusSlider:0L backInit:backInit colorMode:colorMode tlbWidth:tlbWidth tlbHeight:tlbHeight currFile:0L rowBase:0L increment:0 0 store this state structure in the uvalue of the top level base so it can be obtained by other program units: WIDGET_CONTROL tlb SET_UVALUE pState register the GUI with the XMANAGER event handler routine: XMANAGER image_viewer tlb CLEANUP image_viewer_cleanup END"); a[109] = new Array("./Picture/imdisp.html", "imdisp.pro", "", " hidden FUNCTION imdisp_getpos ASPECT POSITION POSITION MARGIN MARGIN compile_opt idl2 strictarrsubs Compute a position vector given an aspect ratio called by IMDISP_IMSIZE Check arguments if n_params ne 1 then message Usage: RESULT IMDISP_GETPOS ASPECT if n_elements aspect eq 0 then message ASPECT is undefined Check keywords if n_elements position eq 0 then position 0 0 0 0 1 0 1 0 if n_elements margin eq 0 then margin 0 1 Get range limited aspect ratio and margin input values aspect_val float aspect 0 0 01 0 0 0L y0 round position 1 d y_vsize 0L Compute size of image device units xsize round position 2 position 0 d x_vsize 2L ysize round position 3 position 1 d y_vsize 2L Recompute the image position based on actual image size position fltarr 4 position 0 x0 float d x_vsize position 1 y0 float d y_vsize position 2 x0 xsize float d x_vsize position 3 y0 ysize float d y_vsize END file_comments Display an image on the current graphics device IMDISP is an advanced replacement for TV and TVSCL Supports WIN MAC X CGM PCL PRINTER PS and Z graphics devices Image is automatically byte scaled can be disabled Custom byte scaling of Pseudo color images via the RANGE keyword Pseudo indexed color and True color images are handled automatically 8 bit and 24 bit graphics devices are handled automatically Decomposed color settings are handled automatically Image is automatically sized to fit the display can be disabled The P MULTI system variable is honored for multiple image display Image can be positioned via the POSITION keyword Color table splitting via the BOTTOM and NCOLORS keywords Image aspect ratio customization via the ASPECT keyword Resized images can be resampled default or interpolated Top down image display via the ORDER keyword ORDER is ignored Selectable display channel R G B via the CHANNEL keyword Background can be set to a specified color via the BACKGROUND keyword Screen can be erased prior to image display via the ERASE keyword Plot axes can be drawn on the image via the AXIS keyword Photographic negative images can be displayed via the NEGATIVE keyword categories Picture param IMAGE in required Array containing image data Pseudo indexed color images must have 2 dimensions True color images must have 3 dimensions in either 3 NX NY NX 3 NY or NX NY 3 form keyword RANGE type vector default min and max array values For Pseudo Color images only a vector with two elements specifying the minimum and maximum values of the image array to be considered when the image is byte scaled This keyword is ignored for True Color images or if the NOSCALE keyword is set keyword BOTTOM default 0 Bottom value in the color table to be used for the byte scaled image This keyword is ignored if the NOSCALE keyword is set keyword NCOLORS default D TABLE_SIZE BOTTOM Number of colors in the color table to be used for the byte scaled image This keyword is ignored if the NOSCALE keyword is set keyword MARGIN default 0 1 or 0 025 if P MULTI is set to display multiple images A scalar value specifying the margin to be maintained around the image in normal coordinates keyword INTERP default nearest neighbor sampling If set the resized image will be interpolated using bilinear interpolation keyword DITHER default no dithering If set true color images will be dithered when displayed on an 8 bit graphics device keyword ASPECT default maintain native aspect ratio A scalar value specifying the aspect ratio height width for the displayed image keyword POSITION default 0 0 0 0 1 0 1 0 On input a 4 element vector specifying the position of the displayed image in the form X0 Y0 X1 Y1 in in normal coordinates See the examples below to display an image where only the offset and size are known e g MAP_IMAGE output keyword OUT_POS On output a 4 element vector specifying the position actually used to display the image keyword NOSCALE default to byte scale the image If set the image will not be byte scaled keyword NORESIZE default To resize the image to fit the display If set the image will not be resized keyword ORDER default To display the image from the bottom up If set the image is displayed from the top down Note that the system variable ORDER is always ignored keyword USEPOS default To honor ASPECT and MARGIN when POSITION vector is supplied If set the image will be sized to exactly fit a supplied POSITION vector over riding ASPECT and MARGIN keyword CHANNEL Display channel Red Green or Blue to be written 0 All channels the default 1 Red channel 2 Green channel 3 Blue channel This keyword is only recognized by graphics devices which support 24 bit decomposed color WIN MAC X It is ignored by all other graphics devices However True color RGB images can be displayed on any device supported by IMDISP keyword BACKGROUND If set to a positive integer the background will be filled with the color defined by BACKGROUND keyword ERASE If set the screen contents will be erased Note that if P MULTI is set to display multiple images the screen is always erased when the first image is displayed keyword AXIS If set plot axes will be drawn on the image The default x and y axis ranges are determined by the size of the image When the AXIS keyword is set IMDISP accepts any keywords supported by PLOT e g TITLE COLOR CHARSIZE etc keyword NEGATIVE If set a photographic negative of the image is displayed The values of BOTTOM and NCOLORS are honored This keyword allows True color images scanned from color negatives to be displayed It also allows Pseudo color images to be displayed as negatives without reversing the color table This keyword is ignored if the NOSCALE keyword is set restrictions The image is displayed on the current graphics device restrictions Requires IDL 5 0 or higher square bracket array syntax examples Load test data openr lun filepath ctscan dat subdir examples data get_lun ctscan bytarr 256 256 readu lun ctscan free_lun lun openr lun filepath hurric dat subdir examples data get_lun hurric bytarr 440 330 readu lun hurric free_lun lun read_jpeg filepath rose jpg subdir examples data rose help ctscan hurric rose Display single images p multi 0 loadct 0 imdisp hurric erase wait 3 0 imdisp rose interp erase wait 3 0 Display multiple images without color table splitting works on 24 bit displays only top 2 images are garbled on 8 bit displays p multi 0 1 3 0 0 loadct 0 imdisp ctscan margin 0 02 loadct 13 imdisp hurric margin 0 02 imdisp rose margin 0 02 wait 3 0 Display multiple images with color table splitting works on 8 bit or 24 bit displays p multi 0 1 3 0 0 loadct 0 ncolors 64 bottom 0 imdisp ctscan margin 0 02 ncolors 64 bottom 0 loadct 13 ncolors 64 bottom 64 imdisp hurric margin 0 02 ncolors 64 bottom 64 imdisp rose margin 0 02 ncolors 64 bottom 128 wait 3 0 Display an image at a specific position over riding aspect and margin p multi 0 loadct 0 imdisp hurric position 0 0 0 0 1 0 0 5 usepos erase wait 3 0 Display an image with axis overlay p multi 0 loadct 0 imdisp rose axis erase wait 3 0 Display an image with contour plot overlay p multi 0 loadct 0 imdisp hurric out_pos out_pos erase contour smooth hurric 10 edge noerase position out_pos xstyle 1 ystyle 1 levels findgen 5 40 0 follow wait 3 0 Display a small image with correct resizing p multi 0 loadct 0 data dist 8 1:7 1:7 imdisp data erase wait 3 0 imdisp data interp wait 3 0 Display a true color image without and with interpolation p multi 0 imdisp rose erase wait 3 0 imdisp rose interp wait 3 0 Display a true color image as a photographic negative imdisp rose negative erase wait 3 0 Display a true color image on PostScript output note that color table is handled automatically current_device d name set_plot PS device color bits_per_pixel 8 filename imdisp_true ps imdisp rose axis title PostScript True Color Output device close set_plot current_device Display a pseudo color image on PostScript output current_device d name set_plot PS device color bits_per_pixel 8 filename imdisp_pseudo ps loadct 0 imdisp hurric axis title PostScript Pseudo Color Output device close set_plot current_device Display an image where only the offset and size are known Read world elevation data file filepath worldelv dat subdir examples data openr lun file get_lun data bytarr 360 360 readu lun data free_lun lun Reorganize array so it spans 180W to 180E world data world 0:179 data 180: world 180: data 0:179 Create remapped image map_set orthographic isotropic noborder remap map_image world x0 y0 xsize ysize compress 1 Convert offset and size to position vector pos fltarr 4 pos 0 x0 float d x_vsize pos 1 y0 float d y_vsize pos 2 x0 xsize float d x_vsize pos 3 y0 ysize float d y_vsize Display the image loadct 0 imdisp remap pos pos usepos map_continents map_grid history Liam Gumley ssec wisc edu Copyright C 1999 2000 Liam E Gumley This program is free software you can redistribute it and or modify it under the terms of the GNU General Public License as published by the Free Software Foundation either version 2 of the License or at your option any later version This program is distributed in the hope that it will be useful but WITHOUT ANY WARRANTY without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE See the GNU General Public License for more details You should have received a copy of the GNU General Public License along with this program if not write to the Free Software Foundation Inc 59 Temple Place Suite 330 Boston MA 02111 1307 USA version Id: imdisp pro 325 2007 12 06 10:04:53Z pinsard PRO imdisp IMAGE RANGE RANGE BOTTOM BOTTOM NCOLORS NCOLORS MARGIN MARGIN INTERP INTERP DITHER DITHER ASPECT ASPECT POSITION POSITION OUT_POS OUT_POS NOSCALE NOSCALE NORESIZE NORESIZE ORDER ORDER USEPOS USEPOS CHANNEL CHANNEL BACKGROUND BACKGROUND ERASE ERASE AXIS AXIS NEGATIVE NEGATIVE _EXTRA EXTRA_KEYWORDS compile_opt idl2 strictarrsubs rcs_id Id: imdisp pro 325 2007 12 06 10:04:53Z pinsard CHECK INPUT Check arguments if n_params ne 1 then message Usage: IMDISP IMAGE if n_elements image eq 0 then message Argument IMAGE is undefined if max p multi eq 0 then begin if n_elements margin eq 0 then begin if n_elements position eq 4 then margin 0 0 else margin 0 1 endif endif else begin if n_elements margin eq 0 then margin 0 025 endelse if n_elements order eq 0 then order 0 if n_elements channel eq 0 then channel 0 Check position vector if n_elements position gt 0 then begin if n_elements position ne 4 then message POSITION must be a 4 element vector of the form X0 Y0 X1 Y1 if position 0 lt 0 0 then message POSITION 0 must be GE 0 0 if position 1 lt 0 0 then message POSITION 1 must be GE 0 0 if position 2 gt 1 0 then message POSITION 2 must be LE 1 0 if position 3 gt 1 0 then message POSITION 3 must be LE 1 0 if position 0 ge position 2 then message POSITION 0 must be LT POSITION 2 if position 1 ge position 3 then message POSITION 1 must be LT POSITION 3 endif Check the image dimensions result size image ndims result 0 if ndims lt 2 or ndims gt 3 then message IMAGE must be a Pseudo Color 2D or True Color 3D image array dims result 1:ndims Check that 3D image array is in valid true color format true 0 if ndims eq 3 then begin index where dims eq 3L count if count eq 0 then message True Color dimensions must be 3 NX NY NX 3 NY or NX NY 3 true 1 truedim index 0 endif Check scaling range for pseudo color images if true eq 0 then begin if n_elements range eq 0 then begin min_value min image max max_value range min_value max_value endif if n_elements range ne 2 then message RANGE keyword must be a 2 element vector endif else begin if n_elements range gt 0 then message RANGE keyword is not used for True Color images continue endelse Check for supported graphics devices names WIN MAC X CGM PCL PRINTER PS Z result where d name eq names count if count eq 0 then message Graphics device is not supported Get color table information if d flags and 256 ne 0 and d window lt 0 then begin window free pixmap wdelete d window endif if n_elements bottom eq 0 then bottom 0 if n_elements ncolors eq 0 then ncolors d table_size bottom Get IDL version number version float version release Check for IDL 5 2 or higher if printer device is selected if version lt 5 2 and d name eq PRINTER then message IDL 5 2 or higher is required for PRINTER device support GET RED GREEN AND BLUE COMPONENTS OF TRUE COLOR IMAGE if true eq 1 then begin case truedim of 0 : begin red image 0 grn image 1 blu image 2 end 1 : begin red image 0 grn image 1 blu image 2 end 2 : begin red image 0 grn image 1 blu image 2 end endcase red reform red overwrite grn reform grn overwrite blu reform blu overwrite endif COMPUTE POSITION FOR IMAGE Save first element of p multi multi_first p multi 0 Establish image position if not defined if n_elements position eq 0 then begin if max p multi eq 0 then begin position 0 0 0 0 1 0 1 0 endif else begin plot 0 nodata xstyle 4 ystyle 4 xmargin 0 0 ymargin 0 0 position x window 0 y window 0 x window 1 y window 1 endelse endif Erase and fill the background if required if multi_first eq 0 then begin if keyword_set erase then erase if n_elements background gt 0 then begin polyfill 0 01 1 01 1 01 0 01 0 01 0 01 0 01 1 01 1 01 0 01 normal color background 0 endif endif Compute image aspect ratio if not defined if n_elements aspect eq 0 then begin case true of 0 : result size image 1 : result size red endcase dims result 1:2 aspect float dims 1 float dims 0 endif Save image xrange and yrange for axis overlays xrange 0 dims 0 yrange 0 dims 1 if order eq 1 then yrange reverse yrange Set the aspect ratio and margin to fill the position window if requested if keyword_set usepos then begin xpos_size float d x_vsize position 2 position 0 ypos_size float d y_vsize position 3 position 1 aspect_value ypos_size xpos_size margin_value 0 0 endif else begin aspect_value aspect margin_value margin endelse Compute size of displayed image and save output position pos position case true of 0 : imdisp_imsize image x0 y0 xsize ysize position pos aspect aspect_value margin margin_value 1 : imdisp_imsize red x0 y0 xsize ysize position pos aspect aspect_value margin margin_value endcase out_pos pos BYTE SCALE THE IMAGE IF REQUIRED Choose whether to scale the image or not if keyword_set noscale eq 0 then begin Scale the image case true of 0 : scaled imdisp_imscale image bottom bottom ncolors ncolors range range negative keyword_set negative 1 : begin scaled_dims size red 1:2 scaled bytarr scaled_dims 0 scaled_dims 1 3 scaled 0 0 0 imdisp_imscale red bottom 0 ncolors 256 negative keyword_set negative scaled 0 0 1 imdisp_imscale grn bottom 0 ncolors 256 negative keyword_set negative scaled 0 0 2 imdisp_imscale blu bottom 0 ncolors 256 negative keyword_set negative end endcase endif else begin Don t scale the image case true of 0 : scaled image 1 : begin scaled_dims size red 1:2 scaled replicate red 0 scaled_dims 0 scaled_dims 1 3 scaled 0 0 0 red scaled 0 0 1 grn scaled 0 0 2 blu end endcase endelse DISPLAY IMAGE ON PRINTER DEVICE if d name eq PRINTER then begin Display the image case true of 0 : begin device index_color tv scaled x0 y0 xsize xsize ysize ysize order order end 1 : begin device true_color tv scaled x0 y0 xsize xsize ysize ysize order order true 3 end endcase Draw axes if required if keyword_set axis then plot 0 nodata noerase position out_pos xrange xrange xstyle 1 yrange yrange ystyle 1 _extra extra_keywords Return to caller return endif DISPLAY IMAGE ON GRAPHICS DEVICES WHICH HAVE SCALEABLE PIXELS if d flags and 1 ne 0 then begin Display the image case true of 0 : tv scaled x0 y0 xsize xsize ysize ysize order order 1 : begin tvlct r g b get loadct 0 silent tv scaled x0 y0 xsize xsize ysize ysize order order true 3 tvlct r g b end endcase Draw axes if required if keyword_set axis then plot 0 nodata noerase position out_pos xrange xrange xstyle 1 yrange yrange ystyle 1 _extra extra_keywords Return to caller return endif RESIZE THE IMAGE Resize the image if keyword_set noresize eq 0 then begin if true eq 0 then begin resized imdisp_imregrid scaled xsize ysize interp keyword_set interp endif else begin resized replicate scaled 0 xsize ysize 3 resized 0 0 0 imdisp_imregrid reform scaled 0 xsize ysize interp keyword_set interp resized 0 0 1 imdisp_imregrid reform scaled 1 xsize ysize interp keyword_set interp resized 0 0 2 imdisp_imregrid reform scaled 2 xsize ysize interp keyword_set interp endelse endif else begin resized temporary scaled x0 0 y0 0 endelse GET BIT DEPTH FOR THIS DISPLAY If this device supports windows make sure a window has been opened if d flags and 256 ne 0 then begin if d window lt 0 then begin window free pixmap wdelete d window endif endif Set default display depth depth 8 Get actual bit depth on supported displays if d name eq WIN or d name eq MAC or d name eq X then begin if version ge 5 1 then begin device get_visual_depth depth endif else begin if d n_colors gt 256 then depth 24 endelse endif SELECT DECOMPOSED COLOR MODE ON OR OFF FOR 24 BIT DISPLAYS if d name eq WIN or d name eq MAC or d name eq X then begin if depth gt 8 then begin if version ge 5 2 then device get_decomposed entry_decomposed else entry_decomposed 0 if true eq 1 or channel gt 0 then device decomposed 1 else device decomposed 0 endif endif DISPLAY THE IMAGE If the display is 8 bit and the image is true color convert image from true color to indexed color if depth le 8 and true eq 1 then begin resized color_quan temporary resized 3 r g b colors ncolors dither keyword_set dither byte bottom tvlct r g b bottom true 0 endif Set channel value for supported devices if d name eq WIN or d name eq MAC or d name eq X then begin channel_value channel endif else begin channel_value 0 endelse Display the image case true of 0 : tv resized x0 y0 order order channel channel_value 1 : tv resized x0 y0 order order true 3 endcase RESTORE THE DECOMPOSED COLOR MODE FOR 24 BIT DISPLAYS if d name eq WIN or d name eq MAC or d name eq X and depth gt 8 then begin device decomposed entry_decomposed if d name eq MAC then tv 0 1 1 endif DRAW AXES IF REQUIRED if keyword_set axis then plot 0 nodata noerase position out_pos xrange xrange xstyle 1 yrange yrange ystyle 1 _extra extra_keywords END"); a[110] = new Array("./Picture/saveimage.html", "saveimage.pro", "", " file_comments Save the current graphics window to an output file GIF by default The output formats supported are: GIF 8 bit with color table BMP 8 bit with color table PNG 8 bit with color table PICT 8 bit with color table JPEG 24 bit true color TIFF 24 bit true color Any conversions necessary to convert 8 bit or 24 bit images onscreen to 8 bit or 24 bit output files are done automatically categories Input Output param FILE in required default format GIF Name of the output file keyword BMP Set this keyword to create BMP format 8 bit with color table keyword PNG Set this keyword to create PNG format 8 bit with color table keyword PICT Set this keyword to create PICT format 8 bit with color table keyword JPEG Set this keyword to create JPEG format 24 bit true color keyword TIFF Set this keyword to create TIFF format 24 bit true color keyword QUALITY default 75 If set to a named variable specifies the quality for JPEG output Ranges from 0 terrible to 100 excellent Smaller quality values yield higher compression ratios and smaller output files keyword DITHER default no dithering If set dither the output image when creating 8 bit output which is read from a 24 bit display keyword CUBE default to use statistical method If set use the color cube method to quantize colors when creating 8 bit output which is read from a 24 bit display This may improve the accuracy of colors in the output image especially white keyword QUIET default to print an information message Set this keyword to suppress the information message restrictions The output file is overwritten if it exists requires IDL 5 0 or higher square bracket array syntax examples IDL openr lun filepath hurric dat subdir examples data get_lun IDL image bytarr 440 330 IDL readu lun image IDL free_lun lun IDL loadct 13 IDL tvscl image IDL saveimage hurric gif history Liam Gumley ssec wisc edu This program is free software you can redistribute it and or modify it under the terms of the GNU General Public License as published by the Free Software Foundation either version 2 of the License or at your option any later version This program is distributed in the hope that it will be useful but WITHOUT ANY WARRANTY without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE See the GNU General Public License for more details You should have received a copy of the GNU General Public License along with this program if not write to the Free Software Foundation Inc 59 Temple Place Suite 330 Boston MA 02111 1307 USA version Id: saveimage pro 371 2008 08 07 09:32:02Z pinsard PRO saveimage FILE BMP BMP PNG PNG PICT PICT JPEG JPEG TIFF TIFF QUALITY QUALITY DITHER DITHER CUBE CUBE QUIET QUIET MULTIPLE multiple compile_opt idl2 strictarrsubs rcs_id Id: saveimage pro 371 2008 08 07 09:32:02Z pinsard CHECK INPUT Check arguments if n_params ne 1 then message Usage: SAVEIMAGE FILE if n_elements file eq 0 then message Argument FILE is undefined if n_elements file gt 1 then message Argument FILE must be a scalar string Check keywords output GIF if keyword_set bmp then output BMP if keyword_Set png then output PNG if keyword_set pict then output PICT if keyword_set jpeg then output JPEG if keyword_set tiff then output TIFF if n_elements quality eq 0 then quality 75 Check for TVRD capable device if d flags and 128 eq 0 then message Unsupported graphics device Check for open window if d flags and 256 ne 0 then begin if d window lt 0 then message No graphics windows are open endif Get display depth depth 8 if d n_colors gt 256 then depth 24 GET CONTENTS OF GRAPHICS WINDOW Handle window devices other than the Z buffer if d flags and 256 ne 0 then begin Copy the contents of the current display to a pixmap current_window d window xsize d x_size ysize d y_size window free pixmap xsize xsize ysize ysize retain 2 device copy 0 0 xsize ysize 0 0 current_window Set decomposed color mode for 24 bit displays version float version release if depth gt 8 then begin if version gt 5 1 then device get_decomposed entry_decomposed device decomposed 1 endif endif Read the pixmap contents into an array if depth gt 8 then begin image tvrd order 0 true 1 endif else begin image tvrd order 0 endelse Handle window devices other than the Z buffer if d flags and 256 ne 0 then begin Restore decomposed color mode for 24 bit displays if depth gt 8 then begin if version gt 5 1 then begin device decomposed entry_decomposed endif else begin device decomposed 0 if keyword_set quiet eq 0 then print Decomposed color was turned off endelse endif Delete the pixmap wdelete d window wset current_window endif Get the current color table tvlct r g b get If an 8 bit image was read reduce the number of colors if depth le 8 then begin reduce_colors image index r r index g g index b b index endif WRITE OUTPUT FILE case 1 of Save the image in 8 bit output format output eq GIF or output eq BMP or output eq PICT or output eq PNG : begin if depth gt 8 then begin Convert 24 bit image to 8 bit case keyword_set cube of 0 : image color_quan image 1 r g b colors 256 dither keyword_set dither 1 : image color_quan image 1 r g b cube 6 endcase Sort the color table from darkest to brightest table_sum total long r long g long b 2 table_index sort table_sum image_index sort table_index r r table_index g g table_index b b table_index oldimage image image image_index temporary oldimage endif Save the image case output of GIF : write_gif file image r g b MULTIPLE multiple BMP : write_bmp file image r g b PNG : write_png file image r g b PICT : write_pict file image r g b endcase end Save the image in 24 bit output format output eq JPEG or output eq TIFF : begin Convert 8 bit image to 24 bit if depth le 8 then begin info size image nx info 1 ny info 2 true bytarr 3 nx ny true 0 r image true 1 g image true 2 b image image temporary true endif If TIFF format output reverse image top to bottom if output eq TIFF then image reverse temporary image 3 Write the image case output of JPEG : write_jpeg file image true 1 quality quality TIFF : write_tiff file image 1 endcase end endcase Print information for the user if keyword_set quiet eq 0 then print file output format Created a in a format END"); a[111] = new Array("./Picture/showimage.html", "showimage.pro", "", " file_comments Show the contents of a graphics file in the current window The input formats supported are: GIF 8 bit with color table BMP 8 bit with color table or 24 bit true color PICT 8 bit with color table TIFF 8 bit with color table or 24 bit true color JPEG 24 bit true color Any conversions necessary to translate 8 bit or 24 bit files to 8 bit or 24 bit images on screen are done automatically categories Input Output param FILE in required Name of the output file format is identified automatically keyword DITHER default no dithering Set this keyword to dither the input image when displaying 24 bit images on an 8 bit display keyword CURRENT Set this keyword to display the image in the current window default is to create a new window sized to fit the image restrictions The color table is modified restrictions Requires IDL 5 2 or higher image QUERY functions examples IDL showimage filepath rose jpg subdir examples data history Liam Gumley ssec wisc edu This program is free software you can redistribute it and or modify it under the terms of the GNU General Public License as published by the Free Software Foundation either version 2 of the License or at your option any later version This program is distributed in the hope that it will be useful but WITHOUT ANY WARRANTY without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE See the GNU General Public License for more details You should have received a copy of the GNU General Public License along with this program if not write to the Free Software Foundation Inc 59 Temple Place Suite 330 Boston MA 02111 1307 USA version Id: showimage pro 371 2008 08 07 09:32:02Z pinsard PRO showimage FILE DITHER DITHER CURRENT CURRENT compile_opt idl2 strictarrsubs rcs_id Id: showimage pro 371 2008 08 07 09:32:02Z pinsard CHECK INPUT Check IDL version if float version release lt 5 2 then begin message IDL 5 2 or higher is required continue return endif Check input arguments case 1 of n_params ne 1 : error Usage: SHOWIMAGE FILE n_elements file eq 0 : error Argument FILE is undefined n_elements file gt 1 : error Argument FILE must be a scalar string findfile file 0 eq : error Argument FILE was not found else : error endcase if error ne then begin message error continue return endif CHECK THE GRAPHICS DEVICE Check for device supporting windows and tvrd if d flags and 256 eq 0 or d flags and 128 eq 0 then begin error string d name format Graphics device a is not supported message error continue return endif Make sure a window has been opened in this session and get visual depth if d window lt 0 then begin window free pixmap xsize 20 ysize 20 wdelete d window endif device get_visual_depth depth If 8 bit display is low on colors print a message if depth eq 8 and d table_size lt 64 then message Display has less than 64 colors image quality may degrade continue IDENTIFY FILE AND READ IMAGE Identify the file format result query_gif file info if result eq 0 then result query_bmp file info if result eq 0 then result query_pict file info if result eq 0 then result query_tiff file info if result eq 0 then result query_jpeg file info if result eq 0 then begin message File format not recognized continue return endif Fix the channel information for GIF images if info type eq GIF then info channels 1 Read the image case info type of GIF : read_gif file image r g b BMP : begin if info channels eq 1 then begin image read_bmp file r g b endif else begin image read_bmp file image reverse temporary image 1 endelse end PICT : read_pict file image r g b TIFF : begin if info channels eq 1 then begin image read_tiff file r g b order order image reverse temporary image 2 endif else begin image read_tiff file order order image reverse temporary image 3 endelse end JPEG : read_jpeg file image endcase If an 8 bit image was read reduce the number of colors if info channels eq 1 then begin reduce_colors image index r r index g g index b b index endif Get image size dims size image dimensions if n_elements dims eq 2 then begin nx dims 0 ny dims 1 endif else begin nx dims 1 ny dims 2 endelse CREATE A WINDOW Create a draw widget sized to fit the image if not keyword_set current then begin Set default window size scroll 0 xsize nx ysize ny draw_xsize nx draw_ysize ny Adjust the window size if the image is too large device get_screen_size screen screen_xsize screen 0 screen_ysize screen 1 if nx gt screen_xsize then begin xsize 0 9 screen_xsize scroll 1 endif if ny gt screen_ysize then begin ysize 0 9 screen_ysize scroll 1 endif Create the draw widget base widget_base title file draw widget_draw base scroll scroll widget_control draw xsize xsize ysize ysize draw_xsize draw_xsize draw_ysize draw_ysize endif HANDLE IDL 8 BIT MODE if depth eq 8 then begin If the color table of an 8 bit image is larger than the current display table convert the image to 24 bit if info channels eq 1 and n_elements r gt d table_size then begin Convert to 24 bit dims size image dimensions nx dims 0 ny dims 1 true bytarr 3 nx ny true 0 r image true 1 g image true 2 b image image temporary true Reset the number of channels info channels 3 endif If image is 24 bit convert to 8 bit if info channels eq 3 then begin Convert 24 bit image to 8 bit image color_quan image 1 r g b colors d table_size dither keyword_set dither Sort the color table from darkest to brightest table_sum total long r long g long b 2 table_index sort table_sum image_index sort table_index r r table_index g g table_index b b table_index oldimage image image image_index temporary oldimage Reset the number of channels info channels 1 endif endif DISPLAY THE IMAGE Realize the draw widget if not keyword_set current then widget_control base realize Save current decomposed mode and display order device get_decomposed current_decomposed current_order order Set image to display from bottom up order 0 Display the image if info channels eq 1 then begin device decomposed 0 tvlct r g b tv image endif else begin device decomposed 1 tv image true 1 endelse Restore decomposed mode and display order device decomposed current_decomposed order current_order END"); a[112] = new Array("./Postscript/closeps.html", "closeps.pro", "", " file_comments Close the Postscript mode when archive_ps ne 0 we add the name and the date at the bottom left corner of the postscript page If the postscript is called idl ps we change its name to number ps number automatically found to be 1 larger that any of the existing ps file keyword INFOWIDGET type long integer id of the information widget created by openps that we have to destroy at the end of closeps when the postscript is done uses cm_4ps history Sebastien Masson smasson lodyc jussieu fr 21 12 98 June 2005: Sebastien Masson english version with new commons version Id: closeps pro 371 2008 08 07 09:32:02Z pinsard PRO closeps INFOWIDGET infowidget compile_opt idl2 strictarrsubs IF lmgr demo EQ 1 THEN return cm_4ps IF NOT keyword_set key_forgetold THEN BEGIN updatenew ENDIF IF d name NE PS THEN GOTO last_part if archive_ps 0 we will add its name and the date at the bottom left corner of the page in case if the postscript will be archived in printps IF keyword_set archive_ps THEN BEGIN we get the name of the latest created postscript psdir isadirectory psdir title Select psdir nameps file_search psdir ps test_regular test_write nosort dates file_info nameps mtime lastdate reverse sort temporary dates 0 nameps nameps lastdate nameps file_basename nameps ps If this name is idl ps then we change it to the number ps IF nameps EQ idl then BEGIN get the name of all the ps or ps gz files available in psdir allps file_search psdir ps ps gz pdf test_regular nosort allps file_basename file_basename allps gz ps allps file_basename allps pdf find which of these names corresponds to numbers get ascii codes of the names testnumb byte allps longest name maxstrlen size testnumb dimensions 0 ascii codes can be 0 or between byte 0 and byte 9 testnumb testnumb EQ 0 OR testnumb GE byte 0 0 AND testnumb LE byte 9 0 testnumb where total testnumb 1 EQ maxstrlen count IF count NE 0 THEN BEGIN get the largest number psnumber fix allps testnumb psnumber psnumber reverse sort psnumber 0 1 ENDIF ELSE psnumber 0 nameps strtrim psnumber 2 ENDIF we annotate the postscript date byte systime 0 we get the date xyouts d x_px_cm d y_px_cm nameps string date 4:10 string date 20:23 device charsize 75 ENDIF close the postscript mode device close last_part: thisOS strupcase strmid version os_family 0 3 CASE thisOS of MAC : SET_PLOT thisOS WIN : SET_PLOT thisOS ELSE: SET_PLOT X ENDCASE def_myuniquetmpdir colorfile myuniquetmpdir original_colors dat IF file_test colorfile regular THEN BEGIN restore colorfile file_delete colorfile quiet reload the original colors tvlct red green blue ENDIF p font 1 force background color to the last color white p BACKGROUND d n_colors 1 255 p color 0 if d n_colors gt 256 then p background ffffff x if keyword_set infowidget then widget_control long infowidget bad_id toto destroy return end"); a[113] = new Array("./Postscript/openps.html", "openps.pro", "", " file_comments switch to postscript mode and define it param namepsin in optional name of the postscript file Extension ps is added if missing It will be stored in the psdir directory keyword FILENAME to define the name of the postscript file through a keyword rather than with namepsin input argument in this case the keyword can be pass through different routines via _EXTRA keyword keyword INFOWIDGET If INFOWIDGET is present it specifies a named variable into which the id of the widget giving information about the postscript creation is stored as a long integer This id is needed by closeps to kill the information widget keyword KEEP_PFONT activate to suppress the modification of p font by default we force p font 0 to make smaller postscripts keyword PORTRAIT keyword LANDSCAPE keyword KEEPPFONT same as keep_pfont keyword LIGHTNESS a scalar used to change the Lightness of the color palette to be able to adjust according to the printer we use the media paper or slide 1 to get darker colors keyword _EXTRA Used to pass keywords to DEVICE uses cm_4ps history Sebastien Masson smasson lodyc jussieu fr 21 12 98 1 2 98: ajout de nameps en input 1 9 1999: ajout du mot cle FILENAME et du widget June 2005: Sebastien Masson cleaning english version with new commons version Id: openps pro 371 2008 08 07 09:32:02Z pinsard PRO openps namepsin FILENAME filename INFOWIDGET infowidget KEEPPFONT keeppfont KEEP_PFONT keep_pfont PORTRAIT portrait LANDSCAPE landscape LIGHTNESS Lightness _EXTRA ex compile_opt idl2 strictarrsubs IF lmgr demo EQ 1 THEN BEGIN dummy report impossible to create a PS in demo mode return ENDIF cm_4ps IF NOT keyword_set key_forgetold THEN BEGIN updatenew ENDIF close the postscript device if we are already in postscript mode IF d name EQ PS THEN device close switch to postscript mode set_plot ps if we use keyword Lightness save the actual color palette in a temporary file to be restored when calling closeps IF n_elements Lightness NE 0 THEN BEGIN IF Lightness NE 1 THEN BEGIN tvlct red green blue get def_myuniquetmpdir save red green blue filename myuniquetmpdir original_colors dat palit Lightness red green blue ENDIF ENDIF we define the name of the file CASE 1 OF n_params EQ 1:nameps namepsin keyword_set filename : nameps filename ELSE:nameps xquestion Name of the postscript file idl ps chkwid ENDCASE make sure that nameps ends with ps nameps file_dirname nameps mark_directory file_basename nameps ps ps add path psdir and check that nameps is ok nameps isafile nameps iodir psdir new we define xsize ysize xoffset and yoffset IF n_elements portrait NE 0 OR n_elements landscape NE 0 THEN key_portrait keyword_set portrait 1 keyword_set landscape if key_portrait EQ 1 then begin xs min page_size ys max page_size xoff 0 yoff 0 ENDIF ELSE BEGIN xs max page_size ys min page_size xoff 0 yoff max page_size ENDELSE We define the device of the postscript mode device color palatino filename strcompress nameps remove_all LANDSCAPE 1 key_portrait PORTRAIT key_portrait xsize xs ysize ys xoffset xoff yoffset yoff bits_per_pixel 8 language_level 2 _EXTRA ex to make smaller postcripts IF NOT keyword_set keeppfont OR keyword_set keep_pfont THEN p font 0 show some informations IF arg_present infowidget THEN infowidget xnotice Postscript file is currently processed RETURN END"); a[114] = new Array("./Postscript/printps.html", "printps.pro", "", " file_comments archiving possibilities if archive_ps common variable of cm_4ps ne 0 then the postscript can be saved for archiving if it is printed or if the button archive ps is pressed if it is printed and archive_ps 1 then the archiving is done automatically whereas we ask if the postscript file must be archived or not If the postscript name is idl ps default name then this name will be changed to number ps number automatically found to be 1 larger that any of the existing ps file categories Postscripts param event restrictions 1 this is working only with unix linux osX machines 2 definition of the printing command the printing command is defined by the common variable print_command in cm_4ps This command must be defined build in a way that it the instruction: print_command i printer_machine_names i file ps or print_command printer_machine_names i file ps is working default definition is lpr P history Sebastien Masson smasson lodyc jussieu fr 21 12 98 25 8 19999 utilisation des widgets 8 9 1999 utilisation de cw_bgroup June 2005: Sebastien Masson: cleaning English version with new commons version Id: printps pro 401 2009 07 23 08:48:16Z smasson PRO printps_event event uval uval compile_opt idl2 strictarrsubs cm_4ps IF NOT keyword_set key_forgetold THEN BEGIN updatenew ENDIF What kind of event do we have IF NOT keyword_set uval THEN widget_control event id get_uvalue uval case on the event CASE uval name OF visualize case : postscript visualization visualize :BEGIN paper orientation if key_portrait EQ 1 then ori portrait ELSE ori seascape paper format CASE round 10 total page_size OF round 10 83 9611 118 816 : papsize a0 round 10 59 4078 83 9611 : papsize a1 round 10 41 9806 59 4078 : papsize a2 round 10 29 7039 41 9806 : papsize a3 round 10 20 9903 29 7039 : papsize a4 round 10 14 8519 20 9903 : papsize a5 round 10 10 4775 14 8519 : papsize a6 round 10 7 40833 10 4775 : papsize a7 round 10 5 22111 7 40833 : papsize a8 round 10 3 70417 5 22111 : papsize a9 round 10 2 61056 3 70417 : papsize a10 round 10 100 048 141 393 : papsize b0 round 10 70 6967 100 048 : papsize b1 round 10 50 0239 70 6967 : papsize b2 round 10 35 3483 50 0239 : papsize b3 round 10 25 0119 35 3483 : papsize b4 round 10 17 6742 25 0119 : papsize b5 round 10 22 86 30 48 : papsize archA round 10 30 48 45 72 : papsize archB round 10 45 72 60 96 : papsize archC round 10 60 96 91 44 : papsize archD round 10 91 44 121 92 : papsize archE round 10 21 59 33 02 : papsize flsa round 10 21 59 33 02 : papsize flse round 10 13 97 21 59 : papsize halfletter round 10 19 05 25 4 : papsize note round 10 21 59 27 94 : papsize letter round 10 21 59 35 56 : papsize legal round 10 27 94 43 18 : papsize 11x17 round 10 43 18 27 94 : papsize ledger ELSE:papsize a4 ENDCASE call the viewers CASE event value OF GNU Ghostview :cmd gv media papsize orientation ori uval nameps Gnome Ghostview :cmd ggv uval nameps Ghostview :cmd ghostview papsize quiet ori uval nameps Ghostscript :cmd gs sPAPERSIZE papsize q uval nameps Kghostview :cmd kghostview uval nameps ENDCASE spawn cmd return END print case: print and archive the file if needed print :BEGIN printer selection printer printer_machine_names event value print CASE n_elements print_command OF 0:ptcmd lpr P 1:ptcmd print_command 0 n_elements printer_machine_names :ptcmd print_command event value ELSE:BEGIN ng report bad definition of print_command common variable of cm_4ps C we did not print the postscript file simple return END ENDCASE spawn ptcmd printer uval nameps printing informations spawn lpq P imprimante l info display them xdisplayfile nothing text info title Printing Info file_basename uval nameps height n_elements info cm_4ps examples IDL printps history Sebastien Masson smasson lodyc jussieu fr 21 12 98 25 8 19999 utilisation des widgets 8 9 1999 utilisation de cw_bgroup June 2005: Sebastien Masson: cleaning English version with new commons version Id: printps pro 401 2009 07 23 08:48:16Z smasson PRO printps psfilename ARCHIVE archive DIRECTPRINT directprint this is working only with unix linux osX machines compile_opt idl2 strictarrsubs thisOS strupcase strmid version os_family 0 3 CASE thisOS OF MAC :return WIN :return ELSE: ENDCASE cm_4ps IF NOT keyword_set key_forgetold THEN BEGIN updatenew ENDIF we get the name of the latest created postscript psdir isadirectory psdir title Select psdir CASE N_PARAMS OF 0: BEGIN nameps file_search psdir ps test_regular nosort IF nameps 0 EQ THEN BEGIN ras report no postscript file ending with ps found in : psdir RETURN ENDIF dates file_info nameps mtime lastdate reverse sort temporary dates 0 nameps nameps lastdate END 1: nameps psfilename ELSE: BEGIN ras report printps accept only one element: psfilename RETURN END ENDCASE we check if the file is exist in psdir if necessary we complete its name with ps and or gz nameps find nameps ps gz iodir psdir nopro nameps nameps 0 IF nameps EQ NOT FOUND THEN BEGIN ng report file nameps ps gz does not exist return ENDIF gzipped strpos nameps gz if the file is gzipped we call gunzip and change its name IF gzipped NE 1 AND NOT keyword_set archive THEN BEGIN spawn gunzip f nameps nameps strmid nameps 0 gzipped ENDIF what should we do CASE 1 OF direct archiving keyword_set archive :IF gzipped EQ 1 THEN printps_event uval name: archive nameps:nameps gzip:gzipped NE 1 build the widget keyword_set directprint : BEGIN check if directprint is well defined printnumb where strlowcase printer_machine_names EQ strlowcase directprint 0 IF printnumb EQ 1 THEN BEGIN printnumb where strlowcase printer_human_names EQ strlowcase directprint 0 IF printnumb EQ 1 THEN BEGIN dummy report directprint does not correspond to any printer defined in printer_machine_names or printer_human_names common variable return ENDIF ENDIF call printps_event with predefined event and uvalue printps_event value:printnumb uval name: print nameps:nameps gzip:gzipped NE 1 END build the widget ELSE:BEGIN base widget_base row title Postscript file: file_basename nameps ps viewers grouped button psviewers no psviewers found IF file_which getenv PATH gv NE THEN psviewers psviewers GNU Ghostview IF file_which getenv PATH ggv NE THEN psviewers psviewers Gnome Ghostview IF file_which getenv PATH ghostview NE THEN psviewers psviewers Ghostview IF file_which getenv PATH gs NE THEN psviewers psviewers Ghostscript IF file_which getenv PATH kghostview NE THEN psviewers psviewers Kghostview if at least one of viewer was found we define these buttons IF n_elements psviewers GT 1 THEN BEGIN psviewers psviewers 1: notused cw_bgroup base psviewers frame label_top Visualize uvalue name: visualize nameps:nameps column return_name ENDIF printers list grouped buttons are the common variables printer_human_names and printer_human_names defined in a proper way CASE 1 OF n_elements printer_human_names eq 0: noting report the cm_4ps variable printer_human_names is not defined CWe could not propose any printer simple n_elements printer_human_names NE n_elements printer_machine_names : noting report the cm_4ps variables printer_human_names and Cprinter_machine_names do not have the same number of arguments CWe could not propose any printer simple printer_human_names 0 EQ : ELSE:notused cw_bgroup base printer_human_names frame column label_top Select printer uvalue name: print nameps:nameps gzip:gzipped NE 1 ENDCASE archive ps button can be created only if archive_ps ne 0 IF keyword_set archive_ps THEN notused widget_button base value archive ps uvalue name: archive nameps:nameps gzip:gzipped NE 1 quit button notused widget_button base value quit uvalue name: quit nameps:nameps gzip:gzipped NE 1 widget_control base realize xmanager printps base no_block END ENDCASE return end"); a[115] = new Array("./ReadWrite/idl-NetCDF/ncdf_listdims.html", "ncdf_listdims.pro", "", " file_comments categories param NCID restrictions examples history version Id: ncdf_listdims pro 157 2006 08 21 09:01:50Z navarro FUNCTION ncdf_listdims ncid compile_opt idl2 strictarrsubs n ncdf_inquire ncid ndims names strarr n for i 0 n 1 do begin ncdf_diminq ncid i name size names i name endfor return names end"); a[116] = new Array("./ReadWrite/idl-NetCDF/ncdf_listvars.html", "ncdf_listvars.pro", "", " file_comments give back the liste of variables included in a NetCDF file categories NetCDF param input in required type salar string or long integer the name of the file or its Id defined by a previus call to ncdf_open or ncdf_create Note that if input corresponds to the file name ncdf_listvars will open and close the file automatically returns a vector string containing the name of the variables examples IDL varnames ncdf_listvars toto nc or IDL i ncdf_open toto nc IDL varnames ncdf_listvars id history version Id: ncdf_listvars pro 371 2008 08 07 09:32:02Z pinsard FUNCTION ncdf_listvars input compile_opt idl2 strictarrsubs IF size input type EQ 7 THEN ncid ncdf_open input ELSE ncid input n ncdf_inquire ncid nvars names strarr n for i 0 n 1 do names i ncdf_varinq ncid i name IF size input type EQ 7 THEN ncdf_close ncid return names END"); a[117] = new Array("./ReadWrite/idl-NetCDF/ncdf_quickread/ncdf_quickread.html", "ncdf_quickread.pro", "", ""); a[118] = new Array("./ReadWrite/idl-NetCDF/ncdf_quickread/ncdf_quickread_helper.html", "ncdf_quickread_helper.pro", "", " ncdf_quickread_helper pro This file contains IDL functions to read netCDF data files into IDL variables Adapted from CDF2IDL pro This file contains the following functions and procedures: functions: ncdf_quickread_getfile strips the directory and optionally any suffixes from the path file ncdf_quickread_getdir returns the directory from the full path file ncdf_quickread_validatename validates the name that will be used as a netCDF variable procedures: ncdf_quickread_helper1 construct commands which when executed at the top level will read netCDF variables into IDL History: Date Name Action 06 Jun 97 S Rupert Created 09 Jun 97 S Rupert Fully tested 10 Jun 97 S Rupert Modified keyword usage 03 Feb 98 S Rupert Added additional error checking and warning to output script 17 Feb 98 S Rupert Corrected validation routine to handle instance of name strating with a number and containing a dash 05 Jul 00 A M Iwi Added keyword PREFIX on CDF2IDL Supplied string gets prepended to all variable names 19 Jun 01 A M Iwi Added keyword REFORM on CDF2IDL REFORM function is used to remove dimensions of size 1 02 Oct 03 A M Iwi Change into helper routine for ncdf_quickread 11 Aug 04 A M Iwi Add fields option to read only certain fields Also only stringify attributes of type CHAR file_comments This function returns the filename name from the full path categories param FULLPATH full directory file path keyword SUFFIX include input suffix in output file name returns file filename restrictions examples Call: file ncdf_quickread_getfile fullpath history version Id: ncdf_quickread_helper pro 325 2007 12 06 10:04:53Z pinsard function ncdf_quickread_getfile fullpath suffix suffix on_error 2 compile_opt hidden Retrieve the position at which the first character occurs from the end of the string dirlen rstrpos fullpath Retrieve the full length of the original string len strlen fullpath Retrieve the filename fullfile strmid fullpath dirlen 1 len Retrieve the position at which the first character occurs from the end of the string len 1 if not keyword_set suffix then len rstrpos fullfile if len EQ 1 then len strlen fullfile Retrieve the file file strmid fullfile 0 len Return the file name return file End function end file_comments This function returns the directory name from the full path categories param FULLPATH full directory file path returns directory path restrictions examples Call: dir ncdf_quickread_getdir fullpath history version Id: ncdf_quickread_helper pro 325 2007 12 06 10:04:53Z pinsard function ncdf_quickread_getdir fullpath on_error 2 compile_opt hidden Retrieve the position at which the first character occurs from the end of the string len rstrpos fullpath Retrieve the filename if len EQ 1 then dir else dir strmid fullpath 0 len 1 Return the file name return dir End function end file_comments This routine ensures that the given name does not start with a number nor contain a dash IDL cannot accept a variable starting with a number or containing a dash If the name starts with a number an underscore is prepended to the name and if it contains a dash the dash is replaced with an underscore categories param VARNAME The name of the variable to be read returns restrictions examples history version Id: ncdf_quickread_helper pro 325 2007 12 06 10:04:53Z pinsard function ncdf_quickread_validatename varname on_error 2 compile_opt hidden Initialize the name name varname If the name starts with a number prepend it with an underscore if strpos varname 0 EQ 0 then name strcompress _ varname if strpos varname 1 EQ 0 then name strcompress _ varname if strpos varname 2 EQ 0 then name strcompress _ varname if strpos varname 3 EQ 0 then name strcompress _ varname if strpos varname 4 EQ 0 then name strcompress _ varname if strpos varname 5 EQ 0 then name strcompress _ varname if strpos varname 6 EQ 0 then name strcompress _ varname if strpos varname 7 EQ 0 then name strcompress _ varname if strpos varname 8 EQ 0 then name strcompress _ varname if strpos varname 9 EQ 0 then name strcompress _ varname If the name contains a dash replace it with an underscore if strpos name NE 1 then begin pieces str_sep name n_pieces n_elements pieces name pieces 0 for i 1 n_pieces 1 do begin name strcompress name _ pieces i endfor endif Return the file name return name End function end file_comments This procedure creates a script to read the data in a given netCDF file into IDL The default output file is the name of the netCDF file with idl replacing any existing suffix The default output is variable data only categories param INFILE full path to netCDF file of interest keyword VERBOSE Set this keyword to return an error message in case of an error keyword PREFIX see changelog above keyword FIELDS keyword REFORM see changelog above returns array of commands to run at top level restrictions examples history version Id: ncdf_quickread_helper pro 325 2007 12 06 10:04:53Z pinsard function ncdf_quickread_helper infile verbose verbose prefix prefix fields fields reform reform on_error 2 compile_opt hidden Ensure that the netCDF format is supported on the current platform if not ncdf_exists then message The Network Common Data Format is not supported on this platform Open the netcdf file for reading ncid NCDF_OPEN strcompress infile remove_all if ncid EQ 1 then message The file infile could not be opened please check the path Retrieve general information about this netCDF file ncidinfo NCDF_INQUIRE ncid command to write file header commands __ncid NCDF_OPEN infile subset 0 if n_elements fields ne 0 then begin if fields ne then begin subset 1 subfields strsplit fields extract endif endif Place the desired variables in local arrays for i 0 ncidinfo Nvars 1 do begin vardata NCDF_VARINQ ncid i if not subset then begin wanted 1 endif else begin match where subfields eq vardata Name nmatch wanted nmatch ne 0 endelse if wanted then begin varname ncdf_quickread_validatename vardata Name if keyword_set prefix then varname prefix varname commands commands NCDF_VARGET __ncid strcompress string i varname if keyword_set reform and vardata ndims ge 2 then commands commands varname reform varname if keyword_set verbose then begin for j 0 vardata Natts 1 do begin att NCDF_ATTNAME ncid i j attname strcompress varname _ strcompress att REMOVE_ALL commands commands NCDF_ATTGET __ncid strcompress string i att attname attinfo ncdf_attinq ncid i att if attinfo datatype eq CHAR then commands commands attname STRING attname endfor endif endif endfor if keyword_set verbose then begin for i 0 ncidinfo Ngatts 1 do begin name NCDF_ATTNAME ncid GLOBAL i attname ncdf_quickread_validatename name if keyword_set prefix then attname prefix attname commands commands NCDF_ATTGET __ncid GLOBAL name attname attinfo ncdf_attinq ncid global name if attinfo datatype eq CHAR then commands commands attname STRING attname endfor endif ncdf_close ncid commands commands NCDF_CLOSE __ncid Return commands to the caller return commands End procedure end"); a[119] = new Array("./ReadWrite/idl-NetCDF/ncdf_quickwrite/ncdf_quickwrite.html", "ncdf_quickwrite.pro", "", ""); a[120] = new Array("./ReadWrite/idl-NetCDF/ncdf_quickwrite/ncdf_quickwrite_helper1.html", "ncdf_quickwrite_helper1.pro", "", " file_comments categories param NCVARSTRING param NCDFSTRUCT param STRUCTNAME returns restrictions examples history version Id: ncdf_quickwrite_helper1 pro 157 2006 08 21 09:01:50Z navarro pro ncdf_quickwrite_helper1 ncvarstring ncdfstruct structname Parses the variable string so as to create the main structure on_error 2 compile_opt hidden ncdfstruct ncommands: 1 split string to extract IDL global attribute variable name bits strsplit ncvarstring extract case n_elements bits of 1: begin no attributes globattflag 0B globattnameidl end 2: begin globattflag 1B globattnameidl bits 1 end else: begin message Parse error: more than one sign in ncvarstring noname end endcase allvarspec bits 0 vars strsplit strcompress allvarspec remove_all extract nvar n_elements vars varnames strarr nvar varnamesidl strarr nvar nvardims intarr nvar vardims ptrarr nvar varattflags bytarr nvar varattnamesidl strarr nvar at start no dimensions known ndim 0 dimnames dimunlim 1 for ivar 0 nvar 1 do begin varandattspec vars ivar split into IDL attribute variable name and full variable specification bits strsplit varandattspec : extract case n_elements bits of 1: no variable attributes 2: begin varattflags ivar 1B varattnamesidl ivar bits 1 end else: begin message Parse error: more than one : sign in varandattspec noname end endcase fullvarspec bits 0 split full variable specification into variable specification and IDL variable name bits strsplit fullvarspec extract case n_elements bits of 1: varnameidl fill this in later 2: varnameidl bits 1 else: begin message Parse error: more than one sign in fullvarspec noname end endcase varspec bits 0 split variable specification into name and dimension specification bits strsplit varspec extract varname bits 0 case n_elements bits of 1: begin scalar nvardims ivar 0 end 2: begin dimspec bits 1 test for and strip trailing len strlen dimspec if strmid dimspec len 1 1 ne then begin message Parse error: dimension specification dimspec for variable varname should end with noname endif dimspec strmid dimspec 0 len 1 if dimspec eq then begin dimensions not specified assume 1d array with same name for dimension as for variable vardimnames varname endif else if dimspec eq then begin dimensions not specified but given as above again assume same name for dimension as for variable but with parsed below as meaning UNLIMITED vardimnames varname endif else begin vardimnames strsplit dimspec extract endelse now for each dimension name see if it already exists and if not then add it as a new name nvardim n_elements vardimnames nvardims ivar nvardim thisvardims intarr nvardim for i 0 nvardim 1 do begin dimname vardimnames i first see if dimname has leading if so strip it but record the fact that UNLIMITED is wanted unlimited strmid dimname 0 1 eq if unlimited then dimname strmid dimname 1 if ndim gt 0 then begin match where dimnames eq dimname nmatch case nmatch of 0: begin no match append to array dimnames dimnames dimname vardim ndim ndim ndim 1 end 1: begin match found point to it vardim match 0 end else: stop Duplicate match: BUG in NCDF_QUICK_HELPER1 endcase endif else begin no dimensions known this is the first ndim 1 dimnames dimname vardim 0 for completeness endelse if unlimited then begin if dimunlim ge 0 and dimunlim ne vardim then begin message NCDF dimensions dimnames dimunlim and dimnames vardim cannot both be of UNLIMITED size noname endif dimunlim vardim endif thisvardims i vardim endfor vardims ivar ptr_new thisvardims end else: message Parse error: variable specification varspec has stray noname endcase if varnameidl eq then varnameidl varname varnames ivar varname varnamesidl ivar varnameidl endfor now construct some commands which when executed at the top level will put IDL variable size information into the structure commands structname varsizes string indgen nvar ptr_new size varnamesidl now some more commands to tell the main level to copy the attributes into a heap location where the next helper routine will see them if globattflag then commands commands structname globatts ptr_new globattnameidl for ivar 0 nvar 1 do begin if varattflags ivar then begin commands commands structname varatts string ivar ptr_new varattnamesidl ivar endif endfor second argument comes back with a structure which contains all the information and also some variables to be used by next helper routine ncdfstruct ncommands: n_elements commands commands: ptr_new commands nvar: nvar varnames: varnames varids: intarr nvar nvardims: nvardims vardims: vardims varnamesidl: varnamesidl varsizes: ptrarr nvar varatts: ptrarr 1 nvar varattflags: varattflags varattnamesidl: varattnamesidl globatts: ptr_new globattflag: globattflag globattnameidl: globattnameidl ndim: ndim dimnames: dimnames dimids: intarr ndim 1 dimunlim: dimunlim fileid: 0 end"); a[121] = new Array("./ReadWrite/idl-NetCDF/ncdf_quickwrite/ncdf_quickwrite_helper2.html", "ncdf_quickwrite_helper2.pro", "", " HELPER2 Constructs the commands which are actually needed to write the NetCDF file this file contains: STR ncdf_quickwrite_typename ncdf_quickwrite_helper2 compile_opt hidden _STR like STRING but with no whitespace we use this function enough to give it a short name but the underscore is to make it unlikely to conflict with a user s function file_comments categories param STRING String to be split Contains text after in out token on output returns restrictions examples history version Id: ncdf_quickwrite_helper2 pro 325 2007 12 06 10:04:53Z pinsard function _str string return strcompress string remove_all end file_comments categories param NUM param NAME type string It is a string giving the name of the file to be opened If NAME does not contain the separating character of directories under unix for example the file will be looked for in the current directory returns restrictions examples history version Id: ncdf_quickwrite_helper2 pro 325 2007 12 06 10:04:53Z pinsard function ncdf_quickwrite_typename num name on_error 2 translate type number returned from size function into name usable by ncdf routines if not valid type throw an error and use name in informational message if set case num of usable types 1: type byte 2: type short 3: type long 4: type float 5: type double other types: set to something appropriate 7: type char string 12: type long unsigned 13: type long unsigned long 14: type float 64 bit integer 15: type float 64 bit integer else: begin if num eq 0 then gripe undefined else gripe not of valid type for a NetCDF file if n_params eq 1 then name Data item message name is gripe noname end endcase return type end file_comments categories param NCFILENAME param S The string to be searched param SNAME returns restrictions examples history version Id: ncdf_quickwrite_helper2 pro 325 2007 12 06 10:04:53Z pinsard pro ncdf_quickwrite_helper2 ncfilename s sname on_error 2 compile_opt hidden NB main structure is called s we use it so much that anything longer could get tedious start with no commands in fact 1 is an error condition s ncommands 1 free commands written by helper1 from heap ptr_free s commands dimsize lonarr s ndim 1 1 stops error if all fields scalar types strarr s nvar first of all work out dimension sizes for ivar 0 s nvar 1 do begin nvardim s nvardims ivar sizeinfo s varsizes ivar ntype sizeinfo sizeinfo 0 1 types ivar ncdf_quickwrite_typename ntype IDL expression s varnamesidl ivar for NCDF variable s varnames ivar if nvardim ne sizeinfo 0 then message NCDF variable s varnames ivar is defined with _str s nvardims ivar dimension s but corresponding IDL expression s varnamesidl ivar has _str sizeinfo 0 dimension s noname if nvardim ne 0 then begin not scalar for ivardim 0 nvardim 1 do begin idim s vardims ivar ivardim wanted sizeinfo 1 ivardim previous dimsize idim if previous ne 0 and previous ne wanted then message NCDF dimension s dimnames idim is multiply used but with conflicting sizes: _str previous and _str wanted noname dimsize idim wanted endfor endif endfor make commands to write the file to open the file if n_elements ncfilename eq 0 then ncfilename idl nc if strmid ncfilename 0 1 eq then begin ncfilename1 strmid ncfilename 1 clobstr clobber endif else begin ncfilename1 ncfilename clobstr endelse commands sname fileid ncdf_create ncfilename1 clobstr to do the dimensions for idim 0 s ndim 1 do begin if idim eq s dimunlim then sizestr unlimited else sizestr _str dimsize idim commands commands sname dimids _str idim ncdf_dimdef sname fileid s dimnames idim sizestr endfor to do the variables for ivar 0 s nvar 1 do begin if s nvardims ivar eq 0 then dimstr else dimstr sname dimids strjoin _str s vardims ivar commands commands sname varids _str ivar ncdf_vardef sname fileid s varnames ivar dimstr types ivar endfor to do the global attributes if s globattflag then begin tags tag_names s globatts ntags n_elements tags for itag 0 ntags 1 do begin sizeinfo size s globatts itag type ncdf_quickwrite_typename sizeinfo sizeinfo 0 1 commands commands ncdf_attput sname fileid global strlowcase tags itag s globattnameidl tags itag type endfor endif to do the variable attributes for ivar 0 s nvar 1 do begin if s varattflags ivar then begin tags tag_names s varatts ivar ntags n_elements tags for itag 0 ntags 1 do begin sizeinfo size s varatts ivar itag type ncdf_quickwrite_typename sizeinfo sizeinfo 0 1 commands commands ncdf_attput sname fileid sname varids _str ivar strlowcase tags itag s varattnamesidl ivar tags itag type endfor endif endfor to end the definition section commands commands ncdf_control sname fileid endef to write the data for ivar 0 s nvar 1 do begin commands commands ncdf_varput sname fileid sname varids _str ivar s varnamesidl ivar endfor close the file commands commands ncdf_close sname fileid make commands available to main level s ncommands n_elements commands s commands ptr_new commands end "); a[122] = new Array("./ReadWrite/idl-NetCDF/ncdf_quickwrite/ncdf_quickwrite_helper3.html", "ncdf_quickwrite_helper3.pro", "", " file_comments categories param S The string to be searched returns restrictions examples history version Id: ncdf_quickwrite_helper3 pro 157 2006 08 21 09:01:50Z navarro pro ncdf_quickwrite_helper3 s Frees the variables in heap memory on_error 2 compile_opt hidden s is our ncdf structure ptr_free s globatts ptr_free s varatts ptr_free s commands ptr_free s vardims ptr_free s varsizes ptr_free s varatts end"); a[123] = new Array("./ReadWrite/idl-NetCDF/ncdf_quickwrite/ncdf_quickwrite_verbose.html", "ncdf_quickwrite_verbose.pro", "", ""); a[124] = new Array("./ReadWrite/idl-NetCDF/ncdf_read.html", "ncdf_read.pro", "", " file_comments categories param FILENAME The filename param INFO General info param DINFO Dimension info param VINFO Variable info param GATTS Global attributes param VATTS Variable attributes param DATA Data returns restrictions examples history version Id: ncdf_read pro 157 2006 08 21 09:01:50Z navarro PRO ncdf_read filename info dinfo vinfo gatts vatts data general info data dimension info variable attributes variable info global attributes read a NetCDF file NB The data is read into a rather nasty combination of structures arrays and pointers which is unfortunately necessary in order to cope with the full generality of the data format Here is the sort of syntax you might use to get at elements of the returned data cumbersome because IDL doesn t support C type a b shorthand for a b INFO NDIMS INFO NVARS INFO NGATTS INFO RECDIM DINFO idim NAME DINFO idim SIZE VINFO ivar NAME VINFO ivar NAME VINFO ivar DATATYPE VINFO ivar NDIMS VINFO ivar NATTS VINFO ivar DIM ivdim GATTS NAME GATTS DATATYPE GATTS LENGTH GATTS VALUES or maybe STRING GATTS VALUES VATTS ivar iatt NAME VATTS ivar iatt DATATYPE VATTS ivar iatt LENGTH VATTS ivar iatt VALUES or maybe STRING VATTS ivar iatt VALUES DATA ivar or maybe DATA ivar idim1 idim2 idim3 compile_opt idl2 strictarrsubs open file id ncdf_open filename info info ncdf_inquire id dimension info dinfo replicate name: size:0L info ndims for idim 0 info ndims 1 do begin ncdf_diminq id idim name size dinfo idim name name dinfo idim size size endfor variable info vinfo replicate name: datatype: ndims:0l natts:0l dim:lonarr info ndims info nvars for ivar 0 info nvars 1 do begin var ncdf_varinq id ivar vinfo ivar name var name vinfo ivar datatype var datatype vinfo ivar ndims var ndims vinfo ivar natts var natts vinfo ivar dim var dim endfor global attributes if info ngatts gt 0 then begin gatts replicate name: datatype: length:0L values:ptr_new info ngatts for iatt 0 info ngatts 1 do begin name ncdf_attname id iatt global gatts iatt name name att ncdf_attinq id name global gatts iatt length att length gatts iatt datatype att datatype ncdf_attget id name vals global gatts iatt values ptr_new vals endfor endif else begin arbitary scalar value an empty list would be sensible but IDL doesn t support it gatts 1 endelse variable attributes vatts replicate ptr_new info nvars for ivar 0 info nvars 1 do begin if vinfo ivar natts gt 0 then begin vatts ivar ptr_new replicate name: datatype: length:0L values:ptr_new vinfo ivar natts for iatt 0 vinfo ivar natts 1 do begin name ncdf_attname id ivar iatt vatts ivar iatt name name att ncdf_attinq id ivar name vatts ivar iatt length att length vatts ivar iatt datatype att datatype ncdf_attget id ivar name vals vatts ivar iatt values ptr_new vals endfor endif else begin vatts ivar ptr_new 1 Pointer to arbitrary scalar analogous to case of lack of global attributes above We could put a here instead but try to be friendlier to code that might try to dereference it endelse endfor data data replicate ptr_new info nvars for ivar 0 info nvars 1 do begin ncdf_varget id ivar val data ivar ptr_new val endfor end"); a[125] = new Array("./ReadWrite/idl-NetCDF/ncdf_struct.html", "ncdf_struct.pro", "", " file_comments categories param FILENAME The file s name keyword NODATA keyword NOATTRIBUTES returns restrictions examples history version Id: ncdf_struct pro 157 2006 08 21 09:01:50Z navarro FUNCTION ncdf_struct filename nodata nodata noattributes noattributes Read entire netcdf file into a structure Structure contains metadata actual array contents are on heap with pointers contained in the structure Heap variables not created if nodata specified Use ncdf_struct_free to free heap memory Some data is duplicated for ease of access in particular if there is a variable name matching a dimension name then a pointer to the variable contents is accessible via the substructures corresponding to the dimension and every other variable that uses it Alan Iwi 27 6 02 compile_opt idl2 strictarrsubs id ncdf_open filename g ncdf_inquire id ndim g ndims nvar g nvars natt g ngatts if ndim gt 0 then begin dnames strarr ndim dsizes lonarr ndim for idim 0 ndim 1 do begin ncdf_diminq id idim dname dsize dnames idim dname dsizes idim dsize endfor endif if natt gt 0 and not keyword_set noattributes then begin anames strarr natt for iatt 0 natt 1 do begin aname ncdf_attname id global iatt ainq ncdf_attinq id global aname ncdf_attget id global aname aval if ainq datatype eq CHAR then aval string aval if iatt eq 0 then begin atts create_struct aname aval endif else begin atts create_struct atts aname aval endelse anames iatt aname endfor g create_struct g gatts atts gattnames anames endif if nvar gt 0 then begin vnames strarr nvar for ivar 0 nvar 1 do begin v ncdf_varinq id ivar vname v name vndim v ndims vnatt v natts vname v name if vnatt gt 0 and not keyword_set noattributes then begin vanames strarr vnatt for iatt 0 vnatt 1 do begin aname ncdf_attname id ivar iatt ainq ncdf_attinq id ivar aname ncdf_attget id ivar aname aval if ainq datatype eq CHAR then aval string aval if iatt eq 0 then begin atts create_struct aname aval endif else begin atts create_struct atts aname aval endelse vanames iatt aname endfor v create_struct v atts atts attnames anames endif vdnames dnames v dim vdsizes dsizes v dim v create_struct v dimnames vdnames dimsizes vdsizes if not keyword_set nodata then begin ncdf_varget id ivar vdata v create_struct v data ptr_new vdata dimdata replicate ptr_new vndim endif if ivar eq 0 then begin vars create_struct vname v endif else begin vars create_struct vars vname v endelse vnames ivar vname endfor endif if ndim gt 0 then begin for idim 0 ndim 1 do begin dname dnames idim d name:dname size:dsizes idim if not keyword_set nodata and nvar gt 0 then begin matchvar 1 for ivar 0 nvar 1 do begin if vnames ivar eq dname then matchvar ivar endfor if matchvar ne 1 then d create_struct d data vars matchvar data endif if idim eq 0 then begin dims create_struct dname d endif else begin dims create_struct dims dname d endelse endfor g create_struct g dims dims dimnames dnames dimsizes dsizes endif if nvar gt 0 then begin if not keyword_set nodata then begin for ivar 0 nvar 1 do begin for idim 0 vars ivar ndims 1 do begin vars ivar dimdata idim dims vars ivar dim idim data endfor endfor endif g create_struct g vars vars varnames vnames endif ncdf_close id return g end"); a[126] = new Array("./ReadWrite/idl-NetCDF/ncdf_struct_free.html", "ncdf_struct_free.pro", "", " file_comments categories param S The string to be searched returns restrictions examples history version Id: ncdf_struct_free pro 157 2006 08 21 09:01:50Z navarro PRO ncdf_struct_free s compile_opt idl2 strictarrsubs free heap memory associated with struct returned by ncdf_struct for i 0 s nvars 1 do ptr_free s vars i data end"); a[127] = new Array("./ReadWrite/ncdf_getatt.html", "ncdf_getatt.pro", "", " file_comments Get variable attibutes from a NetCDF file categories Read NetCDF file param fileid in required type salar string or long if fileid is a scalar string then it is the name of the file with the full path to be opened in that case the file will be opened and closed within ncdf_getatt if fileid is a scalar long then it is the id of the file return by a call to ncdf_open outside of ncdf_getatt in that case the file will NOT be opened and closed within ncdf_getatt param varid in required type salar string or long The netCDF variable ID returned from a previous call to NCDF_VARDEF or NCDF_VARID or the name of the variable keyword add_offset Set this keyword to a named variable in which the value of add_offset attribute is returned Return 0 if this attribute doesn t exist keyword scale_factor Set this keyword to a named variable in which the value of scale_factor attribute is returned Return 0 if this attribute doesn t exist keyword missing_value Set this keyword to a named variable in which the value of missing_value or _fillvalue attribute is returned Return the scalar no if this attribute doesn t exist keyword units Set this keyword to a named variable in which the value of units attribute is returned Return the empty string if this attribute doesn t exist keyword calendar Set this keyword to a named variable in which the value of calendar attribute is returned Return the string greg if this attribute doesn t exist keyword long_name Set this keyword to a named variable in which the value of long_name is returned Return empty string if this attribute does not exist keyword DOUBLE default 0 type 1 or 0 activate to force double precision floating point value of add_offset and scale_factor keyword standard_name Set this keyword to a named variable in which the value of standard_name CF convention is returned Return empty string if this attribute does not exist keyword _EXTRA defined only to be able to call ncdf_getatt with the _EXTRA keyword examples IDL ncdf_getatt cdfid sst add_offset add_offset scale_factor scale_factor units units history August 2007: Sebastien Masson smasson lodyc jussieu fr version Id: ncdf_getatt pro 396 2009 04 08 16:14:31Z smasson PRO ncdf_getatt fileid varid ADD_OFFSET add_offset SCALE_FACTOR scale_factor MISSING_VALUE missing_value UNITS units CALENDAR calendar LONG_NAME long_name STANDARD_NAME standard_name DOUBLE double _extra ex compile_opt idl2 strictarrsubs cm_general needed for iodir should we open the file IF size fileid type EQ 7 THEN cdfid ncdf_open isafile fileid title which file must be open by ncdf_getatt IODIRECTORY iodir _extra ex ELSE cdfid fileid default definitions units add_offset 0 scale_factor 1 missing_value no calendar greg long_name standard_name varinq ncdf_varinq cdfid varid IF varinq natts GT 0 THEN BEGIN FOR a 0 varinq natts 1 DO BEGIN attname ncdf_attname cdfid varid a CASE strlowcase attname OF units :BEGIN ncdf_attget cdfid varid attname tmp units strcompress strtrim tmp 2 END calendar :BEGIN ncdf_attget cdfid varid attname tmp tmp strtrim tmp 2 CASE tmp OF noleap :calendar noleap 360d :calendar 360d greg :calendar greg 360_day :calendar 360d 365_day :calendar noleap gregorian : calendar greg ELSE:notused report Unknown calendar: tmp we use greg calendar ENDCASE END long_name :BEGIN ncdf_attget cdfid varid attname tmp long_name strtrim tmp 2 END standard_name :BEGIN ncdf_attget cdfid varid attname tmp standard_name strtrim tmp 2 END add_offset :ncdf_attget cdfid varid attname add_offset scale_factor :ncdf_attget cdfid varid attname scale_factor _fillvalue :ncdf_attget cdfid varid attname missing_value missing_value :ncdf_attget cdfid varid attname missing_value ELSE: ENDCASE ENDFOR ENDIF IF size missing_value type EQ 1 THEN BEGIN missing_value strlowcase string missing_value IF strmid missing_value 0 1 reverse_offset EQ f THEN missing_value strmid missing_value 0 strlen missing_value 1 IF isnumber string missing_value tmp EQ 1 THEN BEGIN missing_value tmp ENDIF ELSE BEGIN ras report Warning: missing value is not a number: missing_value missing_value no ENDELSE ENDIF IF keyword_set double THEN BEGIN add_offset double add_offset scale_factor double scale_factor ENDIF ELSE BEGIN add_offset float add_offset scale_factor float scale_factor ENDELSE IF size fileid type EQ 7 THEN ncdf_close cdfid return END "); a[128] = new Array("./ReadWrite/ncdf_getaxis.html", "ncdf_getaxis.pro", "", " file_comments get the x y dimension Id and x y axes from a netcdf file categories Read NetCDF file param fileid in required type scalar the id of the netcdf file param dimidx out type scalar long id of the x dimension param dimidy out type scalar long id of the y dimension param xaxis out type 1D or 2D array the x axis param yaxis out type 1D or 2D array the y axis keyword ROMSGRID out type scalar: 0 or 1 gives back if we are using a ROMS grid 1 or not 0 keyword START1 default 0 type scalar: 0 or 1 Index the axis from 1 instead of 0 when using xyindex keyword XDIMNAME default longitude lon x longitude lon x longitude lon or x type scalar string A string giving the name of the x dimension or and a named variable in which x dimension name is returned keyword YDIMNAME default latitude lat y latitude lat y eta_ latitude lat y type scalar string A string giving the name of the y dimension or and a named variable in which y dimension name is returned keyword XAXISNAME default x longitude nav_lon lon lon_rho or NbLongitudes type scalar string A string giving the name of the variable in the file that contains the x axis or and a named variable in which this variable name is returned keyword YAXISNAME default y latitude nav_lat lat lat_rho or NbLatitudes type scalar string A string giving the name of the variable in the file that contains the y axis or and a named variable in which this variable name is returned keyword XYINDEX default 0 type scalar: 0 or 1 To define the x y axis with index instead of using the values contained in X YAXISNAME x yaxis keyword_set start1 findgen jpi jpj keyword XMINMESH default 0L type scalar Define common cm_4mesh variables ixminmesh used to define the localization of the first point of the grid along the x direction in a zoom of the original grid keyword YMINMESH default 0L type scalar Define common cm_4mesh variables iyminmesh used to define the localization of the first point of the grid along the y direction in a zoom of the original grid keyword XMAXMESH default jpiglo 1 type scalar Define common cm_4mesh variables ixmaxmesh used to define the localization of the last point of the grid along the x direction in a zoom of the original grid Note that if XMAXMESH long xminmesh 0 ELSE ixminmesh 0l IF n_elements yminmesh NE 0 THEN iyminmesh 0L long yminmesh 0 ELSE iyminmesh 0l IF n_elements zminmesh NE 0 THEN izminmesh 0L long zminmesh 0 ELSE izminmesh 0l should we open the file IF size fileid type EQ 7 THEN cdfid ncdf_open isafile fileid title which file must be open by ncdf_getaxis IODIRECTORY iodir _extra ex ELSE cdfid fileid what is inside the file inside ncdf_inquire cdfid name of all dimensions namedim strarr inside ndims for dimiq 0 inside ndims 1 do begin ncdf_diminq cdfid dimiq tmpname value namedim dimiq strlowcase tmpname ENDFOR name of the variables namevar strarr inside nvars for varid 0 inside nvars 1 do begin invar ncdf_varinq cdfid varid namevar varid strlowcase invar name ENDFOR find the xaxis try to get the variable that contains the xaxis if keyword_set xaxisname then xaxisname strlowcase xaxisname ELSE xaxisname x xvarid where namevar EQ xaxisname OR namevar EQ longitude OR namevar EQ nav_lon OR namevar EQ lon OR namevar EQ lon_rho OR namevar EQ nblongitudes 0 no xaxis variable found we will build a fake xaxis based on the size of the x dimension we must find the x dimension IF xvarid EQ 1 THEN BEGIN dummy report xaxis variable was not found within the default names: longitude nav_lon lon lon_rho nblongitudes we use a fake xaxis based on x dimension size or use XAXISNAME keyword simple xaxisname Not Found try to get the dimension corresponding to x roms file dimidx where namedim EQ xi_rho OR namedim EQ xi_u OR namedim EQ xi_v OR namedim EQ xi_psi IF dimidx 0 EQ 1 THEN BEGIN we are looking for a x dimension with a name matching one of the following regular expression: if keyword_set xdimname then testname strlowcase xdimname ELSE testname longitude lon x longitude lon x longitude lon x cnt 1 ii 0 WHILE cnt NE 1 AND ii LT n_elements testname DO BEGIN dimidx where strmatch namedim testname ii EQ 1 cnt ii ii 1 ENDWHILE CASE cnt OF 0:begin dummy report none of the dimensions name matches one of the following regular expression: longitude lon x longitude lon x longitude lon x we cannot find the x dimension use XDIMNAME keyword simple stop END 1:dimidx dimidx 0 ELSE:begin dummy report several and not one unique dimensions name matches the following regular expression: longitude lon x longitude lon x longitude lon x we cannot find the x dimension use XDIMNAME keyword simple stop ENDELSE ENDCASE romsgrid 0b ENDIF ELSE romsgrid 1b ENDIF ELSE BEGIN romsgrid strmid namevar xvarid 0 4 EQ lon_ xinq ncdf_varinq cdfid xvarid xaxisname xinq name dimidx xinq dim 0 xoffset lonarr xinq ndims xcount lonarr xinq ndims FOR i 0 xinq ndims 1 DO BEGIN ncdf_diminq cdfid xinq dim i blabla tmpsz xcount i tmpsz ENDFOR jpiglo xcount 0 IF n_elements xmaxmesh NE 0 THEN BEGIN IF xmaxmesh GE 0 THEN ixmaxmesh long xmaxmesh 0 ELSE ixmaxmesh xcount 0 1 long xmaxmesh 0 ENDIF ELSE ixmaxmesh xcount 0 1L ixmaxmesh 0 ixmaxmesh iymaxmesh we must find the y dimension if yvarid EQ 1 then begin dummy report yaxis variable was not found within the default names: latitude nav_lat lat lat_rho nblatitudes we use a fake yaxis based on y dimension size or use YAXISNAME keyword simple yaxisname Not Found try to get the dimension corresponding to y roms file dimidy where namedim EQ eta_rho OR namedim EQ eta_u OR namedim EQ eta_v OR namedim EQ eta_psi IF dimidy 0 EQ 1 THEN BEGIN we are looking for a y dimension with a name matching one of the following regular expression: if keyword_set ydimname then testname strlowcase ydimname ELSE testname latitude lat y latitude lat y eta_ latitude lat y cnt 1 ii 0 WHILE cnt NE 1 AND ii LT n_elements testname DO BEGIN dimidy where strmatch namedim testname ii EQ 1 cnt ii ii 1 ENDWHILE CASE cnt OF 0:begin dummy report none of the dimensions name matches one of the following regular expression: latitude lat y latitude lat y eta_ latitude lat y we cannot find the y dimension use YDIMNAME keyword simple stop END 1:dimidy dimidy 0 ELSE:begin dummy report several and not one unique dimensions name matches the following regular expression: latitude lat y latitude lat y eta_ latitude lat y we cannot find the y dimension use YDIMNAME keyword simple stop ENDELSE ENDCASE ENDIF ENDIF ELSE BEGIN yinq ncdf_varinq cdfid yvarid yaxisname yinq name IF yinq ndims GE 2 THEN dimidy yinq dim 1 ELSE dimidy yinq dim 0 yoffset lonarr yinq ndims ycount lonarr yinq ndims FOR i 0 yinq ndims 1 DO BEGIN ncdf_diminq cdfid yinq dim i blabla tmpsz ycount i tmpsz ENDFOR idy yinq ndims GE 2 jpjglo ycount idy IF n_elements ymaxmesh NE 0 THEN BEGIN IF ymaxmesh GE 0 THEN iymaxmesh long ymaxmesh 0 ELSE iymaxmesh ycount idy 1L long ymaxmesh 0 ENDIF ELSE iymaxmesh ycount idy 1L iymaxmesh iymaxmesh ycount idy 1L make sure ixmaxmesh is not too big yoffset idy iyminmesh ycount idy iymaxmesh iyminmesh 1L jpjfromy ycount idy jpj jpjfromy IF yinq ndims GE 2 THEN BEGIN jpiglo ycount 0 IF n_elements xmaxmesh NE 0 THEN BEGIN IF xmaxmesh GE 0 THEN ixmaxmesh long xmaxmesh 0 ELSE ixmaxmesh ycount 0 1L long xmaxmesh 0 ENDIF ELSE ixmaxmesh ycount 0 1L ixmaxmesh ixmaxmesh ycount 0 1L make sure ixmaxmesh is not too big yoffset 0 ixminmesh ycount 0 ixmaxmesh ixminmesh 1L jpifromy xcount 0 jpi jpifromy ENDIF ENDELSE IF arg_present ydimname THEN ncdf_diminq cdfid dimidy ydimname tmp IF arg_present yaxis THEN BEGIN IF n_elements jpifromy NE 0 THEN BEGIN IF n_elements jpifromx EQ 0 THEN ncdf_diminq cdfid dimidx blabla jpifromx IF jpifromy NE jpifromx THEN BEGIN dummy report x y axes do not have the same x dimension stop ENDIF ENDIF IF n_elements jpjfromx NE 0 THEN BEGIN IF n_elements jpjfromy EQ 0 THEN ncdf_diminq cdfid dimidy blabla jpjfromy IF jpjfromy NE jpjfromx THEN BEGIN dummy report x y axes do not have the same y dimension stop ENDIF ENDIF should we read or compute the xaxis IF keyword_set xyindex OR yvarid EQ 1 THEN BEGIN yaxis keyword_set start1 findgen jpjfromy ENDIF ELSE BEGIN read the yaxis ncdf_varget cdfid yvarid yaxis offset yoffset count ycount ncdf_getatt cdfid yvarid ADD_OFFSET add_offset SCALE_FACTOR scale_factor IF scale_factor NE 1 THEN yaxis temporary yaxis scale_factor IF add_offset NE 0 THEN yaxis temporary yaxis add_offset make sure of the shape of xaxis IF n_elements jpifromy NE 0 THEN yaxis reform yaxis jpifromy jpjfromy over ENDELSE ENDIF IF size fileid type EQ 7 THEN ncdf_close cdfid return END"); a[129] = new Array("./ReadWrite/ncdf_getmask.html", "ncdf_getmask.pro", "", " file_comments get the land sea mask array from a NetCDF file categories Read NetCDF file param fileid in required type salar string or long if fileid is a scalar string then it is the name of the file with the full path to be opened in that case the file will be opened and closed within ncdf_getmask if fileid is a scalar then it is the id of the file return by a call to ncdf_open outside of ncdf_getmask in that case the file will NOT be opened and closed within ncdf_getmask keyword ADDSCL_BEFORE default 0 type scalar: 0 or 1 put 1 to apply add_offset and scale factor on data before looking for missing values when using USEASMASK keyword keyword INVMASK default 0 type scalar: 0 or 1 Inverse the land sea mask that should have 0 1 values for land sea : mask 1 mask keyword MASKNAME type string A string giving the name of the variable in the file that contains the land sea mask keyword MISSING_VALUE type scalar To define or redefine if the attribute is already existing the missing values used with USEASMASK keyword Note that this value is not used if TESTOP keyword is given and contains 2 words keyword USEASMASK type scalar string A string giving the name of the variable in the file that will be used to build the land sea mask In this case the mask is based on the first record if record dimension exists The mask is build according to operator defined by TESTOP keyword default NE and the testing values defined as 1 the second word of TESTOP if existing 2 MISSING_VALUE keyword 3 attribute missing_value or _fillvalue of the variable USEASMASK 4 Values f_nan can be used only with NE and EQ operators keyword TESTOP default NE type scalar string for example GT 0 5 a string describing the type of test that will be done to define the mask The test is performed on the variable specified by USEASMASK keyword TESTOP can contain 1 or 2 words The first word is the operator definition: EQ NE GE GT LE LT default is NE The second word define the testing value If TESTOP contains only 1 word then the test value is denifed by 1 MISSING_VALUE keyword 2 attribute missing_value or _fillvalue of the variable USEASMASK 3 Values f_nan can be used only with NE and EQ operators keyword XMINMESH default 0L type scalar Define common cm_4mesh variables ixminmesh used to define the localization of the first point of the grid along the x direction in a zoom of the original grid keyword YMINMESH default 0L type scalar Define common cm_4mesh variables iyminmesh used to define the localization of the first point of the grid along the y direction in a zoom of the original grid keyword ZMINMESH default 0L type scalar Define common cm_4mesh variables izminmesh used to define the localization of the first point of the grid along the z direction in a zoom of the original grid keyword XMAXMESH default jpiglo 1 type scalar Define common cm_4mesh variables ixmaxmesh used to define the localization of the last point of the grid along the x direction in a zoom of the original grid Note that if XMAXMESH mask ncdf_getmask HadISST1_1m_187001_200702_sst_reg1m nc useasmask sst missing_value 1 00000e 30 IDL mask ncdf_getmask meshmaskORCA2 nc maskname tmask IDL mask ncdf_getmask t106 nc useasmask SLM testop le 0 5 history August 2007: Sebastien Masson smasson lodyc jussieu fr version Id: ncdf_getmask pro 399 2009 07 02 08:38:54Z smasson FUNCTION ncdf_getmask fileid ADDSCL_BEFORE addscl_before MASKNAME maskname USEASMASK useasmask MISSING_VALUE missing_value INVMASK invmask XMINMESH xminmesh XMAXMESH xmaxmesh YMINMESH yminmesh YMAXMESH ymaxmesh ZMINMESH zminmesh ZMAXMESH zmaxmesh TESTOP testop _EXTRA ex compile_opt idl2 strictarrsubs cm_general needed for iodir IF n_elements xminmesh NE 0 THEN ixminmesh 0L long xminmesh 0 ELSE ixminmesh 0l IF n_elements yminmesh NE 0 THEN iyminmesh 0L long yminmesh 0 ELSE iyminmesh 0l IF n_elements zminmesh NE 0 THEN izminmesh 0L long zminmesh 0 ELSE izminmesh 0l IF NOT keyword_set maskname OR keyword_set useasmask AND keyword_set romsgrid THEN maskname mask_rho IF NOT keyword_set maskname OR keyword_set useasmask THEN return 1 should we open the file IF size fileid type EQ 7 THEN cdfid ncdf_open isafile fileid title which file must be open by ncdf_getmask IODIRECTORY iodir _extra ex ELSE cdfid fileid what is inside the file inq ncdf_inquire cdfid name of the variables namevar strarr inq nvars for varid 0 inq nvars 1 do begin invar ncdf_varinq cdfid varid namevar varid strlowcase invar name ENDFOR CASE 1 OF keyword_set maskname :mskid where namevar EQ strlowcase maskname 0 keyword_set useasmask :mskid where namevar EQ strlowcase useasmask 0 ENDCASE if mskid NE 1 THEN BEGIN mskinq ncdf_varinq cdfid mskid is the mask variable containing the record dimension withrcd where mskinq dim EQ inq recdim 0 in order to read only the first record we need to get the size of each dimension offset lonarr mskinq ndims count replicate 1L mskinq ndims FOR d 0 mskinq ndims 1 DO BEGIN IF d NE withrcd THEN BEGIN ncdf_diminq cdfid mskinq dim d name size count d size ENDIF ENDFOR IF n_elements xmaxmesh NE 0 THEN BEGIN IF xmaxmesh GE 0 THEN ixmaxmesh long xmaxmesh 0 ELSE ixmaxmesh count 0 1L long xmaxmesh 0 ENDIF ELSE ixmaxmesh count 0 1L ixmaxmesh 0 ixmaxmesh iymaxmesh izmaxmesh count 2 1L make sure ixmaxmesh is not too big jpkglo count 2 offset 2 izminmesh count 2 izmaxmesh izminmesh 1L jpk count 2 ENDIF read the variable for the first record ncdf_varget cdfid mskid mask count count offset offset get add_offset scale factor and missing value attributes ncdf_getatt cdfid mskid add_offset add scale_factor scl missing_value miss do we apply add_offset and scale factor IF keyword_set addscl_before THEN BEGIN IF scl NE 1 THEN mask mask scl IF add NE 0 THEN mask mask add ENDIF IF keyword_set useasmask THEN BEGIN IF n_elements missing_value NE 0 THEN miss missing_value IF size miss type EQ 7 THEN miss values f_nan IF NOT keyword_set testop THEN testop NE tmp strsplit testop extract op strupcase tmp 0 IF op EQ EQ THEN BEGIN op NE invmask 1b keyword_set invmask ENDIF IF n_elements tmp EQ 1 THEN testval miss ELSE testval float tmp 1 IF finite testval EQ 0 THEN BEGIN IF op NE NE THEN mask report NaN test value can be used only with EQ or NE operator ELSE mask finite mask ENDIF ELSE BEGIN CASE op OF GE :mask mask GE testval GT :mask mask GT testval LE :mask mask LE testval LT :mask mask LT testval NE :BEGIN we have to take care of the float accuracy CASE 1 OF testval GE 1 e6:mask mask LT testval 10 testval LE 1 e6:mask mask GT testval 10 abs testval LE 1 e 6:mask abs mask GT 1 e 6 ELSE:mask mask NE testval ENDCASE END ENDCASE ENDELSE ENDIF IF mask 0 NE 1 THEN BEGIN mask byte round mask if keyword_set invmask then mask 1b mask ENDIF ENDIF ELSE mask 1 IF size fileid type EQ 7 THEN ncdf_close cdfid return mask END"); a[130] = new Array("./ReadWrite/ncdf_gettime.html", "ncdf_gettime.pro", "", " file_comments get the time axis from a netcdf_file and transforms it in Julian days of IDL categories Read NetCDF file param filename in required type scalar string the name of the ncdf_file param cdfid in optional type scalar the ID of the ncdf_file if the file is already open if not provided ncdf_gettime open the file defined by filename keyword TIMEVAR type string It define the name of the variable that contains the time axis This keyword can be useful if there is no unlimited dimension or if the time axis selected by default the first 1D array with unlimited dimension is not the good one keyword CALLER required type string Used to specify the error messages Give the name of the calling procedure It can be only read_ncdf or scanfile keyword CALTYPE Used to specify or orverwrite the type of calendar that should be used We accept only noleap 360d greg and gregorian By default we use the type of calendar defied in the attibute calendar if not we define it as gregorian keyword ERR Set this keyword to a named variable in which the value of the error message will be returned keyword _EXTRA _EXTRA to be able to call ncdf_getmask with _extra keyword returns a double 1D array of IDL Julian days In case of error return 1 if the time dimension was not found or return jpt if it as been found that the time dimension size is jpt restrictions the calendar variable must have the units attribute following the syntax below: time_counter:units seconds since 0001 01 01 00:00:00 time_counter:units hours since 0001 01 01 00:00:00 time_counter:units days since 1979 01 01 00:00:00 time_counter:units months since 1979 01 01 00:00:00 time_counter:units years since 1979 01 01 00:00:00 history August 2007: Sebastien Masson smasson lodyc jussieu fr version Id: ncdf_gettime pro 401 2009 07 23 08:48:16Z smasson FUNCTION ncdf_gettime filename cdfid CALTYPE caltype TIMEVAR timevar CALLER caller ERR err _EXTRA ex compile_opt idl2 strictarrsubs cm_4cal needed for key_caltype IF n_elements cdfid EQ 0 THEN BEGIN cdfid ncdf_open isafile filename title which file must be open by ncdf_gettime IODIRECTORY iodir _extra ex tobeclosed 1 ENDIF inq ncdf_inquire cdfid find the variable containing the time axis we get its name through the keyword timevar IF keyword_set timevar THEN BEGIN timeid ncdf_varid cdfid timevar IF timeid EQ 1 THEN BEGIN the variable is not found CASE caller OF read_ncdf :err No variable timevar found in filename Use the TIMESTEP keyword scanfile :err No variable timevar found in filename We create a fake calendar ENDCASE IF keyword_set tobeclosed THEN ncdf_close cdfid return 1 ENDIF timeinq ncdf_varinq cdfid timeid inq recdim timeinq dim 0 ncdf_diminq cdfid inq recdim timedimname jpt ENDIF ELSE BEGIN we try to find the time axis automatically we look for the infinite dimension IF inq recdim EQ 1 THEN BEGIN CASE caller OF read_ncdf :err the file filename as no infinite dimension C Use TIMESTEP or TIMEVAR keyword scanfile :err the file filename as no infinite dimension We create a fake calendar ENDCASE IF keyword_set tobeclosed THEN ncdf_close cdfid return 1 ENDIF ncdf_diminq cdfid inq recdim timedimname jpt we look for the variable containing the time axis we look for the first variable having for only dimension inq recdim timeid 0 REPEAT BEGIN As long as we have not find a variable having only one dimension: the infinite one timeinq ncdf_varinq cdfid timeid that the variable contain timeid timeid 1 ENDREP UNTIL n_elements timeinq dim EQ 1 AND timeinq dim 0 EQ inq recdim OR timeid EQ inq nvars 1 IF timeid EQ inq nvars 1 THEN BEGIN CASE caller OF read_ncdf :err the file filename as no time axis variable C Use the TIMESTEP keyword scanfile :err the file fullname has no time axis C we create a fake calendar ENDCASE IF keyword_set tobeclosed THEN ncdf_close cdfid return jpt ENDIF timeid timeid 1 ENDELSE look for attribute units and calendar to know how to compte the calendar no attribute for time variable IF timeinq natts EQ 0 then begin CASE caller OF read_ncdf :err the variable timeinq name has no attribute C Use the TIMESTEP keyword scanfile :err the variable timeinq name has no attribute C we create a fake calendar ENDCASE IF keyword_set tobeclosed THEN ncdf_close cdfid return jpt ENDIF get attributes names attnames strarr timeinq natts for attiq 0 timeinq natts 1 do attnames attiq strlowcase ncdf_attname cdfid timeid attiq do we find units attribute IF where attnames EQ units 0 EQ 1 then BEGIN CASE caller OF read_ncdf :err Attribute units not found for the variable timeinq name C Use the TIMESTEP keyword scanfile :err Attribute units not found for the variable timeinq name C we create a fake calendar ENDCASE IF keyword_set tobeclosed THEN ncdf_close cdfid return jpt ENDIF Is attribute calendar existing If no we suppose that the calendar is gregorian calendar ncdf_getatt cdfid timeid calendar calendar units value IF keyword_set caltype THEN calendar strlowcase caltype CASE calendar OF noleap :key_caltype noleap 360d :key_caltype 360d greg :key_caltype greg gregorian :key_caltype greg ELSE:BEGIN dummy report unknow calendar type: calendar we use gregorian calendar key_caltype greg END ENDCASE decode units attribute value strlowcase value IF value NE true julian day THEN BEGIN time_counter:units seconds since 0001 01 01 00:00:00 time_counter:units hours since 0001 01 01 00:00:00 time_counter:units days since 1979 01 01 00:00:00 time_counter:units months since 1979 01 01 00:00:00 time_counter:units years since 1979 01 01 00:00:00 we decript the units attribute to find the time origin words str_sep value units words 0 IF strpos units s strlen units 1 NE 1 THEN units strmid units 0 strlen units 1 IF strpos units julian_ NE 1 THEN units strmid units 7 IF units NE second AND units NE hour AND units NE day AND units NE month AND units NE year THEN BEGIN CASE caller OF read_ncdf :err time units does not start with seconds hours days months years C Use the TIMESTEP keyword scanfile :err time units does not start with seconds hours days months years C we create a fake calendar ENDCASE IF keyword_set tobeclosed THEN ncdf_close cdfid return jpt ENDIF IF stregex value since 0 9 1 4 0 9 1 2 0 9 1 2 boolean EQ 0 THEN BEGIN CASE caller OF read_ncdf :err attribute units of time has not the good format: since 0 9 1 4 0 9 1 2 0 9 1 2 C Use the TIMESTEP keyword scanfile :err attribute units of time has not the good format: since 0 9 1 4 0 9 1 2 0 9 1 2 C we create a fake calendar ENDCASE IF keyword_set tobeclosed THEN ncdf_close cdfid return jpt ENDIF start str_sep words 2 ENDIF ELSE units value compute time axis ncdf_varget cdfid timeid time time double time case units OF true julian day : second :time julday start 1 start 2 start 0 0 0 0 time 86400 d hour :time julday start 1 start 2 start 0 0 0 0 time 24 d day :time julday start 1 start 2 start 0 0 0 0 time month :BEGIN if total fix time NE time NE 0 then we switch to days with 30d m time julday start 1 start 2 start 0 0 0 0 round time 30 ELSE time julday start 1 fix time replicate start 2 jpt replicate start 0 jpt 0 0 0 END year :BEGIN if total fix time NE time NE 0 then we switch to days with 365d y time julday start 1 start 2 start 0 0 0 0 round time 365 ELSE time julday replicate start 1 jpt replicate start 2 jpt start 0 fix time 0 0 0 END ENDCASE time double time IF keyword_set tobeclosed THEN ncdf_close cdfid return time END"); a[131] = new Array("./ReadWrite/read_grads.html", "read_grads.pro", "", " file_comments reading grads file except data type station or grib from the grads control file even if there is multiple data files categories Reading param VAR in required the variable name param DATE1 in required date of the beginning yyyymmdd if TIMESTEP is not activate param DATE2 in optional last date Optional if not specified date2 date1 keyword FILENAME the grads control file name: xxxx ctl keyword TIMESTEP to specify that the dates are time steps instead of true calendar NOT yet available keyword BOX type A 4 or 6 elements 1d array lon1 lon2 lat1 lat2 depth1 depth2 It specifies the area where data must be read keyword EVERYTHING keyword NOSTRUCT keyword _EXTRA Used to pass keywords returns an array uses common restrictions define all the grid parameters defined in common associated to the data this function call the procedure scanfile that use the unix commands grep and sed examples IDL a read_grads sst 19900101 19900131 filename outputs ctl IDL plt a history Sebastien Masson smasson lodyc jussieu fr version Id: read_grads pro 370 2008 08 07 07:59:15Z pinsard FUNCTION read_grads var date1 date2 FILENAME filename BOX box TIMESTEP timestep EVERYTHING everything NOSTRUCT nostruct _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh cm_4data cm_4cal IF NOT keyword_set key_forgetold THEN BEGIN updatenew ENDIF we find the filename filename isafile FILENAME filename IODIRECTORY iodir _EXTRA ex if size filename type NE 7 then return report read_ncdf cancelled we scan the control file called filename scanctl filename filesname jpt1file varsname varslev swapbytes bigendian littleendian f77sequential fileheader theader xyheader VARFMT varfmt _EXTRA ex if n_elements varfmt EQ 0 then varfmt float check date1 and date2 and found the starting index t1 and the ending index t2 that corresponds to the time series specified by date1 and date2 for the time axis defined in the ctl file if n_elements date1 EQ 0 then begin t0 0 t1 0 ENDIF if n_elements date2 EQ 0 then date2 date1 if keyword_set timestep then BEGIN if date1 GT date2 then begin ras report date2 must be larger than date1 return 1 endif t1 0 long date1 long date2 date2jul date2 grads if jdate1 GT jdate2 then begin ras report date2 must be larger than date1 return 1 endif t1 where time GE jdate1 0 tmp where time LE jdate2 t2 t2 t2 1 ENDELSE if t2 LT t1 then begin ras report There is no date between date1 and date2 return 1 endif jpt2read t2 t1 1 index of the variable varid where strlowcase varsname EQ strlowcase var varid varid 0 if varid EQ 1 then begin ras report var not found in the variable list of filename return 1 ENDIF varname var if varslev varid EQ 1 then res fltarr jpi jpj jpt2read nozero ELSE res fltarr jpi jpj varslev varid jpt2read nozero find the first file to be read according to the file list the number of time step in each file and t1 and t2 indf2read t1 jpt1file startread t1 indf2read jpt1file alreadyread 0 readagain: jpt2read1file min jpt1file startread jpt2read f2read filesname indf2read opening check the existence of the file f2read isafile filename f2read iodirectory iodir _EXTRA ex if the file is stored on tape if version os_family EQ unix then spawn file f2read dev null open the file openr unit f2read get_lun error err swap_if_little_endian bigendian swap_if_big_endian littleendian swap_endian swapbytes if err ne 0 then begin ras report err_string return 1 endif case varfmt of byte :fmtsz 1l uint :fmtsz 2l int :fmtsz 2l long :fmtsz 4l float :fmtsz 4l endcase check its size addf77sec long 4 2 f77sequential xyblocsize xyheader addf77sec xyheader NE 0 jpi jpj fmtsz addf77sec nxybloc long total varslev filesize fileheader addf77sec fileheader NE 0 theader addf77sec theader NE 0 nxybloc xyblocsize jpt1file infof2read fstat unit if infof2read size NE filesize then begin ras report According to filename the file size must be strtrim filesize 1 instead of strtrim infof2read size 1 jpi: strtrim jpi 2 jpj: strtrim jpj 2 jpt: strtrim jpt 2 format size in byte: strtrim fmtsz 2 number of xy arrays: strtrim nxybloc 2 return 1 endif reading loop on the time steps to be read in one file for i 0 jpt2read1file 1 do begin computing the offset offset fileheader addf77sec fileheader NE 0 theader addf77sec theader NE 0 nxybloc xyblocsize startread i theader addf77sec theader NE 0 if varid NE 0 THEN offset offset long total varslev 0:varid 1 xyblocsize if there is only one level IF varslev varid EQ 1 then begin case varfmt of byte :a assoc unit bytarr jpi jpj nozero offset 4 f77sequential uint :a assoc unit uintarr jpi jpj nozero offset 4 f77sequential int :a assoc unit intarr jpi jpj nozero offset 4 f77sequential long :a assoc unit lonarr jpi jpj nozero offset 4 f77sequential float :a assoc unit fltarr jpi jpj nozero offset 4 f77sequential endcase res i alreadyread a 0 ENDIF ELSE BEGIN more than 1 level to be read if f77sequential then BEGIN sequential access case varfmt of byte :a assoc unit bytarr jpi jpj 8 varslev varid nozero offset uint :a assoc unit uintarr jpi jpj 4 varslev varid nozero offset int :a assoc unit intarr jpi jpj 4 varslev varid nozero offset long :a assoc unit lonarr jpi jpj 2 varslev varid nozero offset float :a assoc unit fltarr jpi jpj 2 varslev varid nozero offset endcase tmp a 0 case varfmt OF we cut the headers and tailers of f77 write byte : tmp tmp 4:jpi jpj 3 uint : tmp tmp 2:jpi jpj 1 int : tmp tmp 2:jpi jpj 1 long : tmp tmp 1:jpi jpj 0 float :tmp tmp 1:jpi jpj 0 endcase if keyword_set key_zreverse then res i alreadyread reverse reform tmp jpi jpj varslev varid over 3 ELSE res i alreadyread reform tmp jpi jpj varslev varid over ENDIF ELSE BEGIN direct acces case varfmt of byte :a assoc unit bytarr jpi jpj varslev varid nozero offset uint :a assoc unit uintarr jpi jpj varslev varid nozero offset int :a assoc unit intarr jpi jpj varslev varid nozero offset long :a assoc unit lonarr jpi jpj varslev varid nozero offset float :a assoc unit fltarr jpi jpj varslev varid nozero offset endcase if keyword_set key_zreverse then res i alreadyread reverse a 0 3 ELSE res i alreadyread a 0 ENDELSE ENDELSE endfor close the file free_lun unit close unit do we need to read a new file to complete the time series if jpt2read1file NE jpt2read then BEGIN indf2read indf2read 1 startread 0 alreadyread alreadyread jpt2read1file jpt2read jpt2read jpt2read1file GOTO readagain ENDIF post processing if keyword_set key_yreverse then res reverse res 2 if keyword_set key_shift then begin case size res 0 of 2:res shift res key_shift 0 3:res shift res key_shift 0 0 4:res shift res key_shift 0 0 0 endcase endif mask IF varslev varid EQ 1 then begin if abs valmask LE 1e5 then notgood where res 0 EQ valmask ELSE notgood where abs res 0 GE abs valmask 10 if notgood 0 NE 1 then tmask notgood 0b ENDIF ELSE BEGIN if abs valmask LE 1e5 then notgood where res 0 EQ valmask ELSE notgood where abs res 0 GE abs valmask 10 if notgood 0 NE 1 then tmask notgood 0b ENDELSE if abs valmask LE 1e5 then notgood where res EQ valmask ELSE notgood where abs res GE abs valmask 10 if notgood 0 NE 1 THEN res notgood values f_nan valmask 1e20 if abs valmask LE 1e5 then notgood where res EQ valmask ELSE notgood where abs res GE abs valmask 10 if notgood 0 NE 1 THEN res notgood 1e20 valmask 1e20 triangles_list triangule subdomain extraction time arguments time time t1:t2 jpt t2 t1 1 if keyword_set timestep then vardate strtrim time 0 2 ELSE vardate date2string vairdate time 0 updateold return res end"); a[132] = new Array("./ReadWrite/read_oasis.html", "read_oasis.pro", "", " file_comments read the f77 unformatted files used in Oasis version a read_oasis grids_orca_t106 a106 lon 320 160 IDL m read_oasis masks_orca_t106 or1t msk 182 149 i4 see also IDL scanoasis grids_orca_t106 history Sebastien Masson smasson lodyc jussieu fr July 01 2002 version Id: read_oasis pro 371 2008 08 07 09:32:02Z pinsard FUNCTION read_oasis filename varname jpi jpj I2 I2 I4 i4 I8 i8 R4 r4 compile_opt idl2 strictarrsubs openr unit filename f77_unformatted get_lun swap_if_little_endian error err if err ne 0 then begin ras report err_string return 1 endif char8 12345678 readu unit char8 print char8 found char8 EQ varname WHILE NOT EOF unit AND found NE 1 DO BEGIN readu unit if EOF unit then begin ras report varname not found in filename return 1 endif readu unit char8 print char8 found char8 EQ varname ENDWHILE case 1 of keyword_set i2 :res intarr jpi jpj keyword_set i4 :res lonarr jpi jpj keyword_set i8 :res lon64arr jpi jpj keyword_set r4 :res fltarr jpi jpj ELSE:res dblarr jpi jpj endcase readu unit res free_lun unit return res end"); a[133] = new Array("./ReadWrite/readbat.html", "readbat.pro", "", " file_comments reading the bathymetry ASCII file of OPA categories For OPA param FILENAME in required type string It contains the filename keyword ZERO to put 0 on land instead of negatives values for the islands returns a 2d array history Sebastien Masson smasson lodyc jussieu fr May 31 2002 based on batlec2 pro written by Maurice Imbard March 17 1998 version Id: readbat pro 372 2008 08 08 12:31:53Z pinsard FUNCTION readbat filename ZERO zero compile_opt idl2 strictarrsubs lecture de la bathymetrie iname_file findfile filename if iname_file 0 EQ then begin ras report Bad file name return 1 ENDIF ELSE iname_file iname_file 0 openr iunit iname_file get_lun readf iunit FORMAT 16x 2i8 iim ijm iim long iim ijm long ijm tmp readf iunit tmp tmp strsplit tmp extract iim long tmp n_elements tmp 2 ijm long tmp n_elements tmp 1 print iim ijm ifreq 40L ifin iim ifreq 1 irest iim ifin 1 ifreq print ifin irest ifreq zbati intarr ifreq zbati2 intarr irest zbat intarr iim ijm readf iunit FORMAT readf iunit FORMAT il1 0 FOR jn 1 ifin 1 DO BEGIN readf iunit FORMAT readf iunit FORMAT il2 min iim 1 il1 ifreq 1 readf iunit FORMAT readf iunit FORMAT readf iunit FORMAT il3 il2 jn 1 ifreq iformat string il3 2 i3 print jn il1 il2 il3 ifreq 1 FOR jj ijm 1 0 1 DO BEGIN readf iunit FORMAT iformat ij zbati zbat il1:il2 jj zbati ENDFOR il1 il1 ifreq ENDFOR readf iunit FORMAT readf iunit FORMAT il2 min iim 1 il1 ifreq 1 readf iunit FORMAT readf iunit FORMAT readf iunit FORMAT il3 il2 ifin 1 ifreq iformat string il3 2 i3 print irest 1 il1 il2 il3 FOR jj ijm 1 0 1 DO BEGIN readf iunit FORMAT iformat ij zbati2 zbat il1:il2 jj zbati2 ENDFOR close iunit free_lun iunit if keyword_set zero then zbat 0 zbat return zbat end"); a[134] = new Array("./ReadWrite/readoldopadistcoast.html", "readoldopadistcoast.pro", "", " file_comments read the old binary direct access file that contains the distance to the coast in OPA based on the OPA subroutines dtacof and parctl categories For OPA param UNIT param PARAMS param NUM returns a structure that contains two elements: tdistcoast the distance for the t points and fdiscoast the distance for the f points history Sebastien Masson smasson lodyc jussieu fr June 2002 version Id: readoldopadistcoast pro 372 2008 08 08 12:31:53Z pinsard FUNCTION read3fromopa unit params num compile_opt idl2 strictarrsubs offset params reclen params jpk num 1L a assoc unit dblarr params jpiglo params jpjglo params jpk nozero offset b a 0 return b end file_comments categories For OPA param FILENAME in required Filename with the whole path if necessary param JPIGLO in required param JPJGLO in required param JPK in required Dimensions of the opa grid keyword IBLOC default 4096L Ibloc size keyword JPBYT default 8L Jpbyt size keyword NUMREC default 19L jpk Number of records in the file history Sebastien Masson smasson lodyc jussieu fr June 2002 version Id: readoldopadistcoast pro 372 2008 08 08 12:31:53Z pinsard FUNCTION readoldopadistcoast filename jpiglo jpjglo jpk IBLOC ibloc JPBYT jpbyt NUMREC numrec compile_opt idl2 strictarrsubs iname_file findfile filename if iname_file 0 EQ then begin ras report Bad file name return 1 ENDIF ELSE iname_file iname_file 0 open the file openr numcost iname_file get_lun swap_if_little_endian check the size of the file filepamameters fstat numcost default parameter definition for ORCA2 IF keyword_set ibloc THEN ibloc long ibloc ELSE ibloc 4096L jpiglo long jpiglo jpjglo long jpjglo jpk long jpk IF keyword_set jpbyt THEN jpbyt long jpbyt ELSE jpbyt 8L record length computation reclen ibloc jpiglo jpjglo jpbyt 1 ibloc 1 number of records IF keyword_set numrec THEN numrec long numrec ELSE numrec 3L jpk difference between the record length and the size of the contened array toomuch reclen jpiglo jpjglo jpbyt expected size computation size numrec reclen toomuch if size NE filepamameters size then begin ras report The size of the file is not the expected one Check your file or the values of ibloc jpiglo jpjglo jpk jpbyt numrec in this program return 1 endif first record: six 64 bit integer to read default definition iimlu long64 999 ijmlu long64 999 ikmlu long64 999 read readu numcost iimlu ijmlu ikmlu if iimlu NE jpiglo then begin ras report iimlu strtrim iimlu 1 differs from jpiglo strtrim jpiglo 1 return 1 endif if ijmlu NE jpjglo then begin ras report ijmlu strtrim ijmlu 1 differs from jpjglo strtrim jpjglo 1 return 1 endif if ikmlu NE jpk then begin ras report ikmlu strtrim ikmlu 1 differs from jpk strtrim jpk 1 return 1 endif other records params jpiglo:jpiglo jpjglo:jpjglo jpk:jpk reclen:reclen tdistcoast read3fromopa numcost params 2 fdistcoast read3fromopa numcost params 3 close numcost free_lun numcost return tdistcoast:tdistcoast fdistcoast:fdistcoast end"); a[135] = new Array("./ReadWrite/readoldoparestart.html", "readoldoparestart.pro", "", " categories For OPA param UNIT param PARAMS param NUM restrictions bug for etab and etan written on the same record history Sebastien Masson smasson lodyc jussieu fr June 2002 version Id: readoldoparestart pro 327 2007 12 13 16:22:35Z pinsard FUNCTION read2fromopa unit params num compile_opt idl2 strictarrsubs offset params reclen params jpk num 1L a assoc unit dblarr params jpiglo params jpjglo nozero offset return a 0 end categories For OPA param UNIT param PARAMS param NUM history Sebastien Masson smasson lodyc jussieu fr June 2002 FUNCTION read3fromopa unit params num compile_opt idl2 strictarrsubs offset params reclen params jpk num 1L a assoc unit dblarr params jpiglo params jpjglo params jpk nozero offset return a 0 end file_comments read the old restart files of OPA before NetCDF based on the OPA subroutine dtrlec included at the end of the file categories For OPA param FILENAME in required with the whole path if necessary param JPIGLO in required param JPJGLO in required param JPK in required dimensions of the opa grid keyword IBLOC default 4096L Ibloc size keyword JPBYT default 8L Jpbyt size keyword NUMREC default 19L jpk Number of records in the file keyword UB keyword VB keyword TB keyword SB keyword ROTB keyword HDIVB keyword UN keyword VN keyword TN keyword SN keyword ROTN keyword HDIVN keyword GCX keyword GCXB keyword ETAB keyword ETAN keyword BSFB keyword BSFN keyword BSFD keyword EN the variable we want to read returns According to the given keywords restrictions Bug for etab and etan written on the same record history Sebastien Masson smasson lodyc jussieu fr June 2002 version Id: readoldoparestart pro 327 2007 12 13 16:22:35Z pinsard PRO readoldoparestart filename jpiglo jpjglo jpk IBLOC ibloc JPBYT jpbyt NUMREC numrec UB ub VB vb TB tb SB sb ROTB rotb HDIVB hdivb UN un VN vn TN tn SN sn ROTN rotn HDIVN hdivn GCX gcx GCXB gcxb ETAB etab ETAN etan BSFB bsfb BSFN bsfn BSFD bsfd EN en compile_opt idl2 strictarrsubs iname_file findfile filename if iname_file 0 EQ then begin ras report Bad file name return ENDIF ELSE iname_file iname_file 0 open the file openr numrst iname_file get_lun swap_if_little_endian check the size of the file filepamameters fstat numrst parameter definition IF keyword_set ibloc THEN ibloc long ibloc ELSE ibloc 4096L jpiglo long jpiglo jpjglo long jpjglo jpk long jpk IF keyword_set jpbyt THEN jpbyt long jpbyt ELSE jpbyt 8L record length computation reclen ibloc jpiglo jpjglo jpbyt 1 ibloc 1 IF keyword_set numrec THEN numrec long numrec ELSE numrec 19L jpk toomuch reclen jpiglo jpjglo jpbyt expected size computation size numrec reclen toomuch if size NE filepamameters size then begin ras report The size of the file is not the expected one Check your file or the values of ibloc jpiglo jpjglo jpk jpbyt numrec in this program return endif first record: six 64 bit integer to read default definition ino1 long64 9999 it1 long64 9999 isor1 long64 9999 ipcg1 long64 9999 itke1 long64 9999 idast1 long64 9999 read readu numrst ino1 it1 isor1 ipcg1 itke1 idast1 print ino1 it1 isor1 ipcg1 itke1 idast1 other records params jpiglo:jpiglo jpjglo:jpjglo jpk:jpk reclen:reclen CALL read3 numrst ub 2 IF arg_present ub THEN ub read3fromopa numrst params 2 CALL read3 numrst vb 3 IF arg_present vb THEN vb read3fromopa numrst params 3 CALL read3 numrst tb 5 IF arg_present tb THEN tb read3fromopa numrst params 5 CALL read3 numrst sb 6 IF arg_present sb THEN sb read3fromopa numrst params 6 CALL read3 numrst rotb 7 IF arg_present rotb THEN rotb read3fromopa numrst params 7 CALL read3 numrst hdivb 8 IF arg_present hdivb THEN hdivb read3fromopa numrst params 8 CALL read3 numrst un 9 IF arg_present un THEN un read3fromopa numrst params 9 CALL read3 numrst vn 10 IF arg_present vn THEN vn read3fromopa numrst params 10 CALL read3 numrst tn 12 IF arg_present tn THEN tn read3fromopa numrst params 12 CALL read3 numrst sn 13 IF arg_present sn THEN sn read3fromopa numrst params 13 CALL read3 numrst rotn 14 IF arg_present rotn THEN rotn read3fromopa numrst params 14 CALL read3 numrst hdivn 15 IF arg_present hdivn THEN hdivn read3fromopa numrst params 15 C C Read elliptic solver arrays C CALL read2 numrst gcx jpk 17 IF arg_present gcx THEN gcx read2fromopa numrst params 17 CALL read2 numrst gcxb jpk 18 IF arg_present gcxb THEN gcxb read2fromopa numrst params 18 C ifdef key_freesurf_cstvol C C free surface formulation eta C CALL read2 numrst etab jpk 4 IF arg_present etab THEN etab read2fromopa numrst params 4 CALL read2 numrst etan jpk 4 IF arg_present etan THEN etan read2fromopa numrst params 4 else C C Rigid lid formulation bsf C CALL read2 numrst bsfb jpk 4 IF arg_present bsfb THEN bsfb read2fromopa numrst params 4 CALL read2 numrst bsfn jpk 11 IF arg_present bsfn THEN bsfn read2fromopa numrst params 11 CALL read2 numrst bsfd jpk 16 IF arg_present bsfd THEN bsfd read2fromopa numrst params 16 endif ifdef key_zdftke CALL read3 numrst en 19 IF arg_present en THEN en read3fromopa numrst params 19 close numrst free_lun numrst return end CDIR LIST SUBROUTINE dtrlec CCC CCC CCC ROUTINE dtrlec CCC CCC CCC Purpose : CCC CCC Read files for restart CCC CC Method : CC CC Read the previous fields on the file numrst CC the first record indicates previous characteristics CC after control with the present run we read : CC prognostic variables on the second record CC elliptic solver arrays CC barotropic stream function arrays default option CC or free surface arrays key_freesurf_cstvol defined CC tke arrays key_zdftke defined CC for this last three records the previous characteristics CC could be different with those used in the present run CC CC Input : CC CC common CC comrst : restart parameter CC comctl : parameters for the control CC CC Output : CC CC common CC combef : previous fields before CC comnow : present fields now CC combsf : barotropic stream function CC comspg : surface pressure CC comsol : diagonal preconditioned conjugate CC CC Modifications : CC CC original : 91 03 CC additions : 92 01 M Imbard CC : 92 06 correction restart file M Imbard CC : 98 02 M Guyon FETI method CC addition : 98 05 G Roullet free surface CC CC parameters and commons CC CDIR NOLIST include parameter h include common h CDIR LIST CC CC local declarations CC INTEGER ji jj jk jl INTEGER ino0 it0 ipcg0 isor0 itke0 INTEGER ino1 it1 isor1 ipcg1 itke1 idast1 CC CC statement functions CC CDIR NOLIST include stafun h CDIR LIST CCC CCC OPA8 LODYC 1997 CCC C C C 0 Initialisations C C ino0 no it0 nit000 ipcg0 0 isor0 0 itke0 0 isor0 nsolv 1 ipcg0 2 nsolv ifdef key_zdftke itke0 1 endif C FETI method IF nsolv EQ 3 THEN isor0 2 ipcg0 2 ENDIF C IF lwp THEN WRITE numout WRITE numout dtrlec: beginning of restart WRITE numout WRITE numout the present run : WRITE numout job number : no WRITE numout with nit000 : nit000 WRITE numout with pcg option ipcg0 : ipcg0 WRITE numout with sor option isor0 : isor0 WRITE numout with FETI solver option ipcg0 isor0 : ipcg0 isor0 WRITE numout with tke option itke0 : itke0 ENDIF C C 1 Read numrst C C C First record C READ numrst REC 1 ino1 it1 isor1 ipcg1 itke1 idast1 C IF lwp THEN WRITE numout WRITE numout READ numrst with WRITE numout job number : ino1 WRITE numout with time step it : it1 WRITE numout with pcg option ipcg1 : ipcg1 WRITE numout with sor option isor1 : isor1 WRITE numout with tke option itke1 : itke1 WRITE numout with FETI solver option ipcg1 isor1 : ipcg1 isor1 WRITE numout ENDIF C C Control of date C IF it0 it1 NE 1 AND abs nrstdt EQ 1 THEN IF lwp THEN WRITE numout : problem with nit000 for the restart WRITE numout WRITE numout we stop verify the file WRITE numout or rerun with the value 0 for the WRITE numout control of time parameter nrstdt WRITE numout ENDIF STOP dtrlec ENDIF IF nrstdt EQ 1 ndate0 idast1 C C Read prognostic variables C CALL read3 numrst ub 2 CALL read3 numrst vb 3 CALL read3 numrst tb 5 CALL read3 numrst sb 6 CALL read3 numrst rotb 7 CALL read3 numrst hdivb 8 CALL read3 numrst un 9 CALL read3 numrst vn 10 CALL read3 numrst tn 12 CALL read3 numrst sn 13 CALL read3 numrst rotn 14 CALL read3 numrst hdivn 15 C C Read elliptic solver arrays C CALL read2 numrst gcx jpk 17 CALL read2 numrst gcxb jpk 18 C ifdef key_freesurf_cstvol C C free surface formulation eta C CALL read2 numrst etab jpk 4 CALL read2 numrst etan jpk 4 else C C Rigid lid formulation bsf C CALL read2 numrst bsfb jpk 4 CALL read2 numrst bsfn jpk 11 CALL read2 numrst bsfd jpk 16 endif C ifdef key_zdftke C C Read tke arrays C IF itke1 eq 1 THEN CALL read3 numrst en 19 ELSE IF lwp THEN WRITE numout : the previous restart file did nt used tke scheme WRITE numout ENDIF nrstdt 2 ENDIF endif C C RETURN END"); a[136] = new Array("./ReadWrite/scanctl.html", "scanctl.pro", "", " file_comments GLAMBOUNDARY 2 elements vector lon1 lon2 the longitude boundaries that should be used to visualize the data lon2 lon1 lon2 lon1 le 360 key_shift will be defined according to GLAMBOUNDARY param filename param filesname param jpt1file param varsname param varslev param swapbytes param bigendian param littleendian param f77sequential param fileheader param theader param xyheader keyword VARFMT keyword _EXTRA version Id: scanctl pro 327 2007 12 13 16:22:35Z pinsard PRO scanctl filename filesname jpt1file varsname varslev swapbytes bigendian littleendian f77sequential fileheader theader xyheader VARFMT varfmt _EXTRA ex compile_opt idl2 strictarrsubs common time1 systime 1 for key_performance DTYPE spawn grep i DTYPE filename notgood if keyword_set notgood then begin ras report This program is not adapted to data type station or grib Sorry stop endif UNDEF define valmask spawn grep i UNDEF filename valmask valmask strtrim valmask 2 valmask strsplit valmask 0 extract valmask float valmask 1 Headers spawn grep i FILEHEADER filename fileheader fileheader strtrim fileheader 2 if keyword_set fileheader then BEGIN fileheader strsplit fileheader 0 extract fileheader long fileheader 1 ENDIF ELSE fileheader 0L spawn grep i THEADER filename theader theader strtrim theader 2 if keyword_set theader then BEGIN theader strsplit theader 0 extract theader long theader 1 ENDIF ELSE theader 0L spawn grep i XYHEADER filename xyheader xyheader strtrim xyheader 2 if keyword_set xyheader then BEGIN xyheader strsplit xyheader 0 extract xyheader long xyheader 1 ENDIF ELSE xyheader 0L find the x axis spawn sed n e d e Xx Dd Ee Ff Yy Dd Ee Ff p filename xdef if xdef 0 EQ then BEGIN ras report Bad definition of xdef or ydef stop ENDIF xdef xdef 0:n_elements xdef 2 if n_elements xdef NE 1 then begin xdef byte xdef replicate byte 1 n_elements xdef xdef xdef where xdef NE 0 xdef string xdef endif xdef strtrim xdef 0 2 xdef strsplit xdef extract jpi long xdef 1 case strupcase xdef 2 of LINEAR :xaxis float xdef 3 findgen jpi float xdef 4 LEVELS :xaxis float xdef 3:n_elements xdef 1 ENDCASE find the y axis spawn sed n e d e Yy Dd Ee Ff Zz Dd Ee Ff p filename ydef if ydef 0 EQ then BEGIN ras report Bad definition of ydef or zdef stop ENDIF ydef ydef 0:n_elements ydef 2 if n_elements ydef NE 1 then begin ydef byte ydef replicate byte 1 n_elements ydef ydef ydef where ydef NE 0 ydef string ydef endif ydef strtrim ydef 0 2 ydef strsplit ydef extract jpj long ydef 1 case strupcase ydef 2 of LINEAR :yaxis float ydef 3 findgen jpj float ydef 4 LEVELS :yaxis float ydef 3:n_elements ydef 1 GAUST62 :BEGIN ras report Not yet coded stop END GAUSR15 :BEGIN ras report Not yet coded stop END GAUSR20 :BEGIN ras report Not yet coded stop END GAUSR30 :BEGIN ras report Not yet coded stop END GAUSR40 :BEGIN ras report Not yet coded stop END ELSE:BEGIN ras report Not yet coded stop END endcase find the z axis spawn sed n e d e Zz Dd Ee Ff Tt Dd Ee Ff p filename zdef if zdef 0 EQ then BEGIN ras report Bad definition of zdef or tdef stop ENDIF zdef zdef 0:n_elements zdef 2 if n_elements zdef NE 1 then begin zdef byte zdef replicate byte 1 n_elements zdef zdef zdef where zdef NE 0 zdef string zdef endif zdef strtrim zdef 0 2 zdef strsplit zdef extract jpk long zdef 1 case strupcase zdef 2 of LINEAR :zaxis float zdef 3 findgen jpk float zdef 4 LEVELS :zaxis float zdef 3:n_elements zdef 1 ENDCASE compute the grid computegrid xaxis xaxis yaxis yaxis zaxis zaxis _EXTRA ex domdef find the time axis spawn grep i TDEF filename timedef timedef strupcase strtrim timedef 2 timedef strsplit timedef 0 extract jpt long timedef 1 initial date: y0 m0 d0 h0 mn0 Julian day of IDL: julday m0 d0 y0 h0 mn0 00 t0 timedef 3 monthsname string format C CMOA 31 indgen 12 case 1 OF h h :mmZd d mmmyy yy strpos t0 : NE 1:BEGIN pp strpos t0 : h0 long strmid t0 0 pp mn0 long strmid t0 pp 1 2 pp strpos t0 Z dd byte strmid t0 pp 2 1 LT byte A d0 long strmid t0 pp 1 1 dd m0 where monthsname EQ strmid t0 pp 2 dd 3 0 1 y0 long strmid t0 pp 5 dd END m m Zd d mmmyy yy strpos t0 Z NE 1:BEGIN h0 0 12 pp strpos t0 Z mn0 long strmid t0 0 pp dd byte strmid t0 pp 2 1 LT byte A d0 long strmid t0 pp 1 1 dd m0 where monthsname EQ strmid t0 pp 2 dd 3 0 1 y0 long strmid t0 pp 5 dd END d d mmmyy yy byte strmid t0 0 1 LT byte A 0 :BEGIN h0 0 12 mn0 0 dd byte strmid t0 1 1 LT byte A d0 long strmid t0 0 1 dd m0 where monthsname EQ strmid t0 1 dd 3 0 1 y0 long strmid t0 4 dd END mmmyy yy ELSE:BEGIN h0 0 12 mn0 0 d0 1 m0 where monthsname EQ strmid t0 0 3 0 1 y0 long strmid t0 3 END ENDCASE if y0 is a two digit integer between 1950 and 2049 case 1 of y0 LE 49:y0 2000 y0 y0 LE 99:y0 1900 y0 ELSE: ENDCASE increment date and definition of the calendar with IDL Julian days tstep timedef 4 tsval long strmid tstep 0 strlen tstep 2 case strlowcase strmid tstep 1 reverse of mn :time julday m0 d0 y0 h0 mn0 lindgen jpt tsval 0 hr :time julday m0 d0 y0 h0 lindgen jpt tsval mn0 0 dy :time julday m0 d0 lindgen jpt tsval y0 h0 mn0 0 mo :time julday m0 lindgen jpt tsval d0 y0 h0 mn0 0 yr :time julday m0 d0 y0 lindgen jpt tsval h0 mn0 0 ENDCASE shit the calendar to correspond to the time step case strlowcase strmid tstep 1 reverse of dy :time long time mo :time long time 14L yr :time long time 365L 2 ELSE: endcase OPTIONS spawn grep i OPTIONS filename options options strtrim options 2 options strlowcase options 0 key_yreverse strpos options yrev NE 1 key_zreverse strpos options zrev EQ 1 multifiles strpos options template NE 1 f77sequential strpos options sequential NE 1 swapbytes strpos options byteswapped NE 1 bigendian strpos options big_endian NE 1 littleendian strpos options little_endian NE 1 cray strpos options cray_32bit_ieee NE 1 IF cray THEN BEGIN ras report cray_32bit_ieee Not yet coded stop ENDIF cal365 strpos options 365_day_calendar NE 1 IF cal365 THEN BEGIN ras report 365_day_calenda Not yet coded stop ENDIF building the filesname spawn grep i DSET filename files files strtrim files 0 2 files strsplit files extract if n_elements files NE 2 then begin ras report Bad definition of the filename There should be 2 elements: DEST and 1 filename that may define many files stop endif files files 1 files strmid files 0 strpos files 0 reverse_search 1 filesname files if keyword_set multifiles then begin minutes if stregex files i n2 0 NE 1 then begin filetsep mn mnend long mn0 jpt 1 tmp strarr hend h0 1 for i 0 n_elements tmp 1 do tmp i strjoin strsplit filesname i n2 extract regex string mn0 i format i2 2 filesname strjoin tmp endif hours if stregex files i hf 123 0 NE 1 then begin filetsep hr case strlowcase strmid tstep 1 reverse of mn :hend long h0 jpt mn0 1 1 60 hr :hend long h0 jpt 1 endcase tmp strarr hend h0 1 case 1 of stregex files i h1 NE 1:for i 0 n_elements tmp 1 do tmp i strjoin strsplit filesname i h1 extract regex strtrim h0 i 1 stregex files i h2 NE 1:for i 0 n_elements tmp 1 do tmp i strjoin strsplit filesname i h2 extract regex string h0 i format i2 2 stregex files f2 NE 1:for i 0 n_elements tmp 1 do tmp i strjoin strsplit filesname f2 extract regex string h0 i format i3 2 stregex files i hf 3 NE 1:for i 0 n_elements tmp 1 do tmp i strjoin strsplit filesname i hf 3 extract regex string h0 i format i3 3 endcase filesname strjoin tmp endif days if stregex files i d 12 0 NE 1 then begin filetsep dy case strlowcase strmid tstep 1 reverse of mn :dend long d0 jpt mn0 1 1 1440 hr :dend long d0 jpt h0 1 1 24 dy :dend long d0 jpt 1 endcase tmp strarr dend d0 1 case 1 of stregex files i d1 NE 1:for i 0 n_elements tmp 1 do tmp i strjoin strsplit filesname i d1 extract regex strtrim d0 i 1 stregex files i d2 NE 1:for i 0 n_elements tmp 1 do tmp i strjoin strsplit filesname i d2 extract regex string d0 i format i2 2 endcase filesname strjoin tmp endif months if stregex files i m 12c 0 NE 1 then begin filetsep mo tmp strarr 12 case 1 of stregex files i m1 NE 1:for i 1 12 do tmp i 1 strjoin strsplit filesname i m1 extract regex strtrim i 1 stregex files i m2 NE 1:for i 1 12 do tmp i 1 strjoin strsplit filesname i m2 extract regex string i format i2 2 stregex files i mc NE 1:for i 1 12 do tmp i 1 strjoin strsplit filesname i mc extract regex monthsname i 1 endcase filesname strjoin tmp endif years if stregex files i y 24 0 NE 1 then begin case strlowcase strmid tstep 1 reverse of dy :yend long y0 jpt d0 1 1 365 mo :yend long y0 jpt m0 1 1 12 yr :yend long y0 jpt 1 ELSE:yend y0 endcase tmp strarr yend y0 1 case 1 of stregex files i y2 NE 1:for i 0 n_elements tmp 1 do tmp i strjoin strsplit filesname i y2 extract regex string y0 i 100 y0 i 100 format i2 2 stregex files i y4 NE 1:for i 0 n_elements tmp 1 do tmp i strjoin strsplit filesname i y 4 extract regex string y0 i format i4 4 endcase filesname strjoin tmp endif filesname strsplit filesname extract time step unit of each file: case 1 of stregex files i n2 0 NE 1:filetsep mn stregex files i hf 123 0 NE 1:filetsep hr stregex files i d 12 0 NE 1:filetsep dy stregex files i m 12c 0 NE 1: filetsep mo stregex files i y 24 0 NE 1:filetsep yr ENDCASE number of time steps for each files case strlowcase strmid tstep 1 reverse of mn :BEGIN case filetsep of yr :jpt1file 60L 24L 365L mo :jpt1file 60L 24L 30L dy :jpt1file 60L 24L hr :jpt1file 60L mn :jpt1file 1L endcase END hr :BEGIN case filetsep of yr :jpt1file 24L 365L mo :jpt1file 24L 30L dy :jpt1file 24L hr :jpt1file 1L endcase END dy :BEGIN case filetsep of yr :jpt1file 365L mo :jpt1file 30L dy :jpt1file 1L endcase END mo :BEGIN case filetsep of yr :jpt1file 12L mo :jpt1file 1L endcase END yr :jpt1file 1L endcase number of files nof ceil jpt 1 jpt1file filesname filesname 0:nof 1 ENDIF ELSE BEGIN nof 1 jpt1file jpt ENDELSE first character if stregex files GE 0 THEN BEGIN iodir strmid filename 0 strpos filename reverse_search 1 for i 0 nof 1 do filesname i iodir strmid filesname i 1 ENDIF extracting the variables spawn grep i VARS filename nvars nvars strtrim nvars 2 nvars strsplit nvars 0 extract nvars long nvars 1 spawn sed n e d e Vv Aa Rr Ss Ee Nn Dd Vv Aa Rr Ss p filename varlist if n_elements varlist LE 2 then begin ras report No lines between vars and endvars stop endif varlist varlist 1:n_elements varlist 2 if n_elements varlist NE nvars then begin ras report Number of variables indicated by VARS strtrim nvars 1 differs from number of lines without at the beginning located between VARS and ENDVARS: strtrim n_elements varlist 1 stop ENDIF varsname strarr nvars varsdes strarr nvars varslev lonarr nvars for i 0 nvars 1 do BEGIN varlist i strtrim varlist i 2 tmp strsplit varlist i extract if strmid tmp 2 0 2 EQ 1 then BEGIN case long strmid tmp 2 3 2 of 10:BEGIN ras report Special data formats units 1 10 Not yet coded stop END 20:BEGIN ras report Special data formats units 1 20 Not yet coded stop END 30:BEGIN ras report Special data formats units 1 30 Not yet coded stop END 40:BEGIN case long strmid tmp 2 6 of 1:varfmt byte 2:varfmt uint 2:varfmt int 4:varfmt long ELSE:BEGIN ras report Bad definition of the special data formats: ras report long strmid tmp 2 6 should be equal to 1 2 2 or 4 stop END endcase END ELSE:BEGIN ras report Special data formats units 1 Not yet coded stop END endcase endif varsname i tmp 0 varsdes i strjoin tmp 3:n_elements tmp 1 varslev i long tmp 1 ENDFOR varslev 1 varslev ccmeshparameters filename filename ccmeshparameters filename Grads IF keyword_set key_performance EQ 1 THEN print time scanctl systime 1 time1 return end"); a[137] = new Array("./ReadWrite/scanoasis.html", "scanoasis.pro", "", " file_comments scan an Oasis file version scanoasis grids_orca_t106 history Sebastien Masson smasson lodyc jussieu fr July 01 2002 version Id: scanoasis pro 371 2008 08 07 09:32:02Z pinsard PRO scanoasis filename compile_opt idl2 strictarrsubs openr unit filename F77_UNFORMATTED GET_LUN SWAP_IF_LITTLE_ENDIAN error err if err ne 0 then begin ras report err_string return endif char8 12345678 WHILE NOT EOF unit DO BEGIN readu unit char8 ras report char8 readu unit ENDWHILE free_lun unit return end"); a[138] = new Array("./ReadWrite/write_ncdf.html", "write_ncdf.pro", "", " version Id: write_ncdf pro 378 2008 08 12 12:35:46Z pinsard secondary subroutines used in the main subroutine named : write_ncdf pro SUBROUTINE 1 3 : subroutine utilise ds le cas ou NOT_OUASSALU n est pas active default et alors cela sert a uniformiser les dimensions qui sont en dernieres dim de vars en unlimited si une dim de meme taille est definie en unlimited et si eventuellement elles peuvent aussi etre definies comme telles i e on privilegie le type unlimited pour les dimensions en fin de var lorsque c est possible et qu au moins un dim de meme type est demandee en unlimited cf details plus bas pro writenc_unlimdim_update dnames_imposed unl_imposed fmtbase nviv iidp1st nn dst iid SUPERTABU supertab DIMSIZESU dimsizes UNLIMTABAU unlimtaba UNLIMAU unlima DIMIDASU dimidas NDIMTOTU ndimtot DNAMOSSU dnamoss DNAMAU dnama IMPOSE_DNM_UNLU impose_dnm_unl compile_opt idl2 strictarrsubs idl2 les entiers sont des long par defaut ET obligatoire pour les tablo strictarrsubs pas de depassement de tablo 1 mise en forme en structures classiques du main prog if n_elements supertab ne ndimtot then message PB : procedure write_ncdf_unlimdim_update init dim iodp1st var nviv stop for ikd 0 ndimtot 1 do begin ikdp1st string ikd 1 format fmtbase com strd ikdp1st writenc_strlc2str supertab ikd if not execute com then message PB : writenc_unlimdim_update loop1 on dim tot ikdp1st dim iidp1st var nviv stop endfor 2 traitement des structures de dim existantes et comparaison a la dim courante qui est last of var on est en train de gerer une last dim d une var avec option oneunlim_all_samesizeandlast_unlim 1 i e : si une dim est definie en unlim 1 ALORS toutes les dim de meme taille ET last dim definie avant ou apres deviennent identiques a cette dim ne font plus qu une selon compatibilite nom de dim ET unlimited impose ou pas DONC soit cette dim est unlim 0 soit on a deja une dim meme taille unlimited 1 alors: Si nom unlim_impose compatibles on passe notre dim courante a unlim 1 et elle sera assimile a celle qui existe deja avec le meme nom precedent car meme caracteristiques Si nom unlim incompatibles on va juste creer une nouvelle dim last not unlimited soit on a pas deja de dim meme taille et unlim 1 donc cas classique cette dim unlim 0 est creee ou assimilee a une existante si nom et taille compatibles soit cette dim est unlim 1 soit une dim unlim 1 existe deja alors elle sera assimilee a celle ci si noms compatibles soit une dim unlim 1 existe pas deja alors cas plus complexe : pour eventuellement les mettre a jour on doit parcourir les dimensions de meme taille pour separer les variables dont la dim en question est la last et les variables dont la dim est not la last soit on n a pas de variables qui ont une dim de meme taille en last dim alors pas de mise a jour a faire on va creer une nouvelle dim qui sera la dim unlim 1 du fichier soit on a des variable s avec une dim last de meme taille unlim 0 ET nomdim compatible DONC on doit mettre a jour les last dim s de ces variables 3 cas: une dim unlim 0 contient que des vars qui en dependent en last dim et meme taille que dim courante alors selon compatibilite pour changer unlim et nomdim on regroupe les vars qui ont last dim same size sous cette meme dim qui devient unlim 1 et a laquelle la dim courante sera assimilee aucune dim contient que des vars en last dim et meme taille que dim courante alors on cree des ICI une NOUVELLE dim qui est identique a la dim courante pour que celle ci y assimilee pas creer 2 fois meme dim ET qui contient les vars avec last dim qui sont compatibles en unlim dim et nomdim n plus de une dim unlim 0 contient que des vars en last dim et meme taille que dim courante il faudrait supprimer n 1 dim pour les assimiler a l une d entre elles en fait cela veut dire que pas assez de contraintes ont ete donne en entree aux dim donc WARNING pour dire qu en ajoutant des contraintes pour forcer dim unlim 0 ou 1 ou bien forcer le nom de la dim alors on levera l ambiguite if unlima eq 0 then begin si on a une last dim not unlim on check si des dim meme taille unlim1 qui existent pour les utiliser as same dim si on trouve une dim meme taille et unlim 1 et nom ok alors on met la dim nbdimvv inv en unlim aussi aaddo where dimsizes nn eq 0 and unlimtaba eq 1 if n_elements aaddo ne 1 then message PB : on a 1 ou 0 dim en unlimited a pas plus stop if aaddo 0 ne 1 then begin on a une dims unlim 1 deja definie et de meme taille strnbd string aaddo 0 1 format fmtbase com strdtmp strd strnbd if not execute com then message ERR : attrib strdtmp 1 dim iodp1st var nviv stop samnamokchgunlim 0 peu importe cette valeur car si elle change pas c parce que dnames_imposed 0 donc condition apres deja ok if dnames_imposed eq 1 then if strdtmp nomdim eq dnama then samnamokchgunlim 1 else samnamokchgunlim 0 if unl_imposed eq 0 and dnames_imposed eq 0 or samnamokchgunlim then unlima 1 ok pn peut changer unlim de la nouvelle dim qui pourra bien etre assimilee par la suite a une dim deja existante endif endif else begin unlima 1 cette last dim de la var est unlim 1 et donc unl_imposed 1 aussi aaddo where dimsizes nn eq 0 and unlimtaba eq 1 if n_elements aaddo ne 1 then message PB : on a 1 ou 0 dim en unlimited b pas plus stop if aaddo 0 eq 1 then begin si une dim same kind pas deja definie update des dims precedentes ou create sinon on aura assimil on a pas de dim meme taille avec unlim 1 donc on cherche si on a des last dims de meme taille pour les mettre a jour question var et les rendre unlim 1 si possible ou creer un new dim unlim sinon aabb where dimsizes nn eq 0 et comme aucun n a same size et unlim 1 cf au dessus on tombe sur des dim unlim 0 if aabb 0 ne 1 then begin nbsdd n_elements aabb for iod 0 nbsdd 1 do begin on parcourt les dim de meme taille pr separer last dim ET not last dim iodp1st string iod 1 format fmtbase strnbd string aabb iod 1 format fmtbase com strdtmp strd strnbd if not execute com then message ERR : attrib strdtmp 0a dim iodp1st var nviv stop que si on peut modifier leur dim name IF dnames_imposed EQ 1 THEN if impose_dnm_unl 0 aabb iod eq 1 and strdtmp nomdim ne dnama then CONTINUE strvarsdim strdtmp vardep_ndim vnmarr strvarsdim 0 ddparr strvarsdim 1 nvararr strvarsdim 2 lastad strvarsdim 3 for iij 0 n_elements nvararr 1 do begin loop on var which depend on dim if lastad iij eq 1 then begin les var ou la dim est une last dim if n_elements lasdd eq 0 then lasdd u:aabb iod 1 v: vnmarr iij w: ddparr iij x: nvararr iij y: lastad iij else lasdd lasdd u:aabb iod 1 v: vnmarr iij w: ddparr iij x: nvararr iij y: lastad iij endif else begin vars ou la dim est pas un last dim if n_elements notlasdd eq 0 then notlasdd u:aabb iod 1 v: vnmarr iij w: ddparr iij x: nvararr iij y: lastad iij else notlasdd notlasdd u:aabb iod 1 v: vnmarr iij w: ddparr iij x: nvararr iij y: lastad iij endelse endfor endfor if n_elements lasdd ne 0 then begin alors on a des vars qui ont la meme dim en taille ET last dim update creation faisable listdwlast lasdd 0 nnndz 0 dimwzonlylast 1 zorglub temporary dimwzonlylast dimdone 1 FOR iad 0 n_elements listdwlast 1 DO BEGIN on parcourt les dims de listdwlast mais que une fois par dim size IF where dimdone eq listdwlast iad 0 EQ 1 THEN BEGIN si cette dim est pas encore faite on la fait strnbdo string listdwlast iad format fmtbase com strdtmp strd strnbdo if not execute com then message ERR : attrib strdtmp 0b dim strnbdo var nviv stop print hello strdtmp vardep_ndim 3 if where strdtmp vardep_ndim 3 eq 0 0 eq 1 and impose_dnm_unl 1 listdwlast iad 1 eq 0 then begin pour cette dim: que des var avec last ET son unlim est pas imposed: ok on peut utiliser cette dim pour update dimwzonlylast listdwlast iad nnndz nnndz 1 endif IF iad EQ 0 THEN dimdone listdwlast iad ELSE dimdone dimdone listdwlast iad endif ENDFOR updatevara 0 if inv eq 2 and iid eq 0 then stop if iidp1st eq 01 and nviv eq 03 then stop case nnndz of 1:begin 1 dim contient que des var avec last dim on s en sert pour update ok on ajoute ces vars si plus de 1 existe qui ont dim unlim a la struct de dim choisie strnbdu string dimwzonlylast format fmtbase com strdtmp1 strd strnbdu if not execute com then message ERR : attrib strdtmp 0c dim iidp1st var nviv stop uubb where lasdd 0 ne dimwzonlylast autre dim avec var last 1 si oui update: if uubb 0 ne 1 then begin updatevara 1 bbvdnd a: strdtmp1 vardep_ndim 0 lasdd uubb 1 b: strdtmp1 vardep_ndim 1 lasdd uubb 2 c: strdtmp1 vardep_ndim 2 lasdd uubb 3 d: strdtmp1 vardep_ndim 3 lasdd uubb 4 endif else bbvdnd strdtmp1 vardep_ndim ici pas d update var a faire updatevara 0 unlimtaba dimwzonlylast 1 1 update de unlim si dnames_imposed 1 on a selectionne des dims de meme nom ou nom non impose donc nomdim dnama iid si dnames_imposed 0 le nom de notre dim courante peut changer pour assimile a ancien nomdim dnamoss dimwzonlylast 1 ok gere par dnames_imposed continue plus haut if n_elements dnama ne 0 then dnamoss dimwzonlylast 1 dnama iid strdtmp2 dimid:strdtmp1 dimid taille:strdtmp1 taille nomdim:dnamoss dimwzonlylast 1 unlimz:unlimtaba dimwzonlylast 1 vardep_ndim:bbvdnd on passe en unlim 1 ICI com strd strnbdu strdtmp2 if not execute com then message ERR : update strd unlim dim strnbdu loop: dim iidp1st var nviv stop 0 strdtmp1 0 strdtmp2 0 end 0:begin aucune dim ne contient que des vars en last dim on doit cree une new dim la dim iidp1st nbdimvv sera donc pas creee mais assimilee a celle ci on ne cree bien qu une seule dim au max par passage sur indice iid pour creer nouvelle dim a laquelle la courante sera assimilee il faut que les variables ramenees dedans proviennent de dim qui le permettent vis a vis de nom de dim imposee et ou unlim impose noka 0 for iud 0 n_elements lasdd 1 do begin if impose_dnm_unl 1 lasdd iud 0 1 eq 0 then begin car unlim passe de 0 a 1 pour ces dim de vars ndst string ndimtot format fmtbase if n_elements dnama ne 0 then dnamur dnama iid else dnamur dst ndst if impose_dnm_unl 0 lasdd iud 0 1 eq 0 or dnamur eq dnamoss lasdd iud 0 1 then begin if noka eq 0 then begin lasddoka lasdd iud listdwlastoka lasdd iud 0 endif else begin lasddoka lasddoka lasdd iud listdwlastoka listdwlastoka lasdd iud 0 endelse noka noka 1 endif else begin if n_elements notlasddoka eq 0 then begin if n_elements notlasdd eq 0 then notlasddoka lasdd iud else notlasddoka notlasdd lasdd iud endif else notlasddoka notlasddoka lasdd iud endelse endif endfor if noka ne 0 then begin updatevara 1 ndimtot ndimtot 1 ndst string ndimtot format fmtbase dimsizes dimsizes nn dimidas dimidas dst ndst lasto 1 unlimtaba unlimtaba unlima rappel : unlima 1 if n_elements dnama ne 0 then dnamoss dnamoss dnama iid else dnamoss dnamoss dimidas ndimtot 1 impose_dnm_unl impose_dnm_unl dnames_imposed unl_imposed tablo: ix 2 jy ndimtot ddvdnd a: lasddoka 1 b: lasddoka 2 c: lasddoka 3 d: lasddoka 4 com strd ndst dimid:dimidas ndimtot 1 taille:nn nomdim:dnamoss ndimtot 1 unlimz:unlimtaba ndimtot 1 vardep_ndim:ddvdnd if not execute com then message ERR : a la def 3 de la structure de dim iidp1st var nviv stop endif else aucune last var de dim est ok pour aller ds la nouvelle dim creable elle se creera toute seule apres end else:begin print WARNING on trouve 2 dims ou plus que l on peut mettre en unlimited assimilees a la dim unlimited demandee pour ne pas choisir ou supprimer une dim on ne change aucune dim en unlimited Pour lever l ambiguite si besoin utiliser les champs unlim et dnames pour imposer des noms et carateristiques de dimensions et donner plus de contraintes pour la construction du netcdf ou bien activer le mot cle NOT_OUASSALU pour ne pas uniformiser les last dim des vars a unlimited dim message PB Z : on ne peut avoir que 0 ou max 1 dim avec que des var lasto dim iidp1st var nviv stop end endcase on doit egalement enlever ces vars des struct de dim ou on les a prises if updatevara eq 1 then begin if nnndz eq 0 then begin listdwlast listdwlastoka notlasdd notlasddoka endif dimdone 1 FOR iad 0 n_elements listdwlast 1 DO BEGIN on parcourt les dims de listdwlast mais que une fois par dim size IF where dimdone eq listdwlast iad 0 EQ 1 THEN BEGIN si cette dim est pas encore faite on la fait if nnndz eq 1 then if listdwlast iad eq dimwzonlylast then continue on saute dimwz si exist strnbdv string listdwlast iad format fmtbase com strdtmp1 strd strnbdv if not execute com then message ERR : attrib strdtmp 0d dim loc strnbdv dim iidp1st var nviv stop if n_elements notlasdd ne 0 then begin oobb where notlasdd 0 eq listdwlast iad dim de notlast concernee if oobb 0 eq 1 then message PB : 0 ou 1 max dim wz only last var dim loc istrnbdv dim iidp1st var nviv stop a PB Z expected ccvdnd a: notlasdd oobb 1 b: notlasdd oobb 2 c: notlasdd oobb 3 d: notlasdd oobb 4 strdtmp2 dimid:strdtmp1 dimid taille:strdtmp1 taille nomdim:strdtmp1 nomdim unlimz:strdtmp1 unlimz vardep_ndim:ccvdnd com strd strnbdv strdtmp2 if not execute com then message ERR : update strd unlim dim loc strnbdv loop: dim iidp1st var nviv stop 1 strdtmp1 0 strdtmp2 0 ENDIF IF iad EQ 0 THEN dimdone listdwlast iad ELSE dimdone dimdone listdwlast iad ENDIF endfor endif else pas besoin de faire update sur les var car on a juste mis unlim a 1 ds dimwzonlylas endif else on n a pas de dim meme taille dont une var depend en last dim on va creer new dim endif else pas de dim deja definie et de meme taille donc on va creer une new dim endif else begin else on a deja une dim de meme taille et unlim 1 donc elle DOIVENT etre les memes car une seule dim unlim 1 strnbd string aaddo 0 1 format fmtbase com strdtmp strd strnbd if not execute com then message ERR : attrib strdtmp 0d dim iodp1st var nviv stop if dnames_imposed eq 1 then if not strdtmp nomdim eq dnama n_elements dnama 1 then message PB : on specifie 2 dimensions unlimited avec 2 noms differents impossible stop endelse endelse print d inv unlima 3 re mise en forme en supertab pour passer au prog principal for ikd 0 ndimtot 1 do begin loop on dims pour mettre les champs vardep_ndim des struc dim en liste chainee ikdp1st string ikd 1 format fmtbase com strdlc writenc_str2strlc strd ikdp1st if not execute com then message PB : writenc_unlimdim_update loop2 on dim tot ikdp1st dim iidp1st var nviv stop if ikd eq 0 then supertab strdlc else supertab supertab strdlc endfor on obtient ici supertab strd01lc strd02lc end SUBROUTINE 2 3 : on remplace la 4ieme structure de structa par une liste chainee afin d uniformaiser les format de strd cf prog write_ncdf pour les passer facilement en argument au sous prog writenc_unlimdim_update sous forme de tablo de structures de meme type utilise si writenc_unlimdim_update est utilise i e dans le cas ou la cle NOT_OUASSALU est pas active i e cas par defaut function writenc_str2strlc structa strdtmp structa strvarsdim strdtmp vardep_ndim vnmarr strvarsdim 0 ddparr strvarsdim 1 nvararr strvarsdim 2 lastad strvarsdim 3 nvardepa n_elements lastad if nvardepa lt 1 then message PB : aucune var ne depend de cette dim impossible stop Create an anonymous strucutre to contain list elements Note that the next field is initialized to be a null pointer llistvofd01 vname: numdimdep:0 nvar:0 dlast:0 next:ptr_new if ptr_valid fst_llistvofd01 then ptr_free fst_llistvofd01 first_varsd01 ptr_new llistvofd01 current first_varsd01 for iidv 0 nvardepa 1 do begin next ptr_new vname: numdimdep:0 nvar:0 dlast:0 next:ptr_new set the name field of current to the input string current vname vnmarr iidv current numdimdep ddparr iidv current nvar nvararr iidv current dlast lastad iidv prepare the next field of current to the pointer to the next list element current next next copy the current pointer to last last current make current the next pointer current next endfor if ptr_valid next then ptr_free next Set the _next_ field of the last element to the null pointer if ptr_valid last then last next ptr_new strdout_ptr dimid:strdtmp dimid taille: strdtmp taille nomdim: strdtmp nomdim unlimz: strdtmp unlimz vardep_ptr : first_varsd01 return strdout_ptr end SUBROUTINE 3 3 : convertit une structure contenant une liste chainee en structure classique utilisee par le main prog utile pour passer ces structures en argument au sous prog writenc_unlimdim_update i e dans le cas ou la cle NOT_OUASSALU n est pas activee i e cas par defaut function writenc_strlc2str strwlist ptr_firstvars strwlist vardep_ptr create a second pointer to the heap variable pointed at by first current ptr_firstvars invdp 0 while ptr_valid current do begin if invdp eq 0 then begin vnmarr current 0 ddparr current 1 nvararr current 2 lastad current 3 endif else begin vnmarr vnmarr current 0 ddparr ddparr current 1 nvararr nvararr current 2 lastad lastad current 3 endelse set current equal to the pointer in its own next field current current next invdp invdp 1 endwhile if invdp eq 0 then message PB : aucune var ne depend de cette dim impossible 2 stop strwolist dimid:strwlist dimid taille: strwlist taille nomdim: strwlist nomdim unlimz: strwlist unlimz vardep_ndim: a:vnmarr b:ddparr c:nvararr d:lastad return strwolist end END SECONDARY SUBROUTINES MAIN SUBROUTINE pro write_ncdf var01 var02 var03 var04 var05 var06 var07 var08 var09 var10 var11 var12 var13 var14 var15 var16 var17 var18 var19 var20 var21 var22 var23 var24 var25 var26 var27 var28 var29 var30 FILENAME filename GLOBATTR globattr VARNAME namevquick file_comments Construct a netcdf file containing up to 30 variables of any dimension limited to 99 for now with any attributes specified We use structures to pass the fields var and their attributes and global attr returns a netcdf file containing the variable in the format specified through keywords and variables param var01 in required It can be simply a variable scalar or array of type : byte int long float double or string or a structure containing the variable and its properties and attributes At least one variable must be specified If a structure is given it should be of the following form exple : vv1 var:xaxis name: nav_lon dname: x at0: a: units b: degrees_east at1: a: title b: longitude vv4 var:rain name: rain unlim:1 dname: x y t at0: a: units b: mm day at4: a: missing_value b: 9999 Namely the if vv1 is a structure it MUST follow the following points: attributes fields for the variable at0 at1 MUST be the last fields of the vv1 structure and name of those fields at0 at1 are not important attributes MUST themselves be given in the form of a 2 field structure containing the name of the attribute a string and its value can be any type as the ones of variable order of the first fields is not important but they MUST have the names: var : for the variable scalar or array of type:byte int long float double or string name : for its name a string default value is var01 var02 etc unlim : 1 to specify that the last dim of the var must be UNLIMITED 0 or not specified otherwise dname : to give the names of the dimensions of the variable in the same order as the var dimensions it is an array of string of dim nbre de dim de la var default is d01 d02 etc the field var MUST be there a variable but every others are optional if a missing value exists for the variable and one wants to specify it it MUST be specified somewhere in one of the attributes and the name of this attribute MUST be missing_value to be taken into account in the computing of the min max of the variable missing_value being not case sensitive MISSING_VALUE is also ok param var02 var03 var30 in optional All the variables attributes to be written in the netcdf file in the same way as the var01 cf info above keyword filename in optional a string giving the filename including the path of the file if not specified it is set to iodir writenclem nc keyword globattr in optional a structure containing the global attributes for the file Similarly as for the attributes of the variable this structure contains 2 fields structures which are the global attribute first their name and second their value exple: glbatt gb1: a: Grid b: regular 0 25 gb2: a: Production b: clem systime if not specified in globattr default case set production date of day as a global attribute keyword VARNAME in optional an array of char same number of elements as the number of given var if specified it gives the names of the variables as an array for the default name values if one of the var is structure and also has the name field given then the latter will be the one chosen and not namevquick uses cm_general for iodir variable examples 1 IDL write_ncdf vvsst btoa 2 IDL write_ncdf a1 var:a2 name: rain up down fix a4 a5 var:a6 unlim:1 name: sst dname: x y z time 3 IDL write_ncdf v031tr msf031dn msf031up v031 vmaskloc btoa runame titplo1 vargrid nytt varname v031tr msf031dn msf031up v031 vmaskloc btoa runame titplo1 vargrid nytt filename iodir IDL_DATA waza3 nc 4 IDL fileoutnc iodir OBS TRMM trmm_1d_ iyystr 0101_ iyystr 1231_reg0 25 nc IDL vv1 var:xaxis name: nav_lon dname: x at1: a: units b: degrees_east at2: a: title b: longitude IDL vv2 var:yaxis name: nav_lat dname: y at1: a: units b: degrees_north at2: a: title b: latitude IDL vv3 var:ttt name: time dname: time_counter unlim:1 at1: a: units b:timeunit at2: a: title b: julian days IDL vv4 var:rain_i2 name: rain at1: a: units b: mm day at2: a: title b: trmm daily accumulated rainfall derived from the 3 hourly product mm at3: a: scale_factor b:scala_factor at4: a: add_offset b:adda_offset at5: a: missing_value b:missaval_i2 IDL glbatt gb1: a: File_Name b: trmm_1d_ iyystr 0101_ iyystr 1231_reg0 25 nc gb2: a: Model_Name b: TRMM 3B42_V6 derived product gb3: a: Source_File b: ftp: disc2 nascom nasa gov data TRMM Gridded Derived_Products 3B42_V6 Daily iyystr bin gb4: a: IDL_Program_Name b: zz08_read_plot_row_trmm_precip pro clement jamstec go jp gb5: a: Grid b: regular 0 25 degres resolution IDL write_ncdf vv1 vv2 vv3 vv4 filename fileoutnc globattr glbatt history CBM 2007 09 10 todo clem pro write_ncdf var01 var02 var03 var04 var05 var06 var07 var08 var09 var10 RQ : if more than 30 variables is needed simply add var11 var12 var13 var14 var15 var16 var17 var18 var19 var20 var31 var32 etc here and change nmaxvv to 32 var21 var22 var23 var24 var25 var26 var27 var28 var29 var30 FILENAME filename GLOBATTR globattr VARNAME namevquick NOT_SDISV flag1 mots cles non utiles sauf cas particuliers NOT_OUASSALU flag2 OKNAN oknan subroutine a tester avec le prog zz10_test_write_ncdf pro par exemple ou bien zz08_read_plot_row_trmm_precip_b compile_opt idl2 strictarrsubs idl2 les entiers sont des long par defaut ET obligatoire pour les tablo strictarrsubs pas de depassement de tablo cm_general pour iodir si filename n est pas defini writeout 1 1 pour ecrire info de base a l ecriture des vars 0 sinon not_samedimname_in_same_var : 1 : si on rencontre 2 dim de meme taille et meme unlim type ds une var on cree 2 dim differentes pour ne pas avoir 2 ou plus meme noms de dim dans une meme var default 0 : on ne cree pas de dim nouvelle si on a la la meme taille et meme unlim dim definie deja pour cette var exple: fltarr n1 n1 ne creera qu une dim de nom x1 de taille n1 if keyword_set flag1 then not_samedimname_in_same_var 0 else not_samedimname_in_same_var 1 ci dessous 0 pour definir une nouvelle dim par sa taille ET sa nature unlim uniquement 1 pour definir une nouvelle dim de la meme maniere ET que si une dim est definie en unlim ALORS toutes les dim de meme taille ET last dim definie avant ou apres deviennent identiques a cette dim ne font plus qu une plutot que de definir une dim de taille n0 ET not unlim en last dim de var01 ET une dim de taille n0 ET unlim 1 en last dim de var02 on defini la meme dim de taille n0 ET unlim pour les 2 vars var01 et var02 default if keyword_set flag2 then oneunlim_all_samesizeandlast_unlim 0 else oneunlim_all_samesizeandlast_unlim 1 if writeout then print write_ncdf structfd_v var structfd_n name structfd_unl unlim structfd_dn dname ncfile_default write_ncdf nc nmaxvv 30 nbdimmax 99 fmtbase i2 2 lie au max de var et dim definissable si moins de 99 i2 2 ok sinon passer a i3 3 etc nbvars n_params if nbvars lt 1 then message ERR : donner au moins une var stp stop if nbvars gt nmaxvv then message ERR : la fonction write_ncdf est pour le moment definie pour string nmaxvv format fmtbase variables Pour l utiliser avec plus simplement ajouter var31 var32 etc ds l entete de la subroutine stop if n_elements namevquick ne 0 and n_elements namevquick ne nbvars then message PB : varname nom des vars par defaut doit avoir le meme nombre d elements que le nbre de vars stop creation du fichier netcdf if not keyword_set filename then ncfile iodir ncfile_default else ncfile filename nposdir strpos ncfile reverse_search controlle de l existence du path menant au fichier dirr strmid ncfile 0 nposdir 1 if file_test dirr directory eq 0 then message ERR : le directory donne pour le fichier nc n existe pas dir dirr idout ncdf_create ncfile clobber create a netcdf file automatically placed into define mode clobber erase previous file ncdf_control idout nofill data in the netcdf file is not pre filled with default fill values define mode 1ere boucle sur les vars pour trouver les dimensions a definir et leurs caracteristiques oktypcodarr 1 2 3 4 5 7 correspond au type de var accepte par ncdf_vardef de idl : byte int long float double string varst var dst d dimiss dim_gene dimiss arr_struct intarr nbvars 1 iattrv0 intarr nbvars indice du premier attribut ds la structure typcodvv intarr nbvars 1 nama strarr nbvars nbdimvv intarr nbvars nbtags intarr nbvars listofdimnams strarr nbvars fieldfd intarr nbvars firstdimcreated 0 ndimtot 0 for inv 0 nbvars 1 do begin dnames_imposed 0 unl_imposed 0 init de var qui doivent etre non def si non attribuee cf plus bas dnama 12 zorglub temporary dnama lasdd 12 zorglub temporary lasdd notlasdd 12 zorglub temporary notlasdd invp1 inv 1 nviv string invp1 format fmtbase commande vvtmpstr var nviv if not execute commande then message PB : attribution a vvtmp de la var numero nviv stop attribution des elements de la structure ou du tablo au vars de base pour ecrire definir la var attr ds le ncdf sstr size vvtmpstr nbdim sstr 0 typcod sstr nbdim 1 if where oktypcodarr typcod eq 0 0 ne 1 then arr_struct inv 0 var scal or array of int real char etc if typcod eq 8 then arr_struct inv 1 var structure if arr_struct inv eq 1 then message PB : la var numero nviv est ni un array int float string etc ni une structure stop case arr_struct inv of 0:begin var scal or array of int real char etc vvtmp vvtmpstr ssvv size vvtmp nbdimvv inv ssvv 0 typcodvv inv ssvv nbdimvv inv 1 if typcodvv inv eq 7 then begin les chaines de char ont un format particulier en tant que tablo pour ecriture netcdf if nbdimvv inv eq 0 then ssvvdims max strlen vvtmp 1 else ssvvdims max strlen vvtmp 1 ssvv 1:nbdimvv inv nbdimvv inv nbdimvv inv 1 endif else begin if nbdimvv inv eq 0 then ssvvdims 12 else ssvvdims ssvv 1:nbdimvv inv endelse if n_elements namevquick eq 0 then nama inv varst nviv else nama inv namevquick inv unlima 0 dnama zorglub non defini car init avec temporary default value fixed when dim are created cf hereunder end 1:begin var structure nbtags inv n_tags vvtmpstr tagnamas tag_names vvtmpstr controle de la forme de la structure et def des elements 1 champ necessaire la variable fieldfound 0 for itg 0 nbtags inv 1 do begin if strlowcase tagnamas itg eq structfd_v then begin com vvtmp vvtmpstr structfd_v if not execute com then message ERR : attribution de vvtmp 1ere boucle sur les vars var num nviv stop ssvv size vvtmp nbdimvv inv ssvv 0 typcodvv inv ssvv nbdimvv inv 1 if typcodvv inv eq 7 then begin les chaines de char ont un format particulier en tant que tablo pour ecriture netcdf if nbdimvv inv eq 0 then ssvvdims max strlen vvtmp 1 else ssvvdims max strlen vvtmp 1 ssvv 1:nbdimvv inv nbdimvv inv nbdimvv inv 1 endif else begin if nbdimvv inv eq 0 then ssvvdims 12 else ssvvdims ssvv 1:nbdimvv inv endelse iattrv0 inv iattrv0 inv 1 fieldfound 1 endif if fieldfound eq 1 then break endfor if fieldfound eq 0 then message ERR : le champ var est pas ds la structure var num nviv stop 2 champ optionnel le nom de la var fieldfound 0 for itg 0 nbtags inv 1 do begin if strlowcase tagnamas itg eq structfd_n then begin iattrv0 inv iattrv0 inv 1 com nama inv strcompress vvtmpstr structfd_n if not execute com then message ERR : attribution de name of var num nviv 1ere boucle sur les vars stop if strlen nama inv eq 0 then message PB : nom de variable numero nviv vide a respecifier fieldfound 1 endif if fieldfound eq 1 then break endfor if fieldfound eq 0 then if n_elements namevquick eq 0 then nama inv varst nviv else nama inv namevquick inv fieldfd inv fieldfound 3 champ optionnel si last dimension est unlimited fieldfound 0 for itg 0 nbtags inv 1 do begin if strlowcase tagnamas itg eq structfd_unl then begin iattrv0 inv iattrv0 inv 1 com unlima vvtmpstr structfd_unl if not execute com then message ERR : attribution de unlim of var num nviv 1ere boucle sur les vars stop if unlima ne 0 and unlima ne 1 then message PB : unlim vaut pas 0 ou 1 pour la var num nviv stop fieldfound 1 unl_imposed 1 endif if fieldfound eq 1 then break endfor if fieldfound eq 0 then unlima 0 unlimited 0 par defaut 4 champ optionnel nom des dimensions fieldfound 0 for itg 0 nbtags inv 1 do begin if strlowcase tagnamas itg eq structfd_dn then begin iattrv0 inv iattrv0 inv 1 com dnama strcompress vvtmpstr structfd_dn if not execute com then message ERR : attribution des dim name of var num nviv 1ere boucle sur les vars stop if n_elements dnama ne nbdimvv inv then message PB : si on donne des noms de dim pour une var donner autant de noms que de dims pour la var stop aahh strlen dnama if where aahh eq 0 0 eq 1 or n_elements where aahh eq 0 ne n_elements dnama then begin si on a pas que des chaines vides ok if where aahh eq 0 0 ne 1 then message PB : un des noms mais pas tous des dim en input est vide a respecifier stop if typcodvv inv eq 7 then dnama d_strlen dnama on ajoute une dim donc un nom de dim aussi fieldfound 1 dnames_imposed 1 si on donne des noms de dim alors elles seront creees a coup sur pas assimilees a d autres de meme taille ou autre endif else begin au cas ou on donne un tablo avec que des noms vide on considere que c est comme rien donner et on efface dnama zorglub temporary dnama endelse print dnama dnama endif if fieldfound eq 1 then break endfor if fieldfound eq 0 then dnama non def car init avec temporary default value fixed when dim are created cf hereunder end else:message wada t es pas la impossible animal 1 endcase if nbdimvv inv lt 0 or nbdimvv inv gt nbdimmax then message PB : sorry ben moins de une ou plus de 99 dims impossible stop if inv ge 1 then begin for invloc 0 inv 1 do if nama inv eq nama invloc then message PB : impossible de donner 2 noms identiques a 2 vars stop endif print NVIV nviv on cree les structures pour chaque dim afin de definir celles ci ensuite if nbdimvv inv ne 0 then begin on a un vrai tablo pas un scalaire print var numero nviv ssvv ssvv for iid 0 nbdimvv inv 1 do begin iidp1 iid 1 iidp1st string iidp1 format fmtbase nn ssvv iidp1 nn ssvvdims iid print iidp1st iidp1st if n_elements strd02 ne 0 then begin print unlim d02 strd02 unlimz endif if firstdimcreated eq 0 then aadd 1 else begin case iidp1 of 1 la dim de la var is the last one it can be unlimited nbdimvv inv :begin if oneunlim_all_samesizeandlast_unlim eq 1 then begin on update create unlimited dimensions according to this one ptr_free ptr_valid for ikd 0 ndimtot 1 do begin loop on dims pour mettre les champs vardep_ndim des struc dim en liste chainee ikdp1st string ikd 1 format fmtbase com strdlc writenc_str2strlc strd ikdp1st if not execute com then message PB : loop on dim tot ikdp1st dim iidp1st var nviv stop if ikd eq 0 then supertab strdlc else supertab supertab strdlc endfor on obtient ici supertab strd01lc strd02lc writenc_unlimdim_update dnames_imposed unl_imposed fmtbase nviv iidp1st nn dst iid supertabu supertab dimsizesu dimsizes unlimtabau unlimtaba unlimau unlima dimidasu dimidas ndimtotu ndimtot dnamossu dnamoss dnamau dnama impose_dnm_unlu impose_dnm_unl for ikd 0 ndimtot 1 do begin on remet les struc avec liste chain en structures classiques du main prog ikdp1st string ikd 1 format fmtbase com strd ikdp1st writenc_strlc2str supertab ikd if not execute com then message PB : loop on dim tot ikdp1st dim iidp1st var nviv stop endfor endif oneunlim_all_samesizeandlast_unlim if dnames_imposed eq 1 then aadd where dimsizes nn eq 0 and unlimtaba eq unlima and dnamoss eq dnama iid else case sensitive sur EQ char aadd where dimsizes nn eq 0 and unlimtaba eq unlima la dim cherchee peut etre unlim car last end 2 la dim de la var is not last cannot be unlimited else : begin if dnames_imposed eq 1 then aadd where dimsizes nn eq 0 and unlimtaba eq 0 and dnamoss eq dnama iid else case sensitive sur EQ character aadd where dimsizes nn eq 0 and unlimtaba eq 0 end endcase endelse if inv eq 3 and iid eq 2 then begin if inv eq 2 and iid eq 0 then begin print aadd inv 2 iid 0 aadd stop endif if aadd 0 eq 1 then begin cette taille de dim existe pas deja ou pas en meme unlimited style donc on cree la dim ndimtot ndimtot 1 ndst string ndimtot format fmtbase if firstdimcreated eq 0 and iid eq 0 then begin premiere dim cree dimsizes nn dimidas dst ndst if iidp1 eq nbdimvv inv then unlimtaba unlima else unlimtaba 0 if n_elements dnama ne 0 then dnamoss dnama iid else dnamoss dimidas ndimtot 1 impose_dnm_unl dnames_imposed unl_imposed firstdimcreated 1 endif else begin dimsizes dimsizes nn dimidas dimidas dst ndst if iidp1 eq nbdimvv inv then unlimtaba unlimtaba unlima else unlimtaba unlimtaba 0 if n_elements dnama ne 0 then dnamoss dnamoss dnama iid else dnamoss dnamoss dimidas ndimtot 1 impose_dnm_unl impose_dnm_unl dnames_imposed unl_imposed tablo: ix 2 jy ndimtot endelse if iidp1 eq nbdimvv inv then lasto 1 else lasto 0 com strd ndst dimid:dimidas ndimtot 1 taille:nn nomdim:dnamoss ndimtot 1 unlimz:unlimtaba ndimtot 1 vardep_ndim: a: nama inv b: iidp1 c: invp1 d: lasto impos:impose_dnm_unl ndimtot 1 if not execute com then message ERR : a la def 1 de la structure de dim iidp1st var nviv stop endif else begin cette taille de dim existe avec same unlimited style on checke si c est ds la meme var ou pas nbsamedim n_elements aadd au moins egal a 1 ou plus if dnames_imposed eq 1 then if nbsamedim gt 1 then message PB : impossible d avoir 2 dim identiques deja definies stop nbdsaminvar 0 if not_samedimname_in_same_var eq 1 then begin ci dessous: soit check 1ere dim of var: no same dim in var nbdsaminvar 0 or elle existe deja donc on utilise la 1ere identique soit on check la last qui peut aussi etre la 1st et si unlim 1 alors again: no same dim in var nbdsaminvar 0 or soit on checke la last avec unlim 0 ou une var not last donc unlim 0 et donc si size idem alors nbdsaminvar 1 if dnames_imposed eq 0 then begin if not iid eq 0 or iidp1 eq nbdimvv inv and unlima eq 1 then for iidloc 0 iid 1 do if ssvvdims iidloc eq nn then nbdsaminvar nbdsaminvar 1 endif else nbdsaminvar 0 arrive si dnames_imposed 1 endif else nbdsaminvar 0 if nbdsaminvar lt nbsamedim then begin pas besoin de creer on peut se servir d une dim deja definie juste mise a jour de strd de aadd nbdsaminvar 1 on ne peut arriver que ici avec dnames_imposed 1 car nbdsaminvar 0 cf ci dessus if inv eq 3 and iid eq 2 then print wada strnbd string aadd nbdsaminvar 1 format fmtbase com strdtmp strd strnbd if not execute com then message ERR : attribution strdtmp 1 dim iidp1st var nviv stop if iidp1 eq nbdimvv inv then lasto 1 else lasto 0 aavardep_ndim a: strdtmp vardep_ndim 0 nama inv b: strdtmp vardep_ndim 1 iidp1 c: strdtmp vardep_ndim 2 invp1 d: strdtmp vardep_ndim 3 lasto if iidp1 eq nbdimvv inv and unlima eq 1 then unlimnew unlima else unlimnew strdtmp unlimz obsolete unlimnew strdtmp unlimz unlimz reste inchange car la dim re utilisee est selectionnee sur taille ET unlim if n_elements dnama ne 0 then dnamo dnama iid else dnamo strdtmp nomdim if n_elements dnama ne 0 then if dnama iid ne strdtmp nomdim then message PB : impossible d etre la car update une dim qui a un nom impose different stop dnamo strdtmp nomdim on utilise le meme nom de l ancienne dim ok com strd strnbd dimid:strdtmp dimid taille:nn nomdim:dnamo unlimz:unlimnew vardep_ndim:aavardep_ndim if not execute com then message ERR : update vardep unlimz dim strnbd loop: dim iidp1st var nviv stop if inv eq 3 and iid eq 2 then stop endif else if nbdsaminvar eq nbsamedim then begin on cree nouvelle dim car cette taille de dim existe par exemple 2 fois avec 2 dimid noms differents mais on doit en creer une troisieme meme taille nom different car une var contient 3 fois cette taille de dim pour pouvoir etre ici une condition necessaire est car sinon nbdsaminvar 0 or nbsamedim 0 : not iid eq 0 or iidp1 eq nbdimvv inv and unlima eq 1 donc on est pas 1ere dim of var ET pas last dim of var OU pas unlim 1 donc je peux etre last dim mais alors en unlim 0 seulement sinon je suis une dim du milieu pas 1ere ni last DONC on ne cree jamais de dim unlim ici ndimtot ndimtot 1 ndst string ndimtot format fmtbase dimsizes dimsizes nn dimidas dimidas dst ndst if iidp1 eq nbdimvv inv then unlimtaba unlimtaba unlima else unlimtaba unlimtaba 0 if unlimtaba ndimtot 1 eq 1 then message PB : impossible de definir une structure de dim unlimited ici stop if n_elements dnama ne 0 then dnamoss dnamoss dnama iid else dnamoss dnamoss dimidas ndimtot 1 if iidp1 eq nbdimvv inv then lasto 1 else lasto 0 impose_dnm_unl impose_dnm_unl dnames_imposed unl_imposed tablo: ix 2 jy ndimtot mis a jour com strd ndst dimid:dimidas ndimtot 1 taille:nn nomdim:dnamoss ndimtot 1 unlimz:unlimtaba ndimtot 1 vardep_ndim: a: nama inv b: iidp1 c: invp1 d: lasto if not execute com then message ERR : a la def 2 de la structure de dim iidp1st var nviv stop endif else message ERR : impossible d avoir plus de dim identiques iidp1st ds la var nviv que deja definies stop endelse checke que l on ne vient pas de creer une 2ieme dim differentes en unlimited ncdf_dimdef stop autrement car une seule dim unlimited allowed if n_elements where unlimtaba eq 1 ge 2 then message ERR : une 2ieme structure dim unlimited dim iidp1st vient d etre creee mais on ne peut definir qu une unique dim unlimited en netcdf stop endfor endif else pas de dim a creer pour cette var qui est un scalaire ou string simple endfor definition des dimensions checke que l on n a pas mis deux dimensions differentes en unlimited ncdf_dimdef stop autrement une seule dim unlimited if n_elements where unlimtaba eq 1 ge 2 then message ERR : plus de 2 dimensions unlimited ont ete prescrites stop commande de base pour definir une dim : idout_of_the_dim NCDF_DIMDEF idout_of_the_nc_file name_of_dim n_size_of_dim EXPLES: xidout NCDF_DIMDEF idout x n1 ou pour unlimited : tidout NCDF_DIMDEF idout time unlimited sans donner la taille de la dim RQ : si on a deux dim avec le meme nom la definition des dim renvoit un message d erreur OK si on definit une dim unlimited t1idout par exemple et si 2 var a1 fltarr 5 et a2 fltarr 7 se reclament de cette dim au moment du ncdf_vadef par id1 NCDF_VARDEF idout a1 t1idout FLOAT et id2 a2 ALORS la taille de la dim unlimited sera egale a la plus grde des 2 dims ici 7 et les valeurs pour a1 5 et a1 6 seront mises a 9 96921e 36 ds le netcdf ici on previent ce genre de choses toutes les vars avec la dim unlim en dernier doivent avoir la meme taille pour cette dim quitte a mettre des missing_value au prealable pour combler certains tablos a la bonne taille plutot que des 9 96921e 36 non reconnaissable a priori avec une var tablo avec 2 ou plus dim de meme taille exple: fltarr 5 5 on peut soit definir 2 dim de nom differents et de meme taille d01idout NCDF_DIMDEF idout d01 5 et d02 d02 puis ncdf_vardef d01 d02 soit definir UNE SEULE DIM d01idout de taille 5 et faire pour la var: ncdf_vardef d01idout d01idout aussi accepte for ind 0 ndimtot 1 do begin indp1st string ind 1 format fmtbase char1 strd char2 taille char3 com if strd indp1st unlimz eq 0 then ndstr char1 indp1st char2 else ndstr char3 if not execute com then message ERR : computing de ndstr pour la def de la dim indp1st stop com dimida strd indp1st dimid if not execute com then message ERR : attrib dim id pour la def de la dim indp1st stop dimida dimida idout com dimida ncdf_dimdef idout strd indp1st nomdim ndstr unlimited strd indp1st unlimz if not execute com then message ERR : definition de la dim indp1st stop endfor define mode 2ieme boucle sur les vars pour definir celles ci commande de base pour definir une var : id_of_the_var NCDF_VARDEF id_of_the_nc_file name_of_the_var id_of_the_dim_of_the_var_in_the_right_order type_of_var RQ : si on veut definir une var unlimited ca doit etre la derniere dim des variables Si a2 fltarr n1 n4 n5 n3 alors la unlim ne peut etre que n3 si on veut definir 2 vars avec le meme nom on a un diag error par idl ok EXPLE: id0 NCDF_VARDEF idout a2 xidout tidout yidout zidout FLOAT for inv 0 nbvars 1 do begin Def des vars nviv string inv 1 format fmtbase type de la var a ecrire tpv intarr 6 case typcodvv inv of 1:tpv 0 1 byte 2:tpv 1 1 short int 3:tpv 2 1 long 4:tpv 3 1 float 5:tpv 4 1 dble 7:tpv 5 1 char else:message PB : le type de la var num nviv est pas accepte par ncdf idl not byte int real stop end flagstype BYTE tpv 0 SHORT tpv 1 LONG tpv 2 FLOAT tpv 3 DOUBLE tpv 4 CHAR tpv 5 listofdims listofdimnams inv if nbdimvv inv ne 0 then begin on a un vrai tablo pas un scalaire on recherche le nom des dims de la var a mettre ds listofdims for iid 0 nbdimvv inv 1 do begin boucle sur les dims de la var ds ordre des dim de la var iidp1 iid 1 iidp1st string iid 1 format fmtbase ndimdepfd 0 for ind 0 ndimtot 1 do begin boucle sur les dims globales qui ont ete definies precedemment indp1st string ind 1 format fmtbase com namvararr strd indp1st vardep_ndim 0 if not execute com then message ERR : attrib namvararr dim glob indp1st dim var iidp1st var num nviv stop com numdimvararr strd indp1st vardep_ndim 1 if not execute com then message ERR : attrib numdimvararr dim glob indp1st dim var iidp1st var num nviv stop aaa where namvararr eq nama inv and numdimvararr eq iidp1 if aaa 0 ne 1 then begin com dimnam strd indp1st nomdim if not execute com then message ERR : attrib dimnam dim glob indp1st dim var iidp1st var num nviv stop com dimdep strd indp1st dimid if not execute com then message ERR : attrib dimdep dim glob indp1st dim var iidp1st var num nviv stop dimdep dimdep idout check unlim en last dim ok com unlimdd strd indp1st unlimz if not execute com then message ERR : attrib unlimdd dim glob indp1st dim var iidp1st var num nviv stop if unlimdd eq 1 and iidp1 ne nbdimvv inv then message PB : cannot define var with unlim dim iidp1st which is not last of var nviv dimglo indp1st stop IF unlimdd EQ 1 THEN dimnam dimnam ndimdepfd ndimdepfd 1 endif endfor case ndimdepfd of 0:message PB : on ne trouve aucun nom de dim glob pour la dim iidp1st de la var nviv stop 1:begin if iid eq 0 then listofdims dimdep else listofdims listofdims dimdep if iid eq 0 then listofdimnams inv dimnam else listofdimnams inv listofdimnams inv dimnam end else:message PB : on trouve plus de 1 nom de dim glob pour la dim iidp1st de la var nviv stop endcase endfor listofdims listofdims listofdims doit etre de la forme : endif else listofdims com id nviv NCDF_VARDEF idout nama inv listofdims flagstype if not execute com then message ERR : definition de la var nviv stop Def des attributs de la var ds le cas d une structure: la def des attributs si existent a ete specifiee ds la structure missaval_flag 0 if arr_struct inv eq 1 then begin ok var00 est une structure com vvtmpstr var nviv if not execute com then message ERR : attribution de vvtmpstr 2ieme boucle sur les var var num nviv stop if nbtags inv gt iattrv0 inv then begin on a des attributs en plus nbattr nbtags inv iattrv0 inv for iatr 0 nbattr 1 do begin iatrstp1 string iatr 1 format fmtbase print nviv iattrv0 inv iatr ss size vvtmpstr iattrv0 inv iatr if ss 0 ne 1 or ss 2 ne 8 or n_tags vvtmpstr iattrv0 inv iatr ne 2 then message PB : l attribut numero iatrstp1 de la var nviv n est pas une struc de 2 elements stop attnamtmp vvtmpstr iattrv0 inv iatr 0 attxttmp vvtmpstr iattrv0 inv iatr 1 comm NCDF_ATTPUT idout id nviv attnamtmp attxttmp if not execute comm then message PB : def attr numero iatrstp1 var numero nviv stop if strlowcase attnamtmp eq missing_value then begin si on trouve un attribut missval on memorise missaval_flag 1 missaval attxttmp endif endfor endif endif attributs par defaut: valid_min et valid_max et infos sur missing value if typcodvv inv ne 7 then begin si var est pas un char on peut calculer min et max case arr_struct inv of 0:com vvtmp var nviv 1:com vvtmp vvtmpstr structfd_v else:message ERR : impossible to be there stop endcase if not execute com then message ERR : attribution de vvtmp 2ieme boucle sur les var var num nviv stop if not keyword_set oknan then begin aak where not float finite vvtmp if aak 0 ne 1 then message PB : la var numero nviv contient des nan pas propre ds un fichier netcdf cf utilisation ferret et autre soft remplacer par des missing ou bien activer le mot cle oknan pour tolerer l ecriture de Nan ds le fichier nc stop endif writevalidminmax 1 a priori on va ecrire un min et max value mais si que des missing alors on ne l ecrit pas en fait if missaval_flag eq 1 then begin ss size missaval if ss 0 ne 0 or ss 1 ne typcodvv inv then message PB : la miss val est pas scalaire ou pas meme type que var nviv stop whhmiss where vvtmp eq missaval complement whhok if whhmiss 0 eq 1 then begin if n_elements vvtmp gt 1 then begin attnamtmp valid_min_max attxttmp missing value never occurs comm NCDF_ATTPUT idout id nviv attnamtmp attxttmp if not execute comm then message ERR : def extra attr miss val 0 var numero nviv stop endif aamax max vvtmp min aamin endif else begin if whhok 0 ne 1 then begin if n_elements vvtmp gt 1 then begin attnamtmp valid_min_max attxttmp missing value occurs comm NCDF_ATTPUT idout id nviv attnamtmp attxttmp if not execute comm then message ERR : def extra attr miss val 1 var numero nviv stop endif aamax max vvtmp whhok min aamin endif else begin on a que des missing value if n_elements vvtmp gt 1 then begin attnamtmp valid_min_max attxttmp missing value always occurs comm NCDF_ATTPUT idout id nviv attnamtmp attxttmp if not execute comm then message ERR : def extra attr miss val 2 var numero nviv stop writevalidminmax 0 endif else aamax max vvtmp min aamin endelse endelse endif else begin aamax max vvtmp min aamin attnamtmp valid_min_max attxttmp no missing value defined comm NCDF_ATTPUT idout id nviv attnamtmp attxttmp if not execute comm then message ERR : def extra attr miss val 3 var numero nviv stop endelse if writevalidminmax then begin attnamtmp valid_min comm NCDF_ATTPUT idout id nviv attnamtmp aamin if not execute comm then message ERR : def miss val attr min var numero nviv stop attnamtmp valid_max comm NCDF_ATTPUT idout id nviv attnamtmp aamax if not execute comm then message ERR : def miss val attr max var numero nviv stop endif endif endfor Definition des attributs globaux attprod 0 if n_elements globattr ne 0 then begin on a prescrit des attributs globaux if size globattr 0 ne 1 or size globattr 2 ne 8 then message PB : les global attr doivent etre donne sous forme de struct stop nbtagsgb n_tags globattr for igat 0 nbtagsgb 1 do begin igatst string igat format i2 2 ss size globattr igat if ss 0 ne 1 or ss 2 ne 8 or n_tags globattr igat ne 2 then message ERR : au glob attr numero igatst qui n est pas un structure de 2 elements stop gbatn globattr igat 0 gbatt globattr igat 1 NCDF_ATTPUT idout gbatn gbatt global if gbatn eq Production then attprod 1 endfor endif if attprod eq 0 then begin producta systime NCDF_ATTPUT idout Production producta GLOBAL endif Fin de definition des variables NCDF_CONTROL idout ENDEF take the open netCDF file out of define mode and into data mode Ecriture des variables for inv 0 nbvars 1 do begin nviv string inv 1 format i2 2 case arr_struct inv of 0: comm NCDF_VARPUT idout id nviv var nviv tablo 1: comm NCDF_VARPUT idout id nviv var nviv structfd_v struct else:message ERR : ncdf_varput case endcase if writeout and inv eq 0 then print Writing fields : if writeout then print nama inv listofdimnams inv var nviv if not execute comm then message PB : ncdf_varput final stop endfor Fermeture fichier netcdf NCDF_CLOSE idout if writeout then print Written to ncfile if writeout then print end exemples of var attr : rain:units mm day rain:valid_min 32700 rain:valid_max 32700 rain:valid_range 32700 32700 rain:standard_name rain1 rain:long_name monthly precipitation by merging gauge 5 kinds of satellite estimates GPI OPI SSM I scattering SSM I emission and MSU rain:title monthly precipitation by merging gauge 5 kinds of satellite estimates GPI OPI SSM I scattering SSM I emission and MSU rain:add_offset 31 7f rain:scale_factor 0 001f rain:missing_value 1 f rain:lon nav_lon rain:lat nav_lat exemples of global attr : File_Name : trmm_1d_19980101_19981231_reg0 25 nc Model_Name : TRMM 3B42_V6 derived product Source_File : ftp: disc2 nascom nasa gov data TRMM Gridded Derived_Products 3B42_V6 Daily iyystr bin IDL_Program_Name : zz08_read_plot_row_trmm_precip pro Grid : regular 0 25 degres resolution Title : Weekly Topex ers sea surface anomaly from oct 14th 1992 to feb 13th 2002 Associate_file : Description : exemple de creation fic ncdf avec fcts idl : creation du fichier de sortie et ecriture des vars idout NCDF_CREATE fic 2 clobber NCDF_CONTROL idout nofill Dimension xidout NCDF_DIMDEF idout x nxx yidout NCDF_DIMDEF idout y nyy tidout NCDF_DIMDEF idout time_counter unlimited Attributs globaux NCDF_ATTPUT idout title Weekly Topex ers sea surface anomaly from oct 14th 1992 to feb 13th 2002 GLOBAL NCDF_ATTPUT idout production Cl ment de Boyer cdblod lodyc jussieu fr GLOBAL NCDF_ATTPUT idout description ncecat 488 files of Topex ers data on Indian Ocean and add a time counter GLOBAL NCDF_ATTPUT idout associate_file prev_fic GLOBAL NCDF_ATTPUT idout time_stamp systime GLOBAL Def des variables id0 NCDF_VARDEF idout nav_lon xidout yidout FLOAT id1 NCDF_VARDEF idout nav_lat xidout yidout FLOAT id2 NCDF_VARDEF idout time_counter tidout FLOAT id3 NCDF_VARDEF idout sla xidout yidout tidout FLOAT Attributs variable 0 : lon NCDF_ATTPUT idout id0 units degrees_east NCDF_ATTPUT idout id0 valid_min min lon NCDF_ATTPUT idout id0 valid_max max lon NCDF_ATTPUT idout id0 long_name Longitude at t point Attributs variable 1 : lat NCDF_ATTPUT idout id1 units degrees_north NCDF_ATTPUT idout id1 valid_min min lat NCDF_ATTPUT idout id1 valid_max max lat NCDF_ATTPUT idout id1 long_name Latitude at t point Attributs variable 2 : NCDF_ATTPUT idout id2 units origt NCDF_ATTPUT idout id2 calendar leap NCDF_ATTPUT idout id2 title Time NCDF_ATTPUT idout id2 long_name Time axis NCDF_ATTPUT idout id2 time_origin origt christophe style ayear strtrim string year 0 1 amonth strtrim string month 0 format i2 2 1 aday strtrim string day 0 format i2 2 1 NCDF_ATTPUT idout id3 units days since ayear amonth aday 00:00:00 NCDF_ATTPUT idout id3 calendar gregorian NCDF_ATTPUT idout id3 long_name Time axis NCDF_ATTPUT idout id3 time_origin ayear b month 0 1 aday 00:00:00 Attributs variable 3 : vv NCDF_ATTPUT idout id3 units M NCDF_ATTPUT idout id3 missing_value missval NCDF_ATTPUT idout id3 valid_min min vv if countnomiss ne 0 then vvmw vv vvw NCDF_ATTPUT idout id3 valid_max max vvmw NCDF_ATTPUT idout id3 long_name sea level anomaly NCDF_ATTPUT idout id3 short_name sla fin def des variables NCDF_CONTROL idout ENDEF Ecriture des variables NCDF_VARPUT idout id0 lon la longitude var 0 NCDF_VARPUT idout id1 lat la latitude var 1 NCDF_VARPUT idout id2 ttt le time calendrier var 2 NCDF_VARPUT idout id3 vv la vv var 3 Fermeture fichier netcdf NCDF_CLOSE idout EXPLE de ncdf quickwrite bof quoi : ncfile my nc angle_attr units: degrees wind_attr units: m s 1 press_attr units: pascals missing_value:1e10 g_attr units: m s 2 globattr source: My program version:2 ncfields pressure longitude latitude time p:press_attr longitude lons:angle_attr latitude lats:angle_attr ubar latitude time :wind_attr year time yr g 9 8:g_attr globattr ncdf_quickwrite "); a[139] = new Array("./ReadWrite/write_oasis.html", "write_oasis.pro", "", " file_comments write an Oasis file version z2d will be lost once write_oasis is returning keyword HEADER activate to write the header character 8 contained in varname before writting the data Used when recsize is defined and 0 see example keyword ENDING activate when you write the last part of the data Used when recsize is defined and 0 see example keyword POSITION specify the position in byte at which you want to write the data Used when recsize is defined and 0 see example restrictions varname is automatically written as a character 8 by default z2d is written as an R8 array examples write_oasis fa2of WEIGHTS5 weig or in several call so save memory ysz 100L recsz8 16L jpio jpjo 8L FOR i 0L jpjo 1L ysz DO BEGIN ii i ysz 1L jpjo 1L position 4L 8L 4L 4L i NE 0 16L jpio i 8L weig write_oasis fa2ou WEIGHTS3 temporary weig temporary append i NE 0 header i EQ 0 ending ii EQ jpjo 1 recsize recsz8 position position ENDFOR history Sebastien Masson smasson lodyc jussieu fr July 01 2002 version Id: write_oasis pro 332 2008 02 11 16:48:24Z smasson PRO write_oasis filename varname z2d I2 i2 I4 i4 I8 i8 R4 r4 APPEND append RECSIZE recsize TEMPORARY temporary HEADER header ENDING ending POSITION position compile_opt idl2 strictarrsubs openw unit filename F77_UNFORMATTED keyword_set recsize EQ 0 GET_LUN SWAP_IF_LITTLE_ENDIAN error err APPEND append IF err NE 0 THEN BEGIN ras report err_string return ENDIF IF n_elements position NE 0 THEN point_lun unit position IF keyword_set recsize THEN BEGIN IF keyword_set header THEN BEGIN writeu unit 8L writeu unit string varname format a8 writeu unit 8L writeu unit long recsize ENDIF ENDIF ELSE BEGIN writeu unit string varname format a8 ENDELSE IF keyword_set temporary THEN BEGIN CASE 1 OF keyword_set i2 :writeu unit fix temporary z2d keyword_set i4 :writeu unit long temporary z2d keyword_set i8 :writeu unit long64 temporary z2d keyword_set r4 :writeu unit float temporary z2d ELSE: writeu unit double temporary z2d ENDCASE ENDIF ELSE BEGIN CASE 1 OF keyword_set i2 :writeu unit fix z2d keyword_set i4 :writeu unit long z2d keyword_set i8 :writeu unit long64 z2d keyword_set r4 :writeu unit float z2d ELSE: writeu unit double z2d ENDCASE ENDELSE IF keyword_set recsize AND keyword_set ending THEN writeu unit long recsize free_lun unit return END"); a[140] = new Array("./ReadWrite/writebat.html", "writebat.pro", "", " file_comments write the bathymetry ASCII file of OPA categories For OPA param ZBAT in required the bathymetry a 2d array param FILENAME in required type string It contains the filename history Sebastien Masson smasson lodyc jussieu fr Sept 30 2003 based on batsav2 pro written by Maurice Imbard March 17 1998 version Id: writebat pro 325 2007 12 06 10:04:53Z pinsard PRO writebat zbat filename compile_opt idl2 strictarrsubs basic checks IF n_params NE 2 THEN BEGIN ras report bad number of arguments in the call of writebat return ENDIF IF size filename type NE 7 THEN BEGIN ras report the filename should be a string return ENDIF sbat size zbat IF sbat 0 NE 2 THEN BEGIN ras report bathymetry array should be 2d array return ENDIF jpi2 sbat 1 jpj2 sbat 2 parameters def ifreq 40 ifin jpi2 ifreq 1 irest jpi2 ifin 1 ifreq zbati intarr ifreq zbati2 intarr irest i0 intarr ifreq 5 i1 intarr max 1 irest 5 openw iunit filename get_lun fill the file printf iunit FORMAT 1x bathy IDL 2i8 jpi2 jpj2 printf iunit FORMAT il1 0 FOR jn 1 ifin 1 DO BEGIN printf iunit FORMAT il2 min jpi2 1 il1 ifreq 1 i0 0 il1 1 FOR jj 1 ifreq 5 1 DO BEGIN i0 jj i0 jj 1 5 END printf iunit FORMAT 3x 13 i3 12x i0 printf iunit FORMAT il3 il2 jn 1 ifreq iformat string il3 2 i3 FOR jj jpj2 1 0 1 DO BEGIN zbati 0:il3 zbat il1:il2 jj printf iunit FORMAT iformat jj 1 zbati END il1 il1 ifreq END printf iunit FORMAT il2 min jpi2 1 il1 ifreq 1 i1 0 il1 1 FOR jj 1 irest 5 1 DO BEGIN i1 jj i1 jj 1 5 END printf iunit FORMAT 3x 13 i3 12x i1 printf iunit FORMAT il3 il2 ifin 1 ifreq iformat string il3 2 i3 FOR jj jpj2 1 0 1 DO BEGIN zbati2 0:irest 1 0 zbati2 0:il3 zbat il1:il2 jj printf iunit FORMAT iformat jj 1 zbati2 END end close iunit free_lun iunit return end"); a[141] = new Array("./Tests/TestsOld/tst_basic_old.html", "tst_basic_old.pro", "", " file_comments figure 1: basics plots plot and contours history Sebastien Masson may 2005 version Id: tst_basic_old pro 237 2007 03 26 15:37:03Z pinsard PRO tst_basic_old 1 plot compile_opt idl2 strictarrsubs n 10 y findgen n basic plot splot y petit 2 2 1 portrait improved plot by using plot and graphic keywords splot y petit 2 2 2 noerase yrange 0 n 1 2 title x and x 2 oplot y 2 color 100 linestyle 2 thick 3 2 contour z dist n basic plot scontour z fill nlevels 15 petit 2 2 3 noerase improved plot by using contour and graphic keywords ind findgen 2 n 2 n scontour z levels n ind c_orientation 180 ind c_spacing 2 ind petit 2 2 4 noerase contour z overplot c_label rebin 1 0 2 n levels n ind c_charthick 2 c_charsize 1 5 c_colors 250 ind return end"); a[142] = new Array("./Tests/TestsOld/tst_initlev_index_old.html", "tst_initlev_index_old.pro", "", ""); a[143] = new Array("./Tests/TestsOld/tst_initlev_index_stride_old.html", "tst_initlev_index_stride_old.pro", "", ""); a[144] = new Array("./Tests/TestsOld/tst_initlev_old.html", "tst_initlev_old.pro", "", ""); a[145] = new Array("./Tests/TestsOld/tst_initlev_stride_old.html", "tst_initlev_stride_old.pro", "", ""); a[146] = new Array("./Tests/TestsOld/tst_initorca05_index_old.html", "tst_initorca05_index_old.pro", "", ""); a[147] = new Array("./Tests/TestsOld/tst_initorca05_index_stride_old.html", "tst_initorca05_index_stride_old.pro", "", ""); a[148] = new Array("./Tests/TestsOld/tst_initorca05_old.html", "tst_initorca05_old.pro", "", ""); a[149] = new Array("./Tests/TestsOld/tst_initorca05_short_old.html", "tst_initorca05_short_old.pro", "", ""); a[150] = new Array("./Tests/TestsOld/tst_initorca05_short_stride_old.html", "tst_initorca05_short_stride_old.pro", "", ""); a[151] = new Array("./Tests/TestsOld/tst_initorca05_stride_old.html", "tst_initorca05_stride_old.pro", "", ""); a[152] = new Array("./Tests/TestsOld/tst_initorca2_index_old.html", "tst_initorca2_index_old.pro", "", ""); a[153] = new Array("./Tests/TestsOld/tst_initorca2_index_stride_old.html", "tst_initorca2_index_stride_old.pro", "", ""); a[154] = new Array("./Tests/TestsOld/tst_initorca2_old.html", "tst_initorca2_old.pro", "", ""); a[155] = new Array("./Tests/TestsOld/tst_initorca2_short_old.html", "tst_initorca2_short_old.pro", "", ""); a[156] = new Array("./Tests/TestsOld/tst_initorca2_short_stride_old.html", "tst_initorca2_short_stride_old.pro", "", ""); a[157] = new Array("./Tests/TestsOld/tst_initorca2_stride_old.html", "tst_initorca2_stride_old.pro", "", ""); a[158] = new Array("./Tests/TestsOld/tst_plt_old.html", "tst_plt_old.pro", "", " file_comments categories keyword IMAGE history Sebastien Masson version Id: tst_plt_old pro 327 2007 12 13 16:22:35Z pinsard PRO tst_plt_old IMAGE image compile_opt idl2 strictarrsubs common figure 2: regular grid CASE jpi key_stride 0 jpj key_stride 1 OF 180 148:file Levitus98_1m_01_12_Temperature_Pot_ORCA2 nc 360 180:file Levitus98_1m_01_12_Temperature_Pot_1x1 nc 720 510:file Levitus98_1m_01_12_Temperature_Pot_ORCA05 nc ENDCASE file isafile file title Where is file lookalldir IF size file type NE 7 THEN return dummy cnt 1 domdef domdef gdept 0 gdept 0 grille T temp read_ncdf votemper 00101 00131 file file plt temp landscape if keyword_set image then saveimage tst_plt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 plt temp 2 31 int 5 nocontour format i3 if keyword_set image then saveimage tst_plt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 plt temp 2 31 int 1 color_c if keyword_set image then saveimage tst_plt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 plt temp 2 31 int 1 nocouleur c_thick 1 cont_thick 2 if keyword_set image then saveimage tst_plt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 plt temp cell_fill 1 jpi EQ 180 we must use cell_fill 2 for ORCA2 if keyword_set image then saveimage tst_plt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 zoom IF key_onearth THEN box 40 375 20 20 ELSE box jpi 4 3 jpi 4 jpj 4 3 jpj 4 plt temp boite box landscape if keyword_set image then saveimage tst_plt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 projections IF key_onearth THEN BEGIN plt temp boite 20 380 60 90 stereo map 90 0 0 portrait if keyword_set image then saveimage tst_plt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 plt temp boite 20 380 90 50 ortho map 90 180 0 portrait if keyword_set image then saveimage tst_plt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 plt temp ortho map 0 0 21 portrait carte if keyword_set image then saveimage tst_plt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 ENDIF deep plot domdef 150 150 warning message domdef gdept jpk 2 gdept jpk 2 grille T temp read_ncdf votemper 00101 00131 file file plt temp carte 2 key_onearth land if keyword_set image then saveimage tst_plt_ image _ string cnt format i2 2 png png cnt cnt 1 return end"); a[159] = new Array("./Tests/TestsOld/tst_pltt_old.html", "tst_pltt_old.pro", "", " file_comments categories keyword IMAGE history Sebastien Masson version Id: tst_pltt_old pro 327 2007 12 13 16:22:35Z pinsard PRO tst_pltt_old IMAGE image compile_opt idl2 strictarrsubs common common figure 2: regular grid CASE jpi key_stride 0 jpj key_stride 1 OF 180 148:file Levitus98_1m_01_12_Temperature_Pot_ORCA2 nc 360 180:file Levitus98_1m_01_12_Temperature_Pot_1x1 nc 720 510:file Levitus98_1m_01_12_Temperature_Pot_ORCA05 nc ENDCASE file isafile file title Where is file lookalldir IF size file type NE 7 THEN return dummy cnt 1 1 1 xt plot IF key_onearth THEN domdef 20 380 1 1 0 gdept 0 ELSE domdef min glamt max glamf jpj 2 1 jpj 2 1 0 gdept 0 temp read_ncdf votemper 00101 01231 file file IF key_forgetold THEN help temp arr ELSE help temp tab help jpt time pltt temp if keyword_set image then saveimage tst_pltt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 pltt temp nocontour if keyword_set image then saveimage tst_pltt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 pltt temp color_c if keyword_set image then saveimage tst_pltt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 pltt temp nocouleur if keyword_set image then saveimage tst_pltt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 equatorial plot IF key_onearth THEN BEGIN a abs gphit 0 yind where a EQ min a domdef 20 380 yind 0 yind n_elements yind 1 gdept 10 jpk 1 gdept 10 jpk 1 grille T yindex ENDIF ELSE BEGIN domdef min glamt max glamf jpj 2 jpj 2 gdept 10 jpk 1 gdept 10 jpk 1 grille T yindex ENDELSE temp read_ncdf votemper 00101 01231 file file IF key_forgetold THEN help temp arr ELSE help temp tab pltt temp if keyword_set image then saveimage tst_pltt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 yt plot along the column that contain the largest latitude IF key_onearth THEN BEGIN ind where gphit EQ max gphit ind ind 0 MOD jpi domdef ind ind 90 90 gdept 0 gdept 0 grille T xindex ENDIF ELSE BEGIN domdef jpi 2 jpi 2 min gphit max gphif gdept 0 gdept 0 grille T xindex ENDELSE temp read_ncdf votemper 00101 01231 file file IF key_forgetold THEN help temp arr ELSE help temp tab pltt temp if keyword_set image then saveimage tst_pltt_ image _ string cnt format i2 2 png png cnt cnt 1 return end"); a[160] = new Array("./Tests/TestsOld/tst_pltz_old.html", "tst_pltz_old.pro", "", " file_comments categories keyword IMAGE history Sebastien Masson version Id: tst_pltz_old pro 327 2007 12 13 16:22:35Z pinsard PRO tst_pltz_old IMAGE image compile_opt idl2 strictarrsubs common IF jpk EQ 1 THEN return dummy cnt 1 CASE jpi key_stride 0 jpj key_stride 1 OF 180 148:file Levitus98_1m_01_12_Temperature_Pot_ORCA2 nc 360 180:file Levitus98_1m_01_12_Temperature_Pot_1x1 nc 720 510:file Levitus98_1m_01_12_Temperature_Pot_ORCA05 nc ENDCASE file isafile file title Where is file lookalldir IF size file type NE 7 THEN return IF key_onearth THEN domdef 20 380 1 1 0 max gdept ELSE domdef min glamt max glamf jpj 2 1 jpj 2 1 0 max gdept temp read_ncdf votemper 00101 00131 file file IF key_forgetold THEN help temp arr ELSE help temp tab pltz temp portrait if keyword_set image then saveimage tst_pltz_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 pltz temp portrait nocontour if keyword_set image then saveimage tst_pltz_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 pltz temp portrait color_c if keyword_set image then saveimage tst_pltz_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 pltz temp portrait nocouleur if keyword_set image then saveimage tst_pltz_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 pltz temp boite 6000 if keyword_set image then saveimage tst_pltz_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 pltz temp boite 6000 zoom 1000 if keyword_set image then saveimage tst_pltz_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 pltz temp boite 6000 zoom 1000 ysurx 2 if keyword_set image then saveimage tst_pltz_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 pltz temp boite 6000 zoom 1000 ysurx 2 hzsurht 5 if keyword_set image then saveimage tst_pltz_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 yt plot along the column that contain the largest latitude IF key_onearth THEN BEGIN ind where gphit EQ max gphit ind ind 0 MOD jpi domdef ind ind 90 90 0 max gdept grille T xindex ENDIF ELSE BEGIN domdef jpi 2 jpi 2 min gphit max gphif 0 max gdept grille T xindex ENDELSE temp read_ncdf votemper 00101 01231 file file pltz temp boite 6000 zoom 1000 ysurx 2 hzsurht 5 if keyword_set image then saveimage tst_pltz_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 oblique sections IF key_onearth THEN endpoints 110 45 290 45 ELSE endpoints jpi 6 jpj 3 5 jpi 6 2 jpj 3 domdef endpoints endpoints type pltz temp read_ncdf votemper 00101 00131 file file pltz temp endpoints endpoints if keyword_set image then saveimage tst_pltz_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 false oblique sections IF key_onearth THEN endpoints 180 70 180 90 ELSE endpoints jpi 2 0 25 0 25 jpi 2 0 25 jpj domdef 6000 endpoints endpoints type pltz temp read_ncdf votemper 00101 00131 file file pltz temp endpoints endpoints boite 6000 zoom 1000 ysurx 2 hzsurht 5 showbuild if keyword_set image then saveimage tst_pltz_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 comparison between real section and false oblique sections IF where gphit EQ 0 0 NE 1 THEN BEGIN IF key_onearth THEN box 20 380 0 0 0 6000 ELSE box 0 jpi 1 jpj 2 jpj 2 0 6000 domdef box grille T temp read_ncdf votemper 00101 00131 file file pltz temp boite 6000 portrait petit 1 2 1 zoom 500 hzsurht 5 IF key_onearth THEN endpoints 20 0 380 0 ELSE endpoints 0 jpj 2 jpi 1 jpj 2 domdef 6000 endpoints endpoints type pltz grille T temp read_ncdf votemper 00101 00131 file file pltz temp endpoints endpoints boite 6000 zoom 500 hzsurht 5 petit 1 2 2 noerase if keyword_set image then saveimage tst_pltz_ image _ string cnt format i2 2 png png cnt cnt 1 ENDIF return end"); a[161] = new Array("./Tests/tst_basic.html", "tst_basic.pro", "", " file_comments figure 1: basics plots plot and contours history Sebastien Masson may 2005 version Id: tst_basic pro 325 2007 12 06 10:04:53Z pinsard PRO tst_basic 1 plot compile_opt idl2 strictarrsubs n 10 y findgen n basic plot splot y small 2 2 1 portrait improved plot by using plot and graphic keywords splot y small 2 2 2 noerase yrange 0 n 1 2 title x and x 2 oplot y 2 color 100 linestyle 2 thick 3 2 contour z dist n basic plot scontour z fill nlevels 15 small 2 2 3 noerase improved plot by using contour and graphic keywords ind findgen 2 n 2 n scontour z levels n ind c_orientation 180 ind c_spacing 2 ind small 2 2 4 noerase contour z overplot c_label rebin 1 0 2 n levels n ind c_charthick 2 c_charsize 1 5 c_colors 250 ind return end"); a[162] = new Array("./Tests/tst_initlev.html", "tst_initlev.pro", "", ""); a[163] = new Array("./Tests/tst_initlev_index.html", "tst_initlev_index.pro", "", ""); a[164] = new Array("./Tests/tst_initlev_index_stride.html", "tst_initlev_index_stride.pro", "", ""); a[165] = new Array("./Tests/tst_initlev_stride.html", "tst_initlev_stride.pro", "", ""); a[166] = new Array("./Tests/tst_initorca05.html", "tst_initorca05.pro", "", ""); a[167] = new Array("./Tests/tst_initorca05_index.html", "tst_initorca05_index.pro", "", ""); a[168] = new Array("./Tests/tst_initorca05_index_stride.html", "tst_initorca05_index_stride.pro", "", ""); a[169] = new Array("./Tests/tst_initorca05_short.html", "tst_initorca05_short.pro", "", ""); a[170] = new Array("./Tests/tst_initorca05_short_stride.html", "tst_initorca05_short_stride.pro", "", ""); a[171] = new Array("./Tests/tst_initorca05_stride.html", "tst_initorca05_stride.pro", "", ""); a[172] = new Array("./Tests/tst_initorca2.html", "tst_initorca2.pro", "", ""); a[173] = new Array("./Tests/tst_initorca2_index.html", "tst_initorca2_index.pro", "", ""); a[174] = new Array("./Tests/tst_initorca2_index_stride.html", "tst_initorca2_index_stride.pro", "", ""); a[175] = new Array("./Tests/tst_initorca2_short.html", "tst_initorca2_short.pro", "", ""); a[176] = new Array("./Tests/tst_initorca2_short_stride.html", "tst_initorca2_short_stride.pro", "", ""); a[177] = new Array("./Tests/tst_initorca2_stride.html", "tst_initorca2_stride.pro", "", ""); a[178] = new Array("./Tests/tst_plt.html", "tst_plt.pro", "", " file_comments categories keyword IMAGE examples To run test with Levitus temperature on a regular 1x1 grid : IDL tst_initlev IDL tst_plt history Sebastien Masson version Id: tst_plt pro 371 2008 08 07 09:32:02Z pinsard PRO tst_plt IMAGE image compile_opt idl2 strictarrsubs cm_4mesh figure 2: regular grid CASE jpi key_stride 0 jpj key_stride 1 OF 180 148:file Levitus98_1m_01_12_Temperature_Pot_ORCA2 nc 360 180:file Levitus98_1m_01_12_Temperature_Pot_1x1 nc 720 510:file Levitus98_1m_01_12_Temperature_Pot_ORCA05 nc ENDCASE file isafile file title Where is file lookalldir IF size file type NE 7 THEN return dummy cnt 1 domdef domdef gdept 0 gdept 0 gridtype T temp read_ncdf votemper 00101 00131 file file plt temp landscape if keyword_set image then saveimage tst_plt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 plt temp 2 31 int 5 nocontour format i3 if keyword_set image then saveimage tst_plt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 plt temp 2 31 int 1 color_c if keyword_set image then saveimage tst_plt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 plt temp 2 31 int 1 nofill c_thick 1 coast_thick 2 if keyword_set image then saveimage tst_plt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 plt temp cell_fill 1 jpi EQ 180 we must use cell_fill 2 for ORCA2 if keyword_set image then saveimage tst_plt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 zoom IF key_onearth THEN box 40 375 20 20 ELSE box jpi 4 3 jpi 4 jpj 4 3 jpj 4 plt temp boxzoom box landscape if keyword_set image then saveimage tst_plt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 projections IF key_onearth THEN BEGIN plt temp boxzoom 20 380 60 90 stereo map 90 0 0 portrait if keyword_set image then saveimage tst_plt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 plt temp boxzoom 20 380 90 50 ortho map 90 180 0 portrait if keyword_set image then saveimage tst_plt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 plt temp ortho map 0 0 21 portrait realcont if keyword_set image then saveimage tst_plt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 ENDIF deep plot domdef 150 150 warning message domdef gdept jpk 2 gdept jpk 2 gridtype T temp read_ncdf votemper 00101 00131 file file plt temp realcont 2 key_onearth land if keyword_set image then saveimage tst_plt_ image _ string cnt format i2 2 png png cnt cnt 1 return end"); a[179] = new Array("./Tests/tst_pltt.html", "tst_pltt.pro", "", " file_comments categories keyword IMAGE examples To run test with Levitus temperature on a regular 1x1 grid : IDL tst_initlev IDL tst_pltt history Sebastien Masson version Id: tst_pltt pro 371 2008 08 07 09:32:02Z pinsard PRO tst_pltt IMAGE image compile_opt idl2 strictarrsubs cm_4mesh cm_4cal figure 2: regular grid CASE jpi key_stride 0 jpj key_stride 1 OF 180 148:file Levitus98_1m_01_12_Temperature_Pot_ORCA2 nc 360 180:file Levitus98_1m_01_12_Temperature_Pot_1x1 nc 720 510:file Levitus98_1m_01_12_Temperature_Pot_ORCA05 nc ENDCASE file isafile file title Where is file lookalldir IF size file type NE 7 THEN return dummy cnt 1 1 1 xt plot IF key_onearth THEN domdef 20 380 1 1 0 gdept 0 ELSE domdef min glamt max glamf jpj 2 1 jpj 2 1 0 gdept 0 temp read_ncdf votemper 00101 01231 file file IF key_forgetold THEN help temp arr ELSE help temp tab help jpt time pltt temp if keyword_set image then saveimage tst_pltt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 pltt temp nocontour if keyword_set image then saveimage tst_pltt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 pltt temp color_c if keyword_set image then saveimage tst_pltt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 pltt temp nofill if keyword_set image then saveimage tst_pltt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 equatorial plot IF key_onearth THEN BEGIN a abs gphit 0 yind where a EQ min a domdef 20 380 yind 0 yind n_elements yind 1 gdept 10 jpk 1 gdept 10 jpk 1 gridtype T yindex ENDIF ELSE BEGIN domdef min glamt max glamf jpj 2 jpj 2 gdept 10 jpk 1 gdept 10 jpk 1 gridtype T yindex ENDELSE temp read_ncdf votemper 00101 01231 file file IF key_forgetold THEN help temp arr ELSE help temp tab pltt temp if keyword_set image then saveimage tst_pltt_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 yt plot along the column that contain the largest latitude IF key_onearth THEN BEGIN ind where gphit EQ max gphit ind ind 0 MOD jpi domdef ind ind 90 90 gdept 0 gdept 0 gridtype T xindex ENDIF ELSE BEGIN domdef jpi 2 jpi 2 min gphit max gphif gdept 0 gdept 0 gridtype T xindex ENDELSE temp read_ncdf votemper 00101 01231 file file IF key_forgetold THEN help temp arr ELSE help temp tab pltt temp if keyword_set image then saveimage tst_pltt_ image _ string cnt format i2 2 png png cnt cnt 1 return end"); a[180] = new Array("./Tests/tst_pltz.html", "tst_pltz.pro", "", " file_comments categories keyword IMAGE examples To run test with Levitus temperature on a regular 1x1 grid : IDL tst_initlev IDL tst_pltz history Sebastien Masson version Id: tst_pltz pro 371 2008 08 07 09:32:02Z pinsard PRO tst_pltz IMAGE image compile_opt idl2 strictarrsubs cm_4mesh IF jpk EQ 1 THEN return dummy cnt 1 CASE jpi key_stride 0 jpj key_stride 1 OF 180 148:file Levitus98_1m_01_12_Temperature_Pot_ORCA2 nc 360 180:file Levitus98_1m_01_12_Temperature_Pot_1x1 nc 720 510:file Levitus98_1m_01_12_Temperature_Pot_ORCA05 nc ENDCASE file isafile file title Where is file lookalldir IF size file type NE 7 THEN return IF key_onearth THEN domdef 20 380 1 1 0 max gdept ELSE domdef min glamt max glamf jpj 2 1 jpj 2 1 0 max gdept temp read_ncdf votemper 00101 00131 file file IF key_forgetold THEN help temp arr ELSE help temp tab pltz temp portrait if keyword_set image then saveimage tst_pltz_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 pltz temp portrait nocontour if keyword_set image then saveimage tst_pltz_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 pltz temp portrait color_c if keyword_set image then saveimage tst_pltz_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 pltz temp portrait nofill if keyword_set image then saveimage tst_pltz_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 pltz temp boxzoom 6000 if keyword_set image then saveimage tst_pltz_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 pltz temp boxzoom 6000 zoom 1000 if keyword_set image then saveimage tst_pltz_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 pltz temp boxzoom 6000 zoom 1000 yxaspect 2 if keyword_set image then saveimage tst_pltz_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 pltz temp boxzoom 6000 zoom 1000 yxaspect 2 zratio 5 if keyword_set image then saveimage tst_pltz_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 yt plot along the column that contain the largest latitude IF key_onearth THEN BEGIN ind where gphit EQ max gphit ind ind 0 MOD jpi domdef ind ind 90 90 0 max gdept gridtype T xindex ENDIF ELSE BEGIN domdef jpi 2 jpi 2 min gphit max gphif 0 max gdept gridtype T xindex ENDELSE temp read_ncdf votemper 00101 01231 file file pltz temp boxzoom 6000 zoom 1000 yxaspect 2 zratio 5 if keyword_set image then saveimage tst_pltz_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 oblique sections IF key_onearth THEN endpoints 110 45 290 45 ELSE endpoints jpi 6 jpj 3 5 jpi 6 2 jpj 3 domdef endpoints endpoints type pltz temp read_ncdf votemper 00101 00131 file file pltz temp endpoints endpoints if keyword_set image then saveimage tst_pltz_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 false oblique sections IF key_onearth THEN endpoints 180 70 180 90 ELSE endpoints jpi 2 0 25 0 25 jpi 2 0 25 jpj domdef 6000 endpoints endpoints type pltz temp read_ncdf votemper 00101 00131 file file pltz temp endpoints endpoints boxzoom 6000 zoom 1000 yxaspect 2 zratio 5 showbuild if keyword_set image then saveimage tst_pltz_ image _ string cnt format i2 2 png png ELSE read dummy prompt press return for the next plot cnt cnt 1 comparison between real section and false oblique sections IF where gphit EQ 0 0 NE 1 THEN BEGIN IF key_onearth THEN box 20 380 0 0 0 6000 ELSE box 0 jpi 1 jpj 2 jpj 2 0 6000 domdef box gridtype T temp read_ncdf votemper 00101 00131 file file pltz temp boxzoom 6000 portrait small 1 2 1 zoom 500 zratio 5 IF key_onearth THEN endpoints 20 0 380 0 ELSE endpoints 0 jpj 2 jpi 1 jpj 2 domdef 6000 endpoints endpoints type pltz gridtype T temp read_ncdf votemper 00101 00131 file file pltz temp endpoints endpoints boxzoom 6000 zoom 500 zratio 5 small 1 2 2 noerase if keyword_set image then saveimage tst_pltz_ image _ string cnt format i2 2 png png cnt cnt 1 ENDIF return end"); a[181] = new Array("./Textoidl/matchdelim.html", "matchdelim.pro", "", " file_comments Match open close delimiters in a string categories Text String param INSTRING in required type string a string containing an open delimiter e g in which you want to find the matching closing delimiter e g param OPENPOS in optional Set to a named variable to receive the position of the first opening delimiter keyword OPEN_DELIM default A single character containing the opening delimiter e g keyword CLOSE_DELIM default A single character containing the closing delimiter e g returns uses restrictions Any pair of nonidentical characters can be used as delimiters examples matchdelim one two three returns 9 the character just before three history Log: matchdelim pro v Revision 1 3 1996 06 14 20:00:27 mcraig Updated Copyright info Revision 1 2 1996 05 09 00:22:17 mcraig Removed restriction that open delim must be first char Added argument to allow for return of position of open delim Revision 1 1 1996 01 31 18:41:06 mcraig Initial revision Copyright C 1996 The Regents of the University of California All Rights Reserved Written by Matthew W Craig See the file COPYRIGHT for restrictions on distrubting this code This code comes with absolutely NO warranty see DISCLAIMER for details version Id: matchdelim pro 325 2007 12 06 10:04:53Z pinsard FUNCTION matchdelim InString OpenPos OPEN_DELIM OpenDelim CLOSE_DELIM CloseDelim HELP Help compile_opt idl2 strictarrsubs Return to caller if error On_error 2 IF n_params LT 1 OR keyword_set Help THEN BEGIN offset print offset Match open close delimiters in a string print offset position matchdelim strn openpos print offset Inputs: print offset offset strn a string containing an open in print offset offset delimiter e g in which you print offset offset want to find the matching closing print offset offset delimiter e g print offset Keywords: print offset offset OPEN_DELIM A single character containing the opening in print offset offset delimiter e g Default is print offset offset CLOSE_DELIM A single character containing the closing in print offset offset delimiter e g Default is print offset Outputs: print offset offset position returns the position in strn of the out print offset offset closing delimiter 1 if no closing found print offset offset openpos Set to a named variable to receive the out print offset offset position of the first opening delimiter print offset offset Optional print offset Example: print offset offset matchdelim a one two three returns 10 the character just print offset offset before three print offset offset a matchdelim aaa bbb ccc ddd eee f OP CL print offset offset returns a 12 just before ddd f 3 just before bbb return 1 ENDIF Set default delimiters IF n_elements OpenDelim EQ 0 THEN OpenDelim IF n_elements CloseDelim EQ 0 THEN CloseDelim Make sure InString has more than 1 character length strlen InString IF length LE 1 THEN return 1 Return if no open delimiter OpenPos strpos InString OpenDelim IF OpenPos EQ 1 THEN BEGIN print Error: No opening delimiter return 1 ENDIF Convert strings to array of integers to speed processing OpenDelim fix byte OpenDelim 0 CloseDelim fix byte CloseDelim 0 TmpStr fix byte strmid InString OpenPos length Leave the 1 in here This forces conversion from BYTE to INTEGER necessary because there are no negative BYTEs TmpStr TmpStr EQ OpenDelim 1 TmpStr EQ CloseDelim length n_elements TmpStr Initialize count of number of delimiters We ve found one the first opener BraceCnt 1 i 0 WHILE BraceCnt GT 0 AND i LT length 1 DO BEGIN i i 1 BraceCnt BraceCnt TmpStr i ENDWHILE i i OpenPos IF BraceCnt GT 0 THEN i 1 return i END "); a[182] = new Array("./Textoidl/nexttok.html", "nexttok.pro", "", " NAME: NEXTTOK PURPOSE: Find the next occurance of any of a set of characters in a string and return the character which occurs next CATEGORY: text strings CALLING SEQUENCE: tok nexttok strn tokens INPUTS: strn string to be searched for sub superscripts in tokens string containing characters to be found in KEYWORD PARAMETERS: POSITION Set to a named variable to get position out of next token or 1 if none found HELP Print useful message and exit OUTPUTS: tok Contains the character among tokens which out occurs next in strn or null if none found COMMON BLOCKS: SIDE EFFECTS: NOTES: EXAMPLE: nexttok x 2 N_j 3 _ position pos returns and sets pos to 1 MODIFICATION HISTORY: Id: nexttok pro 134 2006 07 07 10:19:08Z navarro Log: nexttok pro v Revision 1 4 2004 06 15 17:25:54 mcraig Fixed bug in regular expression changed array notation to square brackets Revision 1 3 1996 06 14 20:00:27 mcraig Updated Copyright info Revision 1 2 1996 05 09 00:22:17 mcraig Generalized so that the next occurence of any of a set of characters will be returned Revision 1 1 1996 01 31 18:41:06 mcraig Initial revision RELEASE: Name: Rel_2_1_2 COPYRIGHT: Copyright C 1996 The Regents of the University of California All Rights Reserved Written by Matthew W Craig See the file COPYRIGHT for restrictions on distrubting this code This code comes with absolutely NO warranty see DISCLAIMER for details FUNCTION nexttok strn tokens POSITION position HELP Help compile_opt idl2 strictarrsubs Return to caller on error On_error 2 Help those in need of it IF n_params NE 2 OR keyword_set Help THEN BEGIN offset print offset Find the next occurance of any of a set of characters in a print offset string and return the character which occurs next CALLING SEQUENCE: print offset tok nexttok strn tokens INPUTS: print offset Inputs: print offset offset strn string to be searched for sub superscripts in print offset offset tokens string containing characters to be found in KEYWORD PARAMETERS: print offset Keywords: print offset offset POSITION Set to a named variable to get position out print offset offset of next token or 1 if none found print offset offset HELP Print useful message and exit OUTPUTS: print offset Outputs: print offset offset tok Contains the character among tokens which out print offset offset occurs next in strn or null if none found EXAMPLE: print offset Example: print offset offset nexttok x 2 N_j 3 _ position pos returns and sets print offset offset pos to 1 return ENDIF TmpStr byte strn TmpTok byte tokens NumToks n_elements TmpTok MatchIdx 0L Matches 0L FOR j 0 NumToks 1 DO BEGIN TmpMatch where TmpStr EQ TmpTok j TmpCnt IF TmpCnt GT 0 THEN BEGIN MatchIdx MatchIdx Replicate j TmpCnt Matches Matches TmpMatch ENDIF ENDFOR IF n_elements MatchIdx EQ 1 THEN BEGIN Position 1 return ENDIF MatchIdx MatchIdx 1: Matches Matches 1: SortInd sort Matches Position Matches SortInd 0 Tok string TmpTok MatchIdx SortInd 0 return Tok END "); a[183] = new Array("./Textoidl/showtex.html", "showtex.pro", "", " NAME: SHOWTEX PURPOSE: Display TeX sequence translation table on current graphics device CATEGORY: text strings CALLING SEQUENCE: showtex INPUTS: KEYWORD PARAMETERS: HELP print out info on use of the function and exit FONT Set to 0 to use hardware font 1 to use vector Note that the only hardware font supported is Postscript OUTPUTS: COMMON BLOCKS: SIDE EFFECTS: Plot is created NOTES: Hardware fonts are supported only for device PS PostScript EXAMPLE: MODIFICATION HISTORY: Id: showtex pro 325 2007 12 06 10:04:53Z pinsard Log: showtex pro v Revision 1 4 2004 06 15 17:25:54 mcraig Fixed bug in regular expression changed array notation to square brackets Revision 1 3 1996 06 14 20:00:27 mcraig Updated Copyright info Revision 1 2 1996 05 09 00:22:17 mcraig Added error handling and updated built in help Revision 1 1 1996 02 08 18:55:12 mcraig Initial revision RELEASE: Name: Rel_2_1_2 COPYRIGHT: Copyright C 1996 The Regents of the University of California All Rights Reserved Written by Matthew W Craig See the file COPYRIGHT for restrictions on distrubting this code This code comes with absolutely NO warranty see DISCLAIMER for details PRO showtex FONT fnt HELP help compile_opt idl2 strictarrsubs Return to caller on error On_error 2 Print help if needed IF keyword_set help THEN BEGIN print Display TeX sequence translation table on current graphics device print showtex print Keywords: print HELP print this message and return print FONT set to 0 to use hardware fonts for current device print 1 to use vector fonts DEFAULT print NOTES: The only hardware font supported is PostScript print The FONT keyword overrides the font selected in p font return ENDIF We begin by deciding on the font PostScript 0 means use vector PostScript 0 PlotTitle Vector Fonts IF n_elements fnt EQ 0 THEN BEGIN get font from p font IF P font NE 1 THEN BEGIN User wants hardware font PostScript 1 PlotTitle PostScript Fonts ENDIF ENDIF ELSE BEGIN get font from FONT keyword IF fnt NE 1 THEN BEGIN PostScript 1 PlotTitle PostScript Fonts ENDIF ENDELSE Bomb out if user wants hardware font for non PostScript device IF PostScript EQ 1 AND strupcase D name NE PS THEN BEGIN Device isn t postscript and user wants hardware font Not good print Warning: No translation for device: D name return ENDIF Set P font to value indicated by FONT keyword saving surrent setting to reset at end OldPFont p font p font PostScript 1 erase seq textoidl tex DisplayString seq textoidl seq nseq n_elements seq nrows nseq 5 1 Five sequences per row dx 9 5 dy 9 nrows y 95 xyouts 5 y PlotTitle align 5 norm size 2 5 count 0 FOR i 1L nrows DO BEGIN y y dy x 1 FOR j 1 5 DO BEGIN IF count LT nseq THEN xyouts x y DisplayString count align 5 norm count count 1 x x dx ENDFOR ENDFOR Restore old P font p font OldPFont END"); a[184] = new Array("./Textoidl/str_token.html", "str_token.pro", "", " NAME: STR_TOKEN PURPOSE: Retrieve portion of string up to token CATEGORY: text strings CALLING SEQUENCE: new str_token old token INPUTS: old String to be split Contains text after in out token on output token Token to use in splitting old in KEYWORD PARAMETERS: TRIM set to remove leading blanks from old before returning HELP print useful message and exit OUTPUTS: new portion of string up to token out old portion of old after token out in COMMON BLOCKS: SIDE EFFECTS: Input parameter old is modified NOTES: Token may be one or more characters If token is not found returns old and sets old to EXAMPLE: If old is foo44 bar then str_token old 44 would return foo and upon return old will be left with bar If TRIM were set old would be bar on return If old xyz then new str_token old a would return with new xyz and old THANKS: To D Linder who wrote GETTOK part of the goddard library upon which this is based MODIFICATION HISTORY: Id: str_token pro 163 2006 08 29 12:59:46Z navarro Log: str_token pro v Revision 1 1 2000 06 14 19:09:22 mcraig Changed name of strtok str_token to avoid conflict in IDL 5 3 Revision 1 3 1996 06 14 20:00:27 mcraig Updated Copyright info Revision 1 2 1996 05 09 00:22:17 mcraig Added built in help Revision 1 1 1996 01 31 18:47:37 mcraig Initial revision RELEASE: Name: Rel_2_1_2 COPYRIGHT: Copyright C 1996 The Regents of the University of California All Rights Reserved Written by Matthew W Craig See the file COPYRIGHT for restrictions on distrubting this code This code comes with absolutely NO warranty see DISCLAIMER for details FUNCTION str_token string token TRIM trim HELP Help compile_opt idl2 strictarrsubs Back to the caller if error occurs On_error 2 IF n_params NE 2 OR keyword_set Help THEN BEGIN offset print offset Retrieve portion of string up to token print offset new str_token old token print offset Inputs: print offset offset old String to be split Contains text after in out print offset offset token on output print offset offset token Token to use in splitting old in print offset Keywords: print offset offset TRIM set to remove leading blanks from old print offset offset before returning print offset offset HELP print useful message and exit print offset Outputs: print offset offset new portion of string up to token out print offset offset old portion of old after token out in print offset Side effects: print offset offset Input parameter old is modified print offset Notes: print offset offset Token may be one or more characters print offset offset If token is not found returns old and sets old to print offset Examples: print offset offset If old is foo44 bar then str_token old 44 would return print offset offset foo and upon return old will be left with bar If TRIM print offset offset were set old would be bar on return print offset offset If old xyz then new str_token old a would return with print offset offset new xyz and old return 1 ENDIF pos strpos string token IF pos GE 0 THEN BEGIN front strmid string 0 pos string strmid string pos strlen token strlen string IF keyword_set trim THEN string strtrim string 1 return front ENDIF front string string return front END "); a[185] = new Array("./Textoidl/strcnt.html", "strcnt.pro", "", " file_comments Count number of occurrences of a substring in a string categories Text String param STRN in required type string The string in which to count occurences param SUBSTRN in required type string The substring to count occurrences of param STARTPOS in required The position at which to begin the search If not supplied start at beginning of string keyword HELP Print useful message and return returns Number of occurances of substring in string restrictions Overlapping occurances are not counted separately For example counting occurances of bb in blah bbb returns one occurance history Log: strcnt pro v Revision 1 3 1996 06 14 20:00:27 mcraig Updated Copyright info Revision 1 2 1996 05 09 00:22:17 mcraig Added fast processing using BYTE arrays if we are counting occurences of a single character Added error handling Revision 1 1 1996 01 31 18:47:37 mcraig Initial revision Copyright C 1996 The Regents of the University of California All Rights Reserved Written by Matthew W Craig See the file COPYRIGHT for restrictions on distrubting this code This code comes with absolutely NO warranty see DISCLAIMER for details version Id: strcnt pro 325 2007 12 06 10:04:53Z pinsard FUNCTION strcnt strn substrn startpos HELP Help compile_opt idl2 strictarrsubs Return to caller if error On_error 2 Help user if needed IF n_params LT 2 OR keyword_set Help THEN BEGIN offset print offset Count number of occurrences of a substring in a string print offset num strcnt strn substring pos print offset Inputs: print offset offset string The string in which to count occurences in print offset offset substring The substring to count occurrences of in print offset offset pos the position at which to begin the search in print offset offset If not supplied start at beginning of print offset offset string print offset Keywords: print offset offset HELP Print useful message and return print offset Outputs: print offset offset num Number of occurances of substring in string out return 1 ENDIF IF n_params EQ 2 THEN startpos 0 return if we weren t really given a substring to search for IF strlen substrn EQ 0 THEN BEGIN print Error: Can t count occurances of null string return 1 ENDIF or if we were told to start at the end of the string tmpstrn strmid strn startpos strlen strn IF strlen tmpstrn EQ 0 THEN return 0 If looking for occurences of single character process using BYTE array IF strlen substrn EQ 1 THEN BEGIN tmpstrn byte TmpStrn count n_elements where TmpStrn EQ byte substrn 0 ENDIF ELSE BEGIN count 0L pos rstrpos tmpstrn substrn WHILE pos GE 0 DO BEGIN count count 1 pos rstrpos tmpstrn substrn pos ENDWHILE ENDELSE return count END "); a[186] = new Array("./Textoidl/strtrans.html", "strtrans.pro", "", " NAME: STRTRANS PURPOSE: Translate all occurences of one substring to another CATEGORY: text strings CALLING SEQUENCE: new strtrans oldstr from to ned INPUTS: oldstr string on which to operate in May be an array from substrings to be translated May be in an array to what strings in from should be in translated to May be an array KEYWORD PARAMETERS: HELP Set this to print useful message and exit OUTPUTS: new Translated string Array if oldstr is out an array ned number of substitutions performed in out oldstr Array if oldstr is an array COMMON BLOCKS: SIDE EFFECTS: NOTES: Any of old from and to can be arrays from and to must have the same number of elements EXAMPLE: inp Many bad chars in_here from _ to out strtrans inp from to ned Will produce out Many bad chars in here and set ned to 4 MODIFICATION HISTORY: Id: strtrans pro 325 2007 12 06 10:04:53Z pinsard Log: strtrans pro v Revision 1 7 2004 06 15 17:25:54 mcraig Fixed bug in regular expression changed array notation to square brackets Revision 1 6 2004 01 11 01:49:00 mcraig Changed format of one array to newer style to avoidf conflict with function name in astro library Revision 1 5 2001 11 23 21:14:35 mcraig Added keywords EXTRACT PRESERVE_NULL REGEX to call to strsplit This comes very close to reproducing the behavior of the obsolete routine str_sep Revision 1 4 2001 11 21 19:13:23 mcraig Changed str_sep to strsplit The former is now considered obsolete by RSI Revision 1 3 1996 06 14 20:00:27 mcraig Updated Copyright info Revision 1 2 1996 05 09 00:22:17 mcraig Sped up significantly by using str_sep to handle the translation No longer relies on routines fromother user libraries Revision 1 1 1996 01 31 18:47:37 mcraig Initial revision RELEASE: Name: Rel_2_1_2 COPYRIGHT: Copyright C 1996 The Regents of the University of California All Rights Reserved Written by Matthew W Craig See the file COPYRIGHT for restrictions on distrubting this code This code comes with absolutely NO warranty see DISCLAIMER for details FUNCTION strtrans InputString from to ned HELP Help compile_opt idl2 strictarrsubs Bomb out to caller if error On_error 2 Offer help if we don t have at least InputString from and to or if the user asks for it IF n_params LT 3 OR keyword_set help THEN BEGIN offset print offset Translate all occurences of one substring to another print offset new strtrans oldstr from to ned print offset Inputs: print offset offset oldstr string on which to operate in print offset offset May be an array print offset offset from substrings to be translated May be in print offset offset an array print offset offset to what strings in from should be in print offset offset translated to May be an array print offset Outputs: print offset offset new Translated string Array if oldstr is out print offset offset an array print offset offset ned number of substitutions performed in out print offset offset oldstr Array if oldstr is an array print offset Notes: print offset offset Any of old from and to can be arrays print offset offset from and to must have the same number of elements return 1 ENDIF strn InputString Check that From To have same number of elements RETURN if they don t NFrom n_elements from NTo n_elements to IF NFrom EQ 0 OR NTo EQ 0 THEN return strn IF NFrom NE NTo THEN BEGIN print Error: Number of elements in from to unequal return 1 ENDIF Make sure there are no null strings in From RETURN if there are FromLen strlen From IF total FromLen EQ 0 GT 0 THEN BEGIN print Error: elements of From must have nonzero length return 1 ENDIF NStrings n_elements strn ned lonarr NStrings tmpned 0L Say strn a b c from and to Then the approach here is to first split strn at all occurances of then recombine the pieces with inserted instead Do this for all elements of strn and all elements of from FOR i 0L NStrings 1 DO BEGIN ned i 0L FOR j 0L NFrom 1 DO BEGIN SepStr strsplit strn i from j EXTRACT REGEX PRESERVE_NULL NSubs n_elements SepStr 1 strn i SepStr 0 FOR k 1L NSubs DO strn i strn i To j SepStr k ned i ned i NSubs ENDFOR ENDFOR return strn END "); a[187] = new Array("./Textoidl/sub_sup_idl.html", "sub_sup_idl.pro", "", " NAME: SUB_SUP_IDL PURPOSE: Return the proper IDL font positioning command for TeX sub superscripts CATEGORY: CALLING SEQUENCE: fnt sub_sup_idl strn INPUTS: strn Either or _ the TeX super subscript in characters KEYWORD PARAMETERS: FORCE_UD Set this to use U D instead of E I for sub superscripts OUTPUTS: fnt Either U or E for superscripts out or D or I for subscripts COMMON BLOCKS: SIDE EFFECTS: NOTES: EXAMPLE: LIBRARY FUNCTIONS CALLED: MODIFICATION HISTORY: Id: sub_sup_idl pro 327 2007 12 13 16:22:35Z pinsard Log: sub_sup_idl pro v Revision 1 1 1996 01 31 18:47:37 mcraig Initial revision RELEASE: Name: Rel_2_1_2 FUNCTION sub_sup_idl token FORCE_UD force_ud compile_opt idl2 strictarrsubs IF keyword_set force_ud THEN BEGIN IF token EQ THEN return U IF token EQ _ THEN return D return ENDIF ELSE BEGIN IF token EQ THEN return E IF token EQ _ THEN return I return ENDELSE END"); a[188] = new Array("./Textoidl/textable.html", "textable.pro", "", " file_comments Returns a translation table from TeX to IDL categories Text String keyword POSTSCRIPT If set return postscript translation table rather than vector fonts table Default is translations for vector fonts keyword HELP Print help and exit keyword VECTOR returns a 2D text array table 0 contains the words to be translated away table 1 contains the words to translate them to restrictions To find out what TeX sequences are available look at table 0 history Log: textable pro v Revision 1 8 2004 06 15 17:25:54 mcraig Fixed bug in regular expression changed array notation to square brackets Revision 1 7 1996 07 22 23:56:08 mcraig Added vartheta Revision 1 6 1996 07 12 21:31:42 mcraig Fixed varphi in vector font added circ Revision 1 5 1996 06 14 20:00:27 mcraig Updated Copyright info Revision 1 4 1996 05 09 00:22:17 mcraig Added command to return to previous font after switching to Greek or symbol font Revision 1 3 1996 02 08 19:49:35 mcraig Removed control sequence perp because the postscript code for it is Revision 1 2 1996 02 08 18:53:38 mcraig Added translations for PostScript fonts and added several new TeX control sequences Revision 1 1 1996 01 31 18:47:37 mcraig Initial revision Copyright C 1996 The Regents of the University of California All Rights Reserved Written by Matthew W Craig See the file COPYRIGHT for restrictions on distrubting this code This code comes with absolutely NO warranty see DISCLAIMER for details version Id: textable pro 325 2007 12 06 10:04:53Z pinsard FUNCTION textable POSTSCRIPT ps VECTOR vec HELP Help compile_opt idl2 strictarrsubs Return to caller if error On_error 2 Print help if necessary IF keyword_set Help THEN BEGIN offset print offset Returns a translation table from TeX to IDL print offset table textable print offset Keywords: print offset offset POSTSCRIPT If set return postscript translation print offset offset table rather than vector fonts table print offset offset Default is translations for vector print offset offset fonts print offset offset HELP Print help and exit print offset Outputs: print offset offset table a 2D text array table 0 contains out print offset offset the words to be translated away table 1 print offset offset contains the words to translate them to print offset Notes: print offset offset To find out what TeX sequences are available look at print offset offset table 0 ENDIF VECFONT 1 index of vector font in translation table PSFONT 2 index of postscript font in trans table IF keyword_set ps THEN FontSelection PSFONT ELSE FontSelection VECFONT Set IDL font sequence needed to switch to Greek letters GreekFont strarr 3 GreekFont VECFONT 7 GreekFont PSFONT M Set IDL font sequence needed to switch to special symbol font SymbolFont strarr 3 SymbolFont VECFONT M SymbolFont PSFONT M Set IDL font sequence needed to switch back to initial font PreviousFont strarr 3 PreviousFont VECFONT X PreviousFont PSFONT X lowercase Greek Note there is some trickery involved in getting varphi to work in the vector fonts because it is actually a member of the symbol font set not the Greek font set Go figure Solution is just to make the vector character a switch to symbol the proper character from that font and a switch back out of symbol Same comment holds for vartheta TeX SEQUENCE VECTOR POSTSCRIPT LowercaseGreek alpha a a beta b b gamma c g delta d d epsilon e e zeta f z eta g h theta h q iota i i kappa j k lambda k l mu l m nu m n xi n S Rx pi p p rho q r sigma r s tau s t upsilon t u phi u f chi v c psi w y omega x w varpi p v varepsilon e e varphi SymbolFont VECFONT P PreviousFont VECFONT j vartheta SymbolFont VECFONT t PreviousFont VECFONT J Uppercase Greek TeX SEQUENCE VECTOR POSTSCRIPT UppercaseGreek Gamma C G Delta D D Theta H Q Lambda K L Xi N S RX Pi P P Sigma R S Upsilon T string byte 161 Phi U F Psi W Y Omega X W Special symbols NOTES You must leave infty before in in the translation table to avoid having the in part of infty translated away DO NOT blindly add the control sequence perp Its PostScript code is which leads to thing being interpreted as superscripts which shouldn t be TeX SEQUENCE VECTOR POSTSCRIPT Symbols aleph string byte 192 ast cap 3 string byte 199 cdot string byte 215 cup 1 string byte 200 exists E infty string byte 165 in e string byte 206 equiv : string byte 186 pm string byte 177 div string byte 184 subset 0 string byte 204 superset 2 string byte 201 leftarrow 4 string byte 172 downarrow 5 string byte 175 rightarrow 6 string byte 174 uparrow 7 string byte 173 neq string byte 185 propto string byte 181 sim A string byte 126 partial D string byte 182 nabla G string byte 209 angle a string byte 208 times X string byte 180 geq b string byte 179 leq l string byte 163 string byte 162 prime string byte 162 circ string byte 176 LowercaseGreek 1 GreekFont FontSelection LowercaseGreek FontSelection PreviousFont FontSelection UppercaseGreek 1 GreekFont FontSelection UppercaseGreek FontSelection PreviousFont FontSelection Symbols 1 SymbolFont FontSelection Symbols FontSelection PreviousFont FontSelection TranslationTable LowercaseGreek UppercaseGreek Symbols return TranslationTable 0:1 END "); a[189] = new Array("./Textoidl/textoidl.html", "textoidl.pro", "", " file_comments Convert a valid TeX string to a valid IDL string for plot labels categories Text String param INPUTSTRING in required TeX string to be converted Will not be modified old may be a string array keyword FONT Set to 0 to use hardware font 1 to use vector Note that the only hardware font supported is PostScript keyword TEX_SEQUENCES return the available TeX sequences keyword HELP print out info on use of the function and exit restrictions Use the procedure SHOWTEX to get a list of the available TeX control sequences The only hardware font for which translation is available is PostScript The only device for which hardware font translation is available is PostScript The FONT keyword overrides the font selected by p font examples IDL out TeXtoIDL Gamma 2 5N_ ed The string out may be used in XYOUTS or other IDL text display routines It will be an uppercase Gamma with an exponent of 2 then a plus sign then an N with the subscript ed history Log: textoidl pro v Revision 1 7 2004 06 15 17:25:54 mcraig Fixed bug in regular expression changed array notation to square brackets Revision 1 6 2004 01 11 01:49:00 mcraig Changed format of one array to newer style to avoidf conflict with function name in astro library Revision 1 5 2001 11 23 21:10:55 mcraig Added backslash to tex sequences in translation table to protect them during regexp search in strsplit Revision 1 4 1996 06 14 20:00:27 mcraig Updated Copyright info Revision 1 3 1996 05 09 00:22:17 mcraig Added error handling cleaned up documentation Revision 1 2 1996 02 08 18:52:50 mcraig Added ability to use hardware fonts for PostScript device Revision 1 1 1996 01 31 18:47:37 mcraig Initial revision Copyright C 1996 The Regents of the University of California All Rights Reserved Written by Matthew W Craig See the file COPYRIGHT for restrictions on distrubting this code This code comes with absolutely NO warranty see DISCLAIMER for details version Id: textoidl pro 372 2008 08 08 12:31:53Z pinsard FUNCTION textoidl InputString FONT fnt HELP hlp TEX_SEQUENCES tex_seq compile_opt idl2 strictarrsubs Return to caller if there is an error On_error 2 We begin by deciding on the font PostScript 0 means use vector PostScript 0 IF n_elements fnt EQ 0 THEN BEGIN get font from p font IF p font NE 1 THEN BEGIN User wants hardware font PostScript 1 ENDIF ENDIF ELSE BEGIN get font from FONT keyword IF fnt NE 1 THEN PostScript 1 ENDELSE Bomb out if user wants non PostScript hardware font IF PostScript EQ 1 AND d name NE PS THEN BEGIN Device isn t postscript and user wants hardware font Not good print Warning: No translation for device: d name return InputString ENDIF IF keyword_set tex_seq THEN BEGIN table textable return table 0 ENDIF IF keyword_set hlp OR n_params EQ 0 THEN BEGIN print Convert a TeX string to an IDL string print new TeXtoIDL old print old TeX string to translate in print new resulting IDL string out print Keywords: print FONT set to 1 to translate for vector fonts print DEFAULT Set to 0 to translate for print hardware font print TEX_SEQUENCES return the available TeX sequences print HELP print this message and exit print NOTES: print Use SHOWTEX to obtain a list of the available print TeX control sequences print old may be a string array If so new is too print The only device for which hardware font print translation is available is PostScript print The FONT keyword overrides the font selected print by p font return 1 ENDIF PostScript has been set to 1 if PostScript fonts are desired strn InputString table textable POSTSCRIPT PostScript Greek sub superscripts need to be protected by putting braces around them if they are unbraced This will have the result the it will be difficult to use as a sub superscript Get over it V2 11 Must include the in from of translation table TeX sequences to ensure that strsplit properly treats the in the TeX sequence Since strsplit is doing a regexp replace and is special in regexps need to escape it strn strtrans strn table 0 table 0 strn strtrans strn _ table 0 _ table 0 First we translate Greek letters and the like This makes guessing alignment of sub superscripts easier as all special characters will then be one character long V2 11 Must include the in from of translation table TeX sequences to ensure that strsplit properly treats the in the TeX sequence Since strsplit is doing a regexp replace and is special in regexps need to escape it strn strtrans strn table 0 table 1 FOR i 0L n_elements strn 1 DO BEGIN strn i translate_sub_super strn i Take care of sub superscripts ENDFOR return strn END "); a[190] = new Array("./Textoidl/translate_sub_super.html", "translate_sub_super.pro", "", " file_comments Return the proper IDL font positioning command for TeX sub superscripts categories Text String param TOKEN Either or _ the TeX super subscript characters keyword FORCE_UD Set this to use U D instead of E I for sub superscripts returns Either U or E for superscripts or D or I for subscripts uses restrictions Make sure sub_sup_idl stays before translate_sub_super At least for now when IDL encounters a function and automatically compiles it it only compiles the functions in the file up to the named function So even if sub_sup_idl was declared with FORWARD_FUNCTION in translate_sub_super it would not properly compile The file translate_sub_super pro contains two functions translate_sub_super and sub_sup_idl The former is the generic routine for processing TeX sub superscripts the latter is used only by translate_sub_super and has no general utility Hence it lives here You will see documentation for translate_sub_super second if you use DOC_LIBRARY Used only by translate_sub_super Should be kept in same file examples history Log: translate_sub_super pro v Revision 1 5 2000 06 14 19:09:22 mcraig Changed name of strtok str_token to avoid conflict in IDL 5 3 Revision 1 4 1996 06 14 20:00:27 mcraig Updated Copyright info Revision 1 3 1996 05 09 00:22:17 mcraig Changed some function calls to reflect changes in those functions moved some code out of the main loop that didn t need to be there added documentation Revision 1 1 1996 01 31 18:47:37 mcraig Initial revision Copyright C 1996 The Regents of the University of California All Rights Reserved Written by Matthew W Craig See the file COPYRIGHT for restrictions on distrubting this code This code comes with absolutely NO warranty see DISCLAIMER for details version Id: translate_sub_super pro 327 2007 12 13 16:22:35Z pinsard FUNCTION sub_sup_idl token FORCE_UD force_ud compile_opt idl2 strictarrsubs provide help if needed IF n_params NE 1 OR keyword_set Help THEN BEGIN offset print offset Return the proper IDL font positioning command for TeX print offset sub superscripts print offset fnt sub_sup_idl strn print offset Inputs: print offset offset strn Either or _ the TeX super subscript in print offset offset characters print offset Keywords: print offset offset FORCE_UD Set this to use U D instead of E I for print offset offset sub superscripts print offset offset HELP Set to print useful message and exit print offset Outputs: print offset offset fnt Either U or E for superscripts out print offset offset or D or I for subscripts return 1 ENDIF IF keyword_set force_ud THEN BEGIN IF token EQ THEN return U IF token EQ _ THEN return D return ENDIF ELSE BEGIN IF token EQ THEN return E IF token EQ _ THEN return I return ENDELSE END NAME: TRANSLATE_SUB_SUPER PURPOSE: Translate TeX sub superscripts to IDL sub superscripts CATEGORY: text strings CALLING SEQUENCE: new translate_sub_super old INPUTS: old string to be translated from TeX to IDL in KEYWORD PARAMETERS: RECURSED set if this function is being called recursively HELP Set to print useful message and exit OUTPUTS: new string old converted from TeX to IDL out COMMON BLOCKS: SIDE EFFECTS: NOTES: For best results when both a sub and superscript are used place the shorter of the two first e g N a _ bbbb is better than N_ bbbb a Single character sub super scripts do not need to be protected by braces Sub superscripts may be nested e g N N_1 N EXAMPLE: out translate_sub_super N 2_ big Then out N U2 N Dbig N which looks like it should on the display LIBRARY FUNCTIONS CALLED: str_token Text string mcraig sub_sup_idl contained in this file MODIFICATION HISTORY: Id: translate_sub_super pro 327 2007 12 13 16:22:35Z pinsard Log: translate_sub_super pro v Revision 1 5 2000 06 14 19:09:22 mcraig Changed name of strtok str_token to avoid conflict in IDL 5 3 Revision 1 4 1996 06 14 20:00:27 mcraig Updated Copyright info Revision 1 3 1996 05 09 00:22:17 mcraig Changed some function calls to reflect changes in those functions moved some code out of the main loop that didn t need to be there added documentation Revision 1 2 1996 02 08 18:54:20 mcraig Changed default sub superscript size to be D U rather than I E to improve readability of plat annotations Revision 1 1 1996 01 31 18:47:37 mcraig Initial revision RELEASE: Name: Rel_2_1_2 COPYRIGHT: Copyright C 1996 The Regents of the University of California All Rights Reserved Written by Matthew W Craig See the file COPYRIGHT for restrictions on distrubting this code This code comes with absolutely NO warranty see DISCLAIMER for details FUNCTION translate_sub_super InputString RECURSED recursed HELP Help compile_opt idl2 strictarrsubs Return to caller if error On_error 2 Offer help if needed and or desired IF n_params NE 1 OR keyword_set help THEN BEGIN offset print offset Translate TeX sub superscripts to IDL sub superscripts print offset new translate_sub_super old print offset Inputs: print offset offset old string to be translated from TeX to IDL in print offset Keywords: print offset offset RECURSED set if this function is being called print offset offset recursively print offset offset HELP Set to print useful message and exit print offset Outputs: print offset offset new string old converted from TeX to IDL out print offset Notes: print offset offset For best results when both a sub and superscript are used print offset offset place the shorter of the two first e g N a _ bbbb is print offset offset better than N_ bbbb a print offset offset Single character sub super scripts do not need to be print offset offset protected by braces print offset offset Sub superscripts may be nested e g N N_1 N return 1 ENDIF To allow for nested scripts use E I instead of U D for scripts when called recursively IF NOT keyword_set recursed THEN ud 1 ELSE ud 0 Return to the normal level after making sub superscript unless we are recursed which indicates we are processing a nested script IF keyword_set recursed THEN fontRestore ELSE fontRestore N Initialize vars for processing scripts SpcByte byte 0 We need the BYTE value for a space below strn InputString pos 0 StorePos RecallPos OldToken LenLastScript 0 Grab next sub superscript Token will be either or _ RETURN if no scripts Token nexttok strn _ pos pos if pos EQ 1 then return InputString nothing to process FntChange sub_sup_idl Token Our approach will be to grab the input string up to the next or _ then process the script we ve found NewString str_token strn Token WHILE strlen strn GT 0 DO BEGIN Grab first char of sub superscript Script strmid strn 0 1 EndOfScript 0 Position of end of this script IF Script EQ THEN BEGIN Scripts of more than 1 char EndOfScript matchdelim strn Script translate_sub_super strmid strn 1 EndOfScript 1 recursed ENDIF Grab rest of string _after_ the end of the script strn strmid strn EndOfScript 1 strlen strn EndOfScript 1 Find the next script and prepare for processing it FntChange sub_sup_idl Token FORCE_UD ud OldToken Token Token nexttok strn _ POS pos If the input is n 2_j we want the 2 to be directly above the j rather than having the j below and to the right of the 2 In other words we want the first below not the second 2 2 N N J J To accomplish this we need to save the position at which we begin writing the 2 with a S and restore that position with a R after writing the 2 The first section in the IF block below handles the J above the thing after the first script We don t care if there is another script following We also padd the second script with spaces if it is shorter than the first to make sure that whatever comes out after the scripts starts in the proper place The worry is that without the spaces the input N looong _ s 1 will end up with the starting right the s ends IF StorePos EQ S THEN BEGIN StorePos RecallPos calculate the difference in length between this script and the previous stacked one removing font change commands crudely by guessing that the number of characters this takes is twice the number of exclamation points The 1 below is a kludge I don t know why but I need one extra space NumSpaces LenLastScript strlen script 2 strcnt Script NumSpaces NumSpaces 1 0 IF NumSpaces GT 0 THEN Script Script string replicate SpcByte NumSpaces ENDIF ELSE BEGIN IF Token NE OldToken AND pos EQ 0 THEN BEGIN The next script immediately follows this one Arrange to save the position of the current script so that both begin with the same horizontal position StorePos S RecallPos R LenLastScript strlen Script 2 strcnt Script ENDIF ENDELSE Continue building the IDL string adding on our just processed script NewString NewString StorePos FntChange Script RecallPos FontRestore IF pos NE 1 THEN BEGIN more left to process NewString NewString str_token strn Token ENDIF ELSE BEGIN we are done NewString NewString strn strn ENDELSE ENDWHILE return NewString END "); a[191] = new Array("./ToBeReviewed/CALCULS/depth2floatlevel.html", "depth2floatlevel.pro", "", " file_comments Rather comparable to depth2level but here the calculated level is in float For example the level 5 4 correspond to a depth equal to gdep 5 4 gdep 6 gdep 5 categories Without loop param TAB in required 2d depth array or a structure respecting litchamp criterion keyword NOMASK To do not mask land points returns An 2d array of float containing levels s values uses common restrictions Accept values at values f_nan and mask land points at valmask examples IDL a jpk 1 1 jpi jpj findgen jpi jpj IDL plt 1e6 a floatlevel2depth depth2floatlevel a nocontour champ nul a 1e 6 pres history Sebastien Masson smasson lodyc jussieu fr 15 06 2000 version Id: depth2floatlevel pro 371 2008 08 07 09:32:02Z pinsard FUNCTION depth2floatlevel tab NOMASK nomask compile_opt idl2 strictarrsubs tempsun systime 1 for key_performance common depthin litchamp tab levelup depth2level depthin UPPER nomask depthup level2depth levelup nomask levellow depth2level depthin lower nomask depthlow level2depth levellow nomask calculate the distance depthlow depthup and management of the case of this distance is null or equal to values f_nan divi depthlow depthup nan where finite divi EQ 0 if nan 0 NE 1 then divi nan 0 nan where divi EQ 0 if nan 0 NE 1 then divi nan values f_nan calculation of the result res levelup depthin depthup divi We mask land point at valmask if NOT keyword_set nomask then begin grille mask if n_elements valmask EQ 0 then valmask 1e20 terre where temporary mask 0 EQ 0 if terre 0 NE 1 then res terre valmask endif if keyword_set key_performance THEN print temps depth2floatlevel systime 1 tempsun return res end"); a[192] = new Array("./ToBeReviewed/CALCULS/depth2level.html", "depth2level.pro", "", " file_comments Allows to pass from a 2d depth array to a corresponding 2d level array categories Without loop param TAB type 2d array 2d depth array or a structure respecting litchamp criterions keyword UPPER activated by default We select the level just above the depth keyword LOWER We select the level just below the depth keyword CLOSER We select the depth s closer level keyword NOMASK To do not mask land points returns It is a 2d array containing level s values uses common restrictions For depths out of gdep s values the value values f_nan is sent back if the depth is superior to this one of the bottom we send back jpk 1 in the upper case and values f_nan in the lower case history Sebastien Masson smasson lodyc jussieu fr 17 6 1999 15 6 2000 accepte values f_nan version Id: depth2level pro 370 2008 08 07 07:59:15Z pinsard FUNCTION depth2level tab LOWER lower UPPER upper CLOSER closer NOMASK nomask _EXTRA ex compile_opt idl2 strictarrsubs tempsun systime 1 for key_performance common upper 1 if keyword_set lower THEN upper 0 Reading of the input field and recuperation of the used subdomain s size in litchamp tab grille mask 1 1 gdep nx ny nz firstx firsty firstz lastx lasty lastz Verification of the coherence between array s size and the defined by domdef domain IF ny EQ 1 THEN in reform in nx ny over taille size in if taille 0 NE 2 then return report le champ en entree doit contenir un tableau 2d case 1 of taille 1 eq jpi and taille 2 eq jpj:in in firstx:lastx firsty:lasty taille 1 eq nx and taille 2 eq ny: else:return report Probleme d adequation entre les tailles du domaine et celle du champ endcase delete points at values f_nan notanumber where finite in nan EQ 1 if notanumber 0 NE 1 then in notanumber 0 We transform the 2d depth value in a 2d array of levels corresponding to depths We go on array who have the size of 3d arrays prof replicate 1 nx ny gdep firstz:lastz in in replicate 1 nz mask01 prof LT in mask01 reform mask01 nx ny nz levels total mask01 3 notvalid where levels EQ nz if keyword_set upper then begin levels levels 1 notvalid where levels EQ 1 ENDIF ELSE notvalid where levels EQ nz IF notvalid 0 NE 1 THEN levels notvalid values f_nan If closer is activated if keyword_set closer then begin test litchamp tab level2depth levels level2depth levels 1 jpk 1 litchamp tab test test 0 test 1 changer where test GE 0 if changer 0 NE 1 then levels changer levels changer 1 jpk 1 endif We put back points at values f_nan if notanumber 0 NE 1 then levels notanumber values f_nan We mask land points at valmask if NOT keyword_set nomask then begin if n_elements valmask EQ 0 then valmask 1e20 terre where mask 0 EQ 0 if terre 0 NE 1 then levels terre valmask endif if keyword_set key_performance THEN print temps depth2level systime 1 tempsun return levels end"); a[193] = new Array("./ToBeReviewed/CALCULS/depth2mask.html", "depth2mask.pro", "", " file_comments Allows to pass from a 2d depth sill array to a 3d array of mask with one of levels above the sill depth and 0s below categories Without loop param TAB type 3d array 2d sill depth array or a structure respecting litchamp criterions keyword _EXTRA Used to pass keywords returns It is a 3d array containing the mask associated to the 2d sill depth array uses common history Sebastien Masson smasson lodyc jussieu fr 17 6 1999 version Id: depth2mask pro 370 2008 08 07 07:59:15Z pinsard FUNCTION depth2mask tab _EXTRA ex compile_opt idl2 strictarrsubs tempsun systime 1 For key_performance common We transform the 2d depth value in a 2d array of levels corresponding to depths niveaux depth2level tab _extra ex IF niveaux 0 EQ 1 THEN return 1 We transform the 2d array in a 3d array of mask mask level2mask niveaux if keyword_set key_performance NE 0 THEN print temps depth2mask systime 1 tempsun return mask end"); a[194] = new Array("./ToBeReviewed/CALCULS/determ2.html", "determ2.pro", "", " file_comments computes the determinant of n 2 by 2 arrays Z2DS is an 2 2 n array categories Without loop param A in required n element array Defined as z2ds 0 0 z1d00 param B in required n element array Defined as z2ds 0 1 z1d01 param C in required n element array Defined as z2ds 1 0 z1d10 param D in required n element array Defined as z2ds 1 1 z1d11 returns n elements array the determinent of each 2 2 arrrays examples IDL a findgen 2 2 5 IDL print determ2 a IDL FOR i 0 4 DO print determ a i history S Masson smasson lodyc jussieu fr July 11th 2002 version Id: determ2 pro 371 2008 08 07 09:32:02Z pinsard FUNCTION determ2 a b c d compile_opt idl2 strictarrsubs CASE n_params OF 1:res a 0 0 a 1 1 a 0 1 a 1 0 4:res a d c b ELSE:stop ENDCASE RETURN res END"); a[195] = new Array("./ToBeReviewed/CALCULS/determ3.html", "determ3.pro", "", " file_comments computes the determinant of n 3 by 3 arrays Z2DS is an 3 3 n array categories Without loop param IN00 in required It is an n element array defined by in00 z2ds 0 0 param IN01 in required It is an n element array defined by in01 z2ds 0 1 param IN02 in required It is an n element array defined by in02 z2ds 0 2 param IN10 in required It is an n element array defined by in10 z2ds 1 0 param IN11 in required It is an n element array defined by in11 z2ds 1 1 param IN12 in required It is an n element array defined by in12 z2ds 1 2 param IN20 in required It is an n element array defined by in20 z2ds 2 0 param IN21 in required It is an n element array defined by in21 z2ds 2 1 param IN22 in required It is an n element array defined by in22 z2ds 2 2 returns n elements array the determinant of each 3 3 arrays examples IDL a findgen 3 3 5 IDL print determ3 a 2 IDL FOR i 0 4 DO print determ a i 2 history S Masson smasson lodyc jussieu fr July 11th 2002 version Id: determ3 pro 371 2008 08 07 09:32:02Z pinsard FUNCTION determ3 in00 in01 in02 in10 in11 in12 in20 in21 in22 compile_opt idl2 strictarrsubs IF n_params EQ 1 THEN BEGIN in00save temporary in00 in00 in00save 0 0 in01 in00save 0 1 in02 in00save 0 2 in10 in00save 1 0 in11 in00save 1 1 in12 in00save 1 2 in20 in00save 2 0 in21 in00save 2 1 in22 in00save 2 2 ENDIF a01 determ2 in10 in20 in12 in22 a11 determ2 in00 in20 in02 in22 a21 determ2 in00 in10 in02 in12 res in01 a01 in11 a11 in21 a21 IF n_params EQ 1 THEN in00 temporary in00save RETURN res END"); a[196] = new Array("./ToBeReviewed/CALCULS/floatlevel2depth.html", "floatlevel2depth.pro", "", " file_comments Rather comparable to level2depth It is the invert function of depth2floatlevel categories Without loop param TAB 2d array of sill levels or a structure respecting litchamp criterions keyword NOMASK To do not mask land points returns 2d array containing depths uses common examples IDL a gdept jpk 1 1 jpi jpj findgen jpi jpj IDL plt 1e6 a floatlevel2depth depth2floatlevel a nocontour null field at 1e 6 pres history Sebastien Masson smasson lodyc jussieu fr 15 6 2000 version Id: floatlevel2depth pro 371 2008 08 07 09:32:02Z pinsard FUNCTION floatlevel2depth tab NOMASK nomask compile_opt idl2 strictarrsubs tempsun systime 1 To key_performance common flevelin litchamp tab We delete points at values f_nan notanumber where finite flevelin nan EQ 1 if notanumber 0 NE 1 then flevelin notanumber 0 We sill delete land points at valmask for example flevelin 0 flevelin jpk 1 We calculate the depth depthup level2depth floor flevelin nomask depthlow level2depth ceil flevelin nomask weight flevelin floor flevelin res depthup weight depthlow depthup We put back points at values f_nan if notanumber 0 NE 1 then res notanumber values f_nan We mask land points at valmask if NOT keyword_set nomask then begin grille mask if n_elements valmask EQ 0 then valmask 1e20 terre where temporary mask 0 EQ 0 if terre 0 NE 1 then res terre valmask endif if keyword_set key_performance THEN print temps floatlevel2depth systime 1 tempsun return res end"); a[197] = new Array("./ToBeReviewed/CALCULS/fsfzpt.html", "fsfzpt.pro", "", " file_comments categories param PFS param PFP returns uses restrictions examples history version Id: fsfzpt pro 325 2007 12 06 10:04:53Z pinsard Ice freezing point fsfzpt: freezing point of seawater in degrees celsius units : salinity pfs ipss 78 pressure pfp decibars temperature fszfpt degrees celsius freezing pt reference : unesco tech papers in the marine science no 28 1978 eigth report jpots annex 6 freezing point of seawater F J Millero pp 29 35 checkvalue: fsfzpt 2 588567 deg c for s 40 0 p 500 decibars todo seb FUNCTION fsfzpt pfs pfp compile_opt idl2 strictarrsubs RETURN 0 0575 1 710523e 3 sqrt pfs 2 154996e 4 pfs pfs 7 53e 4 pfp END"); a[198] = new Array("./ToBeReviewed/CALCULS/grossemoyenne.html", "grossemoyenne.pro", "", " file_comments averages a 3 or 4 d time series field over a selected geographical area or along the time axis For one or more selected axes x y z t categories param TAB in required 3d or 4d field param DIREC in required x y z t xy xz yz xyz xt yt zt xyt xzt yzt or xyzt keyword BOXZOOM xmin xmax ymin ymax zmin zmax to more details see domdef boxzoom can have 5 forms : vert2 vert1 vert2 lon1 lon2 lat1 lat2 lon1 lon2 lat1 lat2 vert2 lon1 lon2 lat1 lat2 vert1 vert2 keyword NAN not a number we activate it if we want to average without considerate some masked values of TAB If masked values of TAB are values consecrated by IDL values f_nan we just have to put NAN If masked values of TAB are valued a a must be different of 1 corresponding to nan values f_nan and of 0 which desactivate nan We have to put NAN a Comment: In output result points which are NAN will be valued a or values f_nan keyword NODOMDEF We activate it if we do not want to pass in domdef even if the keyword boxzoom is present like when grossemoyenne is called via checkfield keyword INTEGRATION To make an integral rather than an average keyword SPATIALFIRST when performing at the same time spatial and temporal mean grossemoyenne is assuming that the mask is not changing with the time In consequence grossemoyenne performs temporal mean first and then call moyenne Activate SPATIALFIRST if you want to perform the spatial mean before the temporal mean Note that if NAN is activated then SPATIALFIRST is activated automatically keyword TEMPORALFIRST to force to perform first temporal mean even if NAN is activated see SPATIALFIRST explanations keyword WDEPTH to specify that the field is at W depth instead of T depth automatically activated if vargrid eq W returns an array uses common domdef restrictions Put values corresponding to land at 1 e20 history Jerome Vialard jv lodyc jussieu fr 2 7 98 Sebastien Masson smasson lodyc jussieu fr adaptation array containing a temporal dimension 14 8 98 15 1 98 12 3 99 adaptation for NAN and utilization of TEMPORARY version Id: grossemoyenne pro 378 2008 08 12 12:35:46Z pinsard FUNCTION grossemoyenne tab direc BOXZOOM boxzoom INTEGRATION integration NAN nan NODOMDEF nodomdef WDEPTH wdepth SPATIALFIRST spatialfirst TEMPORALFIRST temporalfirst _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh cm_4data cm_4cal IF NOT keyword_set key_forgetold THEN BEGIN updatenew updatekwd ENDIF tempsun systime 1 For key_performance I preliminaries dirt 0 dirx 0 diry 0 dirz 0 dim aa I 1 Directions s we follow to integrate if strpos direc t ge 0 then dirt 1 if strpos direc x ge 0 then dirx 1 if strpos direc y ge 0 then diry 1 if strpos direc z ge 0 then dirz 1 IF keyword_set NAN AND dirx EQ 1 OR diry EQ 1 OR dirz EQ 1 THEN spatialfirst 1 IF keyword_set temporalfirst THEN spatialfirst 0 I 2 verification of the input array s size taille size tab case 1 of taille 0 eq 1 :return report array has only one dimension not implemented taille 0 eq 2 :return report array has only two dimensions not implemented taille 0 eq 3 :BEGIN dim 3d if dirx eq 0 and diry eq 0 and dirt eq 0 then return tab END taille 0 eq 4 :BEGIN dim 4d if dirx eq 0 and diry eq 0 and dirz eq 0 and dirt eq 0 then return tab END else : return report array must have 3 or 4 dimensions if there is not time dimension use moyenne endcase I 3 Obtainment of scale s factors and of the mask on the subdomain concernedby the average Redefinition of the domain ajusted at boxzoom at 6 elements This will allowed us to calculate only in the domain concerned by the average Domdef followed by grid give us all arrays of the grid on the subdomain if keyword_set boxzoom then BEGIN Case 1 Of N_Elements Boxzoom Eq 1: bte lon1 lon2 lat1 lat2 0 boxzoom 0 N_Elements Boxzoom Eq 2: bte lon1 lon2 lat1 lat2 boxzoom 0 boxzoom 1 N_Elements Boxzoom Eq 4: bte Boxzoom vert1 vert2 N_Elements Boxzoom Eq 5: bte Boxzoom 0:3 0 Boxzoom 4 N_Elements Boxzoom Eq 6: bte Boxzoom Else: return report Wrong Definition of Boxzoom endcase if NOT keyword_set nodomdef then BEGIN savedbox 1b saveboxparam boxparam4grmoyenne dat domdef bte GRIDTYPE vargrid _extra ex ENDIF ENDIF attribution of the mask and of longitude and latitude arrays grille mask glam gphi gdep nx ny nz firstx firsty firstz lastx lasty lastz e1 e2 e3 WDEPTH wdepth I 4 if dirt equal 1 we make the temporal average and we send it in moyenne if dirt EQ 1 AND NOT keyword_set spatialfirst then begin if dim EQ 3d then BEGIN case 1 of taille 1 eq jpi and taille 2 eq jpj and taille 3 eq jpt: res tab firstx:firstx nx 1 firsty:firsty ny 1 taille 1 EQ nx and taille 2 eq ny and taille 3 eq jpt:res tab else:BEGIN if keyword_set savedbox THEN restoreboxparam boxparam4grmoyenne dat return report Probleme d adequation entre les tailles du domaine nx ny jpt strtrim nx 1 strtrim ny 1 strtrim jpt 1 et du tableau strtrim taille 1 1 strtrim taille 2 1 strtrim taille 3 1 END ENDCASE if keyword_set integration then begin res total res 3 nan nan ENDIF ELSE BEGIN if keyword_set nan then BEGIN divi finite res divi total temporary divi 3 notanum where divi EQ 0 res total res 3 nan keyword_set nan 1 divi if notanum 0 NE 1 then res temporary notanum values f_nan ENDIF ELSE res total res 3 1 taille 3 ENDELSE ENDIF ELSE BEGIN case 1 of taille 1 eq jpi and taille 2 eq jpj and taille 3 eq jpk and taille 4 eq jpt: res tab firstx:lastx firsty:lasty firstz:lastz taille 1 eq jpi and taille 2 eq jpj and taille 3 eq nz and taille 4 eq jpt: res tab firstx:lastx firsty:lasty taille 1 EQ nx and taille 2 eq ny and taille 3 eq nz and taille 4 eq jpt:res tab taille 1 EQ nx and taille 2 eq ny and taille 3 eq jpk and taille 4 eq jpt: res tab firstz:lastz else:BEGIN if keyword_set savedbox THEN restoreboxparam boxparam4grmoyenne dat return report Probleme d adequation entre les tailles du domaine nx ny nz jpt strtrim nx 1 strtrim ny 1 strtrim nz 1 strtrim jpt 1 et du tableau strtrim taille 1 1 strtrim taille 2 1 strtrim taille 3 1 strtrim taille 4 1 END endcase if keyword_set integration then begin res total res 4 nan nan ENDIF ELSE BEGIN if keyword_set nan then begin divi finite res divi total temporary divi 4 notanum where divi EQ 0 res total res 4 nan 1 divi if notanum 0 NE 1 then res temporary notanum values f_nan ENDIF ELSE res total res 4 1 taille 4 ENDELSE ENDELSE if keyword_set savedbox THEN restoreboxparam boxparam4grmoyenne dat return moyenne temporary res direc BOXZOOM boxzoom NAN nan INTEGRATION integration NODOMDEF nodomdef WDEPTH wdepth _extra ex ENDIF ELSE res tab IF jpt EQ 1 THEN BEGIN if keyword_set savedbox THEN restoreboxparam boxparam4grmoyenne dat return moyenne reform res over direc BOXZOOM boxzoom NAN nan INTEGRATION integration NODOMDEF nodomdef WDEPTH wdepth _extra ex END II Case 2d arrays series tab3d if dim eq 3d then begin II 1 verification of the coherence of the array s size to average Verification of the coherence between the array s size and the domain defined by domdef The input array must have either the total domain s size jpi jpj jpt or this one of the reduced domain nx ny jpt case 1 of taille 1 eq jpi and taille 2 eq jpj and taille 3 eq jpt: res tab firstx:firstx nx 1 firsty:firsty ny 1 taille 1 EQ nx and taille 2 eq ny and taille 3 eq jpt:res tab else:BEGIN if keyword_set savedbox THEN restoreboxparam boxparam4grmoyenne dat return report Probleme d adequation entre les tailles du domaine nx ny jpt strtrim nx 1 strtrim ny 1 strtrim jpt 1 et du tableau strtrim taille 1 1 strtrim taille 2 1 strtrim taille 3 1 enD endcase if keyword_set nan NE 0 then BEGIN if nan NE 1 then BEGIN If nan is not values f_nan we put it at values f_nan if abs nan LT 1e6 then notanumber where res EQ nan ELSE notanumber where abs res GT abs nan 10 if notanumber 0 NE 1 then res temporary notanumber values f_nan ENDIF ENDIF Comment : WE HAVE TO BE CAREFUL ABOUT CASES WHERE THE DIMENSION TO AVERAGE 1 AND MAKE SURE THAT IT EXIST THAT IS WHY WE USE reform nx ny WHICH CAN LOOK USELESS AT THE BEGINNING if nx EQ 1 OR ny EQ 1 then BEGIN res reform res nx ny jpt over e1 reform e1 nx ny over e2 reform e2 nx ny over endif if nx EQ 1 OR ny EQ 1 OR nz EQ 1 THEN mask reform mask nx ny nz over II 3 Different types of average if keyword_set nan NE 0 then msknan finite res ELSE msknan 1 mask mask 0 case 1 of dirx eq 1 and diry eq 0 : begin e temporary e1 temporary mask echelle temporary e replicate 1 jpt echelle reform echelle nx ny jpt over if keyword_set integration then divi 1 ELSE BEGIN IF msknan 0 NE 1 THEN divi total echelle msknan 1 ELSE divi total echelle 1 ENDELSE res total temporary res echelle 1 nan nan divi 1 if msknan 0 NE 1 then BEGIN echelle temporary echelle NE 0 testnan temporary msknan echelle testnan total temporary testnan 1 total temporary echelle 1 EQ 0 endif end dirx eq 0 and diry eq 1 : begin e temporary e2 temporary mask if nx EQ 1 OR ny EQ 1 then e reform e nx ny over echelle temporary e replicate 1 jpt echelle reform echelle nx ny jpt over if keyword_set integration then divi 1 ELSE BEGIN IF msknan 0 NE 1 THEN divi total echelle msknan 2 ELSE divi total echelle 2 ENDELSE res total temporary res echelle 2 nan nan divi 1 if msknan 0 NE 1 then begin echelle temporary echelle NE 0 testnan temporary msknan echelle testnan total temporary testnan 2 total temporary echelle 2 EQ 0 endif end dirx eq 1 and diry eq 1 : begin echelle temporary e1 temporary e2 temporary mask replicate 1 jpt echelle reform echelle nx ny jpt over if keyword_set integration then divi 1 ELSE BEGIN IF msknan 0 NE 1 THEN divi total total echelle msknan 1 1 ELSE divi total total echelle 1 1 ENDELSE res total temporary total temporary res echelle 1 nan nan 1 nan nan divi 1 if msknan 0 NE 1 then begin echelle temporary echelle NE 0 testnan temporary msknan echelle testnan total total temporary testnan 1 1 total total temporary echelle 1 1 EQ 0 endif end endcase endif III Case 3d arrays series tab4d if dim eq 4d then begin III 1 Verification of the coherence of the array to average size Verification of the coherence between the array s size and the domain defind by domdef The input array must have either the total domain size jpi jpj jpk jpt or this one of the reduced domain nx ny ny jpt case 1 of taille 1 eq jpi and taille 2 eq jpj and taille 3 eq jpk and taille 4 eq jpt: res tab firstx:lastx firsty:lasty firstz:lastz taille 1 eq jpi and taille 2 eq jpj and taille 3 eq nz and taille 4 eq jpt: res tab firstx:lastx firsty:lasty taille 1 EQ nx and taille 2 eq ny and taille 3 eq nz and taille 4 eq jpt:res tab taille 1 EQ nx and taille 2 eq ny and taille 3 eq jpk and taille 4 eq jpt: res tab firstz:lastz else:BEGIN if keyword_set savedbox THEN restoreboxparam boxparam4grmoyenne dat return report Probleme d adequation entre les tailles du domaine nx ny nz jpt strtrim nx 1 strtrim ny 1 strtrim nz 1 strtrim jpt 1 et du tableau strtrim taille 1 1 strtrim taille 2 1 strtrim taille 3 1 strtrim taille 4 1 END endcase if nx EQ 1 OR ny EQ 1 OR nz EQ 1 OR jpt EQ 1 then res reform res nx ny nz jpt over if keyword_set nan NE 0 then BEGIN if nan NE 1 then BEGIN if nan is not values f_nan we put it at values f_nan if abs nan LT 1e6 then notanumber where res EQ nan ELSE notanumber where abs res GT abs nan 10 if notanumber 0 NE 1 then res temporary notanumber values f_nan ENDIF ENDIF Comment : WE HAVE TO BE CAREFUL ABOUT CASES WHERE THE DIMENSION TO AVERAGE 1 AND MAKE SURE THAT IT EXIST THAT IS WHY WE USE reform nx ny WHICH CAN LOOK USELESS AT THE BEGINNING if nx EQ 1 OR ny EQ 1 OR nz EQ 1 then BEGIN res reform res nx ny nz jpt over mask reform mask nx ny nz over ENDIF IF keyword_set key_partialstep THEN BEGIN the top of the ocean floor is IF vargrid EQ T OR vargrid EQ W THEN bottom total mask 3 ELSE bottom total tmask firstx:lastx firsty:lasty firstz:lastz 3 we suppress columns with only ocean or land good where bottom NE 0 AND bottom NE nz the bottom of the ocean in 3D index is: bottom lindgen nx ny temporary bottom 1L nx ny IF good 0 NE 1 THEN bottom bottom good ELSE bottom 1 ENDIF ELSE bottom 1 III 2 different average types IF keyword_set nan NE 0 THEN msknan finite res ELSE msknan 1 case 1 of dirx eq 1 and diry eq 0 and dirz eq 0 : BEGIN e13 temporary e1 replicate 1 nz e13 reform e13 nx ny nz over echelle temporary e13 temporary mask replicate 1 jpt echelle reform echelle nx ny nz jpt over IF keyword_set key_partialstep AND bottom 0 NE 1 AND nx NE 1 THEN BEGIN IF msknan 0 EQ 1 THEN BEGIN msknan replicate 1b nx ny nz jpt nan 1 ENDIF bottom bottom replicate 1 jpt 4D bottom replicate 1 n_elements bottom nx ny nz lindgen jpt msknan bottom 0 res temporary bottom values f_nan ENDIF if keyword_set integration then divi 1 ELSE begin IF msknan 0 NE 1 THEN divi total echelle msknan 1 ELSE divi total echelle 1 endelse res temporary res echelle res total temporary res 1 nan nan divi 1 if msknan 0 NE 1 then begin echelle temporary echelle NE 0 testnan temporary msknan echelle testnan total temporary testnan 1 total temporary echelle 1 EQ 0 endif end dirx eq 0 and diry eq 1 and dirz eq 0 : begin e23 temporary e2 replicate 1 nz e23 reform e23 nx ny nz over echelle temporary e23 temporary mask replicate 1 jpt echelle reform echelle nx ny nz jpt over IF keyword_set key_partialstep AND bottom 0 NE 1 AND ny NE 1 THEN BEGIN IF msknan 0 EQ 1 THEN BEGIN msknan replicate 1b nx ny nz jpt nan 1 endif bottom bottom replicate 1 jpt 4D bottom replicate 1 n_elements bottom nx ny nz lindgen jpt msknan bottom 0 res temporary bottom values f_nan ENDIF if keyword_set integration then divi 1 ELSE begin IF msknan 0 NE 1 THEN divi total echelle msknan 2 ELSE divi total echelle 2 endelse res total temporary res echelle 2 nan nan divi 1 if msknan 0 NE 1 then begin echelle temporary echelle NE 0 testnan temporary msknan echelle testnan total temporary testnan 2 total temporary echelle 2 EQ 0 endif end dirx eq 0 and diry eq 0 and dirz eq 1 : begin e33 replicate 1 1 nx ny e3 e33 reform e33 nx ny nz over IF keyword_set key_partialstep AND bottom 0 NE 1 THEN BEGIN IF keyword_set wdepth THEN e33 bottom e3w_ps firstx:lastx firsty:lasty temporary good ELSE e33 bottom e3t_ps firstx:lastx firsty:lasty temporary good ENDIF echelle temporary e33 temporary mask replicate 1 jpt echelle reform echelle nx ny nz jpt over if keyword_set integration then divi 1 ELSE begin IF msknan 0 NE 1 THEN divi total echelle msknan 3 ELSE divi total echelle 3 endelse res total temporary res echelle 3 nan nan divi 1 if msknan 0 NE 1 then begin echelle temporary echelle NE 0 testnan temporary msknan echelle testnan total temporary testnan 3 total temporary echelle 3 EQ 0 endif end dirx eq 1 and diry eq 1 and dirz eq 0 : begin e13 e1 replicate 1 nz e13 reform e13 nx ny nz over e23 e2 replicate 1 nz e23 reform e23 nx ny nz over echelle temporary e13 temporary e23 temporary mask replicate 1 jpt echelle reform echelle nx ny nz jpt over IF keyword_set key_partialstep AND bottom 0 NE 1 AND nx ny NE 1 THEN BEGIN IF msknan 0 EQ 1 THEN BEGIN msknan replicate 1b nx ny nz jpt nan 1 endif bottom bottom replicate 1 jpt 4D bottom replicate 1 n_elements bottom nx ny nz lindgen jpt msknan bottom 0 res temporary bottom values f_nan ENDIF if keyword_set integration then divi 1 ELSE begin IF msknan 0 NE 1 THEN divi total total echelle msknan 1 1 ELSE divi total total echelle 1 1 endelse res total total temporary res echelle 1 nan nan 1 nan nan divi 1 if msknan 0 NE 1 then begin echelle temporary echelle NE 0 testnan temporary msknan echelle testnan total total temporary testnan 1 1 total total temporary echelle 1 1 EQ 0 endif end dirx eq 1 and diry eq 0 and dirz eq 1 : begin e133 e1 e3 IF keyword_set key_partialstep AND bottom 0 NE 1 THEN BEGIN IF keyword_set wdepth THEN e133 bottom e1 e3w_ps firstx:lastx firsty:lasty temporary good ELSE e133 bottom e1 e3t_ps firstx:lastx firsty:lasty temporary good ENDIF echelle temporary e133 temporary mask replicate 1 jpt echelle reform echelle nx ny nz jpt over if keyword_set integration then divi 1 ELSE begin IF msknan 0 NE 1 THEN divi total total echelle msknan 1 2 ELSE divi total total echelle 1 2 endelse res total total temporary res echelle 1 nan nan 2 nan nan divi 1 if msknan 0 NE 1 then begin echelle temporary echelle NE 0 testnan temporary msknan echelle testnan total total temporary testnan 1 2 total total temporary echelle 1 2 EQ 0 endif end dirx eq 0 and diry eq 1 and dirz eq 1 : begin e233 e2 e3 IF keyword_set key_partialstep AND bottom 0 NE 1 THEN BEGIN IF keyword_set wdepth THEN e233 bottom e2 e3w_ps firstx:lastx firsty:lasty temporary good ELSE e233 bottom e2 e3t_ps firstx:lastx firsty:lasty temporary good ENDIF echelle temporary e233 temporary mask replicate 1 jpt echelle reform echelle nx ny nz jpt over if keyword_set integration then divi 1 ELSE begin IF msknan 0 NE 1 THEN divi total total echelle msknan 2 2 ELSE divi total total echelle 2 2 endelse res total total temporary res echelle 2 nan nan 2 nan nan divi 1 if msknan 0 NE 1 then begin echelle temporary echelle NE 0 testnan temporary msknan echelle testnan total total temporary testnan 2 2 total total temporary echelle 2 2 EQ 0 endif end dirx eq 1 and diry eq 1 and dirz eq 1 : begin e1233 e1 e2 e3 IF keyword_set key_partialstep AND bottom 0 NE 1 THEN BEGIN IF keyword_set wdepth THEN e1233 bottom e1 e2 e3w_ps firstx:lastx firsty:lasty temporary good ELSE e1233 bottom e1 e2 e3t_ps firstx:lastx firsty:lasty temporary good ENDIF echelle temporary e1233 temporary mask replicate 1 jpt echelle reform echelle nx ny nz jpt over if keyword_set integration then divi 1 ELSE begin IF msknan 0 NE 1 THEN divi total total total echelle msknan 1 1 1 ELSE divi total total total echelle 1 1 1 endelse res total total total temporary res echelle 1 nan nan 1 nan nan 1 nan nan divi 1 if msknan 0 NE 1 then begin echelle temporary echelle NE 0 testnan temporary msknan echelle testnan total total total temporary testnan 1 1 1 total total total temporary echelle 1 1 1 EQ 0 endif end endcase endif if dirt EQ 1 AND keyword_set spatialfirst then BEGIN IF reverse size res dimension 0 NE jpt THEN BEGIN ras report the last dimension of res is not equal to jpt: strtrim jpt 2 if keyword_set savedbox THEN restoreboxparam boxparam4grmoyenne dat return 1 ENDIF tdim size res n_dimensions if keyword_set integration then res total res tdim nan nan ELSE BEGIN if keyword_set nan then BEGIN testnan testnan divi ENDELSE ENDIF IV finishing IV 1 We mask land by a value equal to 1 e 20 valmask 1e 20 terre where divi EQ 0 IF terre 0 NE 1 THEN BEGIN res temporary terre 1e 20 ENDIF IV 2 We replace when nan equal 1 values f_nan by nan if keyword_set nan NE 0 then BEGIN puttonan where temporary testnan EQ 0 if puttonan 0 NE 1 then res temporary puttonan values f_nan if nan NE 1 then BEGIN notanumber where finite res eq 0 if notanumber 0 NE 1 then res temporary notanumber nan ENDIF ENDIF IV 3 We replace in the domain whch was defined at the entry of average if keyword_set savedbox THEN restoreboxparam boxparam4grmoyenne dat if keyword_set key_performance THEN print temps grossemoyenne systime 1 tempsun return res end"); a[199] = new Array("./ToBeReviewed/CALCULS/hdyn.html", "hdyn.pro", "", " file_comments Calculate the height by rapport to a reference state for a depth reference See keywords for different possibilities By default the state reference is rho 1020 and the depth reference is gdepw ka with ka the first W level directly above 1000 m categories Calculation param TABSN in required array representing the salinity param TABTN in required array representing the temperature Has the same size than SN keyword GILL We activate this key if we want to calculate the dynamic height like in the GILL page 215 which means by rapport to a reference state which vary in depth and which is determined by a reference temperature tref at 0 C and a reference salinity sref at 35 psu keyword LEVEL It is the same reference level to take This level is defined like that gdepw level is the reference depth keyword SREF Give a value to this keyword to change the reference salinity used in the calculation when GILL is activated keyword TREF Give a value to this keyword to change the reference temperature used in the calculation when GILL is activated keyword PROFREF Give a depth to this keyword which will be considered as the reference depth in this case LEVEL has not any effect the calculation will be effectuated until this depth effecting an interpolation between the last W level above PROFREF and PROFREF keyword SURFACE_LEVEL default 0 It is the level where we wan to calculate the dynamic height returns An array of the same size of sn and tn representing the dynamic height calculated from a reference depth nd by rapport to a reference state uses common restrictions Points for which we can not calculate the dynamic height whose the batymetry is less deep than the reference depth are put at the value values f_nan restrictions approximation: The pressure in decibars is equal to the depth in meters the pressure increase of 1 bar every 10 m history Sebastien Masson smasson lodyc jussieu fr version Id: hdyn pro 370 2008 08 07 07:59:15Z pinsard FUNCTION hdyn tabsn tabtn TREF tref SREF sref PROFREF profref LEVEL level GILL gill SURFACE_LEVEL surface_level compile_opt idl2 strictarrsubs tempsun systime 1 for key_performance common if NOT keyword_set surface_level then surface_level 0 useful if GILL is activated if NOT keyword_set tref then tref 0 if NOT keyword_set sref then sref 35 If needed we determinate the reference depth and the W level situated directly above if keyword_set profref then begin rien where gdepw LE profref level level level 1 za gdepw level ENDIF ELSE BEGIN if NOT keyword_set level then BEGIN rien where gdepw LE 1000 level level level 1 ENDIF profref gdepw level za profref ENDELSE tailles size tabsn taillet size tabtn if total tailles 0:tailles 0 NE taillet 0:taillet 0 NE 0 then return report arrays sn and tn must have the same size if tailles 3 NE jpk then return report vertical dimension of sn and tn arrays must be equal to jpk nx nxt ny nyt case size tabsn 0 OF 3:BEGIN case 1 of tailles 1 eq jpi and tailles 2 eq jpj: BEGIN sn tabsn firstxt:lastxt firstyt:lastyt tn tabtn firstxt:lastxt firstyt:lastyt end tailles 1 eq nx and tailles 2 eq ny:BEGIN sn tabsn tn tabtn end else:return report Probleme d adequation entre les tailles du domaine et de la boite ENDCASE if keyword_set gill then rhonref rhon replicate sref nx ny jpk replicate tref nx ny jpk insitu ELSE rhonref 1020 vol rhonref rhon sn tn insitu rhonref e33d replicate 1 nx ny e3t e33d reform e33d nx ny jpk over terre where tmask firstxt:lastxt firstyt:lastyt EQ 0 if terre 0 NE 1 then vol terre values f_nan case level of 0:hdyn 100 profref gdepw 0 vol 0 1:hdyn 100 vol e33d 0 profref gdepw 1 vol 1 ELSE:hdyn 100 total vol e33d surface_level: level 1 3 profref gdepw level vol level endcase END 4:BEGIN case 1 of tailles 1 eq jpi and tailles 2 eq jpj AND tailles 4 EQ jpt: BEGIN sn tabsn firstxt:lastxt firstyt:lastyt tn tabtn firstxt:lastxt firstyt:lastyt end tailles 1 eq nx and tailles 2 eq ny AND tailles 4 EQ jpt:BEGIN sn tabsn tn tabtn end else:return report Probleme d adequation entre les tailles du domaine et de la boite endcase if keyword_set gill then rhonref rhon replicate sref nx ny jpk jpt replicate tref nx ny jpk jpt insitu ELSE rhonref 1020 vol rhonref rhon sn tn insitu rhonref e33d replicate 1 nx ny e3t e33d e33d replicate 1 jpt e33d reform e33d nx ny jpk jpt over mask tmask firstxt:lastxt firstyt:lastyt mask mask replicate 1 jpt terre where mask EQ 0 if terre 0 NE 1 then vol terre values f_nan case level of 0:hdyn 100 profref gdepw 0 vol 0 1:hdyn 100 vol e33d 0 profref gdepw 1 vol 1 ELSE:hdyn 100 total vol e33d surface_level: level 1 3 profref gdepw level vol level endcase END ELSE: return report not implemented ENDCASE varunit cm varname Dynamic Height href strtrim round profref 1 m IF keyword_set key_performance THEN print temps hdyn systime 1 tempsun return hdyn end"); a[200] = new Array("./ToBeReviewed/CALCULS/level2depth.html", "level2depth.pro", "", " file_comments Allows to pass from a 2d level array to a 2d depth array corresponding to these levels categories Without loop param TAB in required type 2d array 2d level array of sill levels or a structure respecting litchamp criterions keyword NOMASK To do not mask land points returns 2d array containing depths uses common history Sebastien Masson smasson lodyc jussieu fr 17 6 1999 14 6 2000 accepte values f_nan version Id: level2depth pro 370 2008 08 07 07:59:15Z pinsard FUNCTION level2depth tab NOMASK nomask compile_opt idl2 strictarrsubs tempsun systime 1 To key_performance common Reading of the input field and recovery of the used subdomain s size niveaux litchamp tab grille mask 1 1 gdep nx ny nz firstx firsty firstz lastx lasty lastz verification of the coherence between array s size and the domain defined by domdef taille size niveaux if taille 0 NE 2 then return report input field must be a 2d array case 1 of taille 1 eq jpi and taille 2 eq jpj:niveaux niveaux firstx:lastx firsty:lasty taille 1 eq nx and taille 2 eq ny: else:return report Probleme d adequation entre les tailles du domaine et celle du champ endcase wherenan where finite niveaux nan EQ 1 if wherenan 0 NE 1 then niveaux wherenan 0 niveaux 0 niveaux jpk 1 gdep replicate 1 nx ny gdep niveaux lindgen nx ny nx ny niveaux gdep reform gdep niveaux nx ny if wherenan 0 NE 1 then gdep wherenan values f_nan if NOT keyword_set nomask then begin if n_elements valmask EQ 0 then valmask 1e20 terre where mask 0 EQ 0 if terre 0 NE 1 then gdep terre valmask endif if keyword_set key_performance THEN print temps level2depth systime 1 tempsun return gdep end"); a[201] = new Array("./ToBeReviewed/CALCULS/level2index.html", "level2index.pro", "", " file_comments We want from a 3d matrix to extract a 2d x y array whose each element has been extract from a level specified by the 2d level array typically we want to obtain the salinity along an isopycn we have repered by its level level2index is a function which give in function of level a 2d indexes array which will allow to extract the 2d array from the 3d array categories Without loop param LEVEL in required type 2d array A 2d level array returns a 2d indexes array history Sebastien Masson smasson lodyc jussieu fr 24 11 1999 version Id: level2index pro 367 2008 08 06 09:05:24Z pinsard FUNCTION level2index level An element of 3d array whose the two first dimensions are nx and ny whose coordinates are i j and k have for index in the same 3d array i j nx k nx ny level given for each point of level we know i j et k so we can calculate the index compile_opt idl2 strictarrsubs taille size level nx taille 1 ny taille 2 array k nx ny tabknxny nx ny long level return lindgen nx ny tabknxny end"); a[202] = new Array("./ToBeReviewed/CALCULS/level2mask.html", "level2mask.pro", "", " file_comments Allow to pass from a 2d sill level array to the 3d mask array with 1s in levels above the sill level and 0s below and on it categories Without loop param TAB in required type 2d array 2d level array of sill level or a structure respecting litchamp criterions returns It is a 3d array containing the mask associated to the 2d sill level array uses common history Sebastien Masson smasson lodyc jussieu fr 17 6 1999 Sept 2004: boundary level have 0 values and not 1 as it was explained before in the header see: print array_equal niveau total level2mask niveau 3 version Id: level2mask pro 370 2008 08 07 07:59:15Z pinsard FUNCTION level2mask tab compile_opt idl2 strictarrsubs tempsun systime 1 To key_performance common Reading of the input field and recovery of the size of the used subdomain niveaux litchamp tab grille maskterre 1 1 1 nx ny nz firstx firsty firstz lastx lasty lastz verification of the coherence between the array s size and the defined by domdef domain IF ny EQ 1 THEN niveaux reform niveaux nx ny over taille size niveaux if taille 0 NE 2 then return report le champ en entree doit contenir un tableau 2d case 1 of taille 1 eq jpi and taille 2 eq jpj:niveaux niveaux firstx:lastx firsty:lasty taille 1 eq nx and taille 2 eq ny: else:return report Probleme d adequation entre les tailles du domaine et celle du champ endcase We transform the 2d leval array in 3d mask array mask reform niveaux 1 indgen nz 1 nx ny nz mask floor temporary mask 1 mask temporary mask temporary maskterre if keyword_set key_performance THEN print temps level2mask systime 1 tempsun return mask end"); a[203] = new Array("./ToBeReviewed/CALCULS/moyenne.html", "moyenne.pro", "", " file_comments averages a 2 or 3 d field over a selected geographical area and along one or more selected axes x y or z categories param TAB in required 2 or 3d field param DIREC in required x y z xy xz yz or xyz keyword BOXZOOM xmin xmax ymin ymax zmin zmax to more details see domdef boxzoom can have 5 forms: vert2 vert1 vert2 lon1 lon2 lat1 lat2 lon1 lon2 lat1 lat2 vert2 lon1 lon2 lat1 lat2 vert1 vert2 keyword NAN not a number we activate it if we want to average without considerate some masked values of TAB If masked values of TAB are values consecrated by IDL values f_nan we just have to put NAN If masked values of TAB are valued a a must be different of 1 corresponding to nan values f_nan and of 0 which desactivate nan We have to put NAN a Comment: In output result points which are NAN will be valued a or values f_nan keyword NODOMDEF We activate it if we do not want to pass in domdef even if the keyword boxzoom is present like when grossemoyenne is called via checkfield keyword INTEGRATION To make an integral rather than an average keyword WDEPTH to specify that the field is at W depth instead of T depth automatically activated if vargrid eq W returns An array uses common domdef restrictions Put values corresponding to land at 1 e20 history Jerome Vialard jv lodyc jussieu fr 2 7 98 Sebastien Masson smasson lodyc jussieu fr 14 8 98 15 1 98 11 3 99 adaptation for NAN 28 7 99 Averages 1d arrays version Id: moyenne pro 370 2008 08 07 07:59:15Z pinsard FUNCTION moyenne tab direc BOXZOOM boxzoom INTEGRATION integration NAN nan NODOMDEF nodomdef WDEPTH wdepth _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh cm_4data cm_4cal IF NOT keyword_set key_forgetold THEN BEGIN updatenew updatekwd ENDIF tempsun systime 1 To key_performance I preliminaries dirt 0 dirx 0 diry 0 dirz 0 I 1 Directions s we follow to integrate if strpos direc t ge 0 then dirt 1 if strpos direc x ge 0 then dirx 1 if strpos direc y ge 0 then diry 1 if strpos direc z ge 0 then dirz 1 if dirx eq 0 and diry eq 0 and dirz eq 0 then return tab I 2 verification of the input array s size taille size tab case 1 of taille 0 eq 1 :dim 1d taille 0 eq 2 :BEGIN dim 2d if dirx eq 0 and diry eq 0 then return tab END taille 0 eq 3 :BEGIN dim 3d if dirx eq 0 and diry eq 0 and dirz eq 0 then return tab END else : return report Array must have 2 or 3 dimensions if there is a time dimension use grossemoyenne endcase I 3 Obtainment of scale s factors and of the mask on the subdomain concernedby the average Redefinition of the domain ajusted at boxzoom at 6 elements This will allowed us to calculate only in the domain concerned by the average Domdef followed by grid give us all arrays of the grid on the subdomain if keyword_set boxzoom then BEGIN Case 1 Of N_Elements Boxzoom Eq 1:bte lon1 lon2 lat1 lat2 0 boxzoom 0 N_Elements Boxzoom Eq 2:bte lon1 lon2 lat1 lat2 boxzoom 0 boxzoom 1 N_Elements Boxzoom Eq 4:bte Boxzoom vert1 vert2 N_Elements Boxzoom Eq 5:bte Boxzoom 0:3 0 Boxzoom 4 N_Elements Boxzoom Eq 6:bte Boxzoom Else: return report Bad definition of Boxzoom endcase if NOT keyword_set nodomdef then BEGIN savedbox 1b saveboxparam boxparam4moyenne dat domdef bte GRIDTYPE vargrid _extra ex ENDIF ENDIF attribution of the mask and of longitude and latitude arrays IF vargrid EQ W THEN wdepth 1 grille mask glam gphi gdep nx ny nz firstx firsty firstz lastx lasty lastz e1 e2 e3 WDEPTH wdepth II Case of the 1d array if dim EQ 1d then BEGIN if n_elements tab NE nx ny AND n_elements tab NE nx ny nz then BEGIN if keyword_set savedbox THEN restoreboxparam boxparam4moyenne dat return report Probleme d adequation entre les tailles du domaine et de la boxzoom ENDIF case 1 of nx EQ 1 AND ny EQ 1:BEGIN vector following z case n_elements tab of jpk:res tab firstz:lastz nz:res tab ELSE:BEGIN if keyword_set savedbox THEN restoreboxparam boxparam4moyenne dat return report Probleme d adequation entre les tailles du domaine et de la boxzoom END ENDCASE if dirz EQ 1 then BEGIN dim 3d taille size reform res nx ny nz ENDIF ELSE BEGIN if keyword_set savedbox THEN restoreboxparam boxparam4moyenne dat return res ENDELSE END ny EQ 1:BEGIN vector following x case n_elements tab of jpi:res tab firstx:lastx nx:res tab ELSE:BEGIN if keyword_set savedbox THEN restoreboxparam boxparam4moyenne dat return report Probleme d adequation entre les tailles du domaine et de la boxzoom END ENDCASE if dirx EQ 1 then BEGIN dim 2d taille size reform res nx ny ENDIF ELSE BEGIN if keyword_set savedbox THEN restoreboxparam boxparam4moyenne dat return res ENDELSE END nx EQ 1:BEGIN vector following y case n_elements tab of jpj:res tab firsty:lasty ny:res tab ELSE:BEGIN if keyword_set savedbox THEN restoreboxparam boxparam4moyenne dat return report Probleme d adequation entre les tailles du domaine et de la boxzoom END ENDCASE if diry EQ 1 then BEGIN dim 2d taille size reform res nx ny ENDIF ELSE BEGIN if keyword_set savedbox THEN restoreboxparam boxparam4moyenne dat return res ENDELSE END endcase endif II Case of the 2d array if dim eq 2d then begin II 1 verification of the coherence of the array s size to average Verification of the coherence between the array s size and the domain defined by domdef The input array must have either the total domain s size jpi jpj or this one of the reduced domain nx ny case 1 of taille 1 eq jpi and taille 2 eq jpj: res tab firstx:lastx firsty:lasty taille 1 eq nx and taille 2 eq ny:res tab else:BEGIN if keyword_set savedbox THEN restoreboxparam boxparam4moyenne dat return report Probleme d adequation entre les tailles du domaine nx ny strtrim nx 1 strtrim ny 1 et du tableau strtrim taille 1 1 strtrim taille 2 1 END ENDCASE if keyword_set nan NE 0 then BEGIN if nan NE 1 then BEGIN If nan is not values f_nan we put it at values f_nan if abs nan LT 1e6 then notanumber where res EQ nan ELSE notanumber where abs res GT abs nan 10 if notanumber 0 NE 1 then res temporary notanumber values f_nan ENDIF ENDIF Comment : WE HAVE TO BE CAREFUL ABOUT CASES WHERE THE DIMENSION TO AVERAGE 1 AND MAKE SURE THAT IT EXIST THAT IS WHY WE USE reform nx ny WHICH CAN LOOK USELESS AT THE BEGINNING if nx EQ 1 OR ny EQ 1 then BEGIN res reform res nx ny over e1 reform e1 nx ny over e2 reform e2 nx ny over endif if nx EQ 1 OR ny EQ 1 OR nz EQ 1 THEN mask reform mask nx ny nz over II 3 Different types of average mask mask 0 if keyword_set nan NE 0 then msknan finite res ELSE msknan 1 case 1 of dirx eq 1 and diry eq 0 : begin e e1 mask if keyword_set integration then divi 1 else begin divi e IF msknan 0 NE 1 THEN divi temporary divi msknan if ny EQ 1 then divi reform divi nx ny over divi total divi 1 endelse res res e if ny EQ 1 then res reform res nx ny over res total res 1 nan nan divi 1 if msknan 0 NE 1 then begin testnan msknan mask if ny EQ 1 then testnan reform testnan nx ny over testnan total testnan 1 total mask 1 EQ 0 endif end dirx eq 0 and diry eq 1 : begin e e2 mask if keyword_set integration then divi 1 else begin divi e IF msknan 0 NE 1 THEN divi temporary divi msknan if ny EQ 1 then divi reform divi nx ny over divi total divi 2 endelse res res e if ny EQ 1 then res reform res nx ny over res total res 2 nan nan divi 1 if msknan 0 NE 1 then begin testnan msknan mask if ny EQ 1 then testnan reform testnan nx ny over testnan total testnan 2 total mask 2 EQ 0 endif end dirx eq 1 and diry eq 1 : begin if keyword_set integration then divi 1 else BEGIN IF msknan 0 NE 1 THEN divi total e1 e2 mask msknan ELSE divi total e1 e2 mask ENDELSE res total res e1 e2 mask nan nan divi 1 if msknan 0 NE 1 then begin testnan msknan mask testnan total testnan total mask EQ 0 endif end endcase endif III Case 3d arrays series tab4d if dim eq 3d then begin III 1 Verification of the coherence of the array to average size Verification of the coherence between the array s size and the domain defind by domdef The input array must have either the total domain size jpi jpj jpk or this one of the reduced domain nx ny ny case 1 of taille 1 eq jpi and taille 2 eq jpj and taille 3 eq jpk: res tab firstx:lastx firsty:lasty firstz:lastz taille 1 eq jpi and taille 2 eq jpj and taille 3 eq nz: res tab firstx:lastx firsty:lasty taille 1 EQ nx and taille 2 eq ny and taille 3 eq nz :res tab taille 1 EQ nx and taille 2 eq ny and taille 3 eq jpk : res tab firstz:lastz else:BEGIN if keyword_set savedbox THEN restoreboxparam boxparam4moyenne dat return report Probleme d adequation entre les tailles du domaine nx ny nz strtrim nx 1 strtrim ny 1 strtrim nz 1 et du tableau strtrim taille 1 1 strtrim taille 2 1 strtrim taille 3 1 END endcase if keyword_set nan NE 0 then BEGIN if nan NE 1 then BEGIN if nan is not values f_nan we put it at values f_nan if abs nan LT 1e6 then notanumber where res EQ nan ELSE notanumber where abs res GT abs nan 10 if notanumber 0 NE 1 then res temporary notanumber values f_nan ENDIF ENDIF Comment : WE HAVE TO BE CAREFUL ABOUT CASES WHERE THE DIMENSION TO AVERAGE 1 AND MAKE SURE THAT IT EXIST THAT IS WHY WE USE reform nx ny WHICH CAN LOOK USELESS AT THE BEGINNING if nx EQ 1 OR ny EQ 1 OR nz EQ 1 then BEGIN res reform res nx ny nz over e1 reform e1 nx ny over e2 reform e2 nx ny over endif if nx EQ 1 OR ny EQ 1 OR nz EQ 1 THEN mask reform mask nx ny nz over IF keyword_set key_partialstep THEN BEGIN the top of the ocean floor is IF vargrid EQ T OR vargrid EQ W THEN bottom total mask 3 ELSE bottom total tmask firstx:lastx firsty:lasty firstz:lastz 3 we suppress columns with only ocean or land good where bottom NE 0 AND bottom NE nz the bottom of the ocean in 3D index is: bottom lindgen nx ny temporary bottom 1L nx ny IF good 0 NE 1 THEN bottom bottom good ELSE bottom 1 ENDIF ELSE bottom 1 III 2 different average types if keyword_set nan NE 0 then msknan finite res ELSE msknan 1 case 1 of dirx eq 1 and diry eq 0 and dirz eq 0 : begin e13 e1 replicate 1 nz e13 reform e13 nx ny nz over IF keyword_set key_partialstep AND bottom 0 NE 1 AND nx NE 1 THEN BEGIN IF msknan 0 EQ 1 THEN BEGIN msknan replicate 1b nx ny nz nan 1 endif msknan bottom 0 res bottom values f_nan ENDIF if keyword_set integration then divi 1 else begin divi e13 mask IF msknan 0 NE 1 THEN divi temporary divi msknan if nz EQ 1 then divi reform divi nx ny nz over divi total divi 1 ENDELSE res res e13 mask if nz EQ 1 then res reform res nx ny nz over res total res 1 nan nan divi 1 e13 1 if msknan 0 NE 1 then begin testnan msknan mask if nz EQ 1 then testnan reform testnan nx ny nz over testnan total testnan 1 total mask 1 EQ 0 endif end dirx eq 0 and diry eq 1 and dirz eq 0 : begin e23 e2 replicate 1 nz e23 reform e23 nx ny nz over IF keyword_set key_partialstep AND bottom 0 NE 1 AND ny NE 1 THEN BEGIN IF msknan 0 EQ 1 THEN BEGIN msknan replicate 1b nx ny nz nan 1 endif msknan bottom 0 res bottom values f_nan ENDIF if keyword_set integration then divi 1 else begin divi e23 mask IF msknan 0 NE 1 THEN divi temporary divi msknan if nz EQ 1 then divi reform divi nx ny nz over divi total divi 2 ENDELSE res res e23 mask if nz EQ 1 then res reform res nx ny nz over res total res 2 nan nan divi 1 e23 1 if msknan 0 NE 1 then begin testnan msknan mask if nz EQ 1 then testnan reform testnan nx ny nz over testnan total testnan 2 total mask 2 EQ 0 endif end dirx eq 0 and diry eq 0 and dirz eq 1 : begin e33 replicate 1 1 nx ny e3 e33 reform e33 nx ny nz over IF keyword_set key_partialstep AND bottom 0 NE 1 THEN BEGIN IF keyword_set wdepth THEN e33 bottom e3w_ps firstx:lastx firsty:lasty temporary good ELSE e33 bottom e3t_ps firstx:lastx firsty:lasty temporary good ENDIF if keyword_set integration then divi 1 else begin divi e33 mask if msknan 0 NE 1 then divi temporary divi msknan if nz EQ 1 then divi reform divi nx ny nz over divi total divi 3 ENDELSE res res e33 mask if nz EQ 1 then res reform res nx ny nz over res total res 3 nan nan divi 1 e33 1 if msknan 0 NE 1 then begin testnan msknan mask if nz EQ 1 then testnan reform testnan nx ny nz over testnan total testnan 3 total mask 3 EQ 0 endif end dirx eq 1 and diry eq 1 and dirz eq 0 : begin e123 e1 e2 replicate 1 nz e123 reform e123 nx ny nz over IF keyword_set key_partialstep AND bottom 0 NE 1 AND nx ny NE 1 THEN BEGIN IF msknan 0 EQ 1 THEN BEGIN msknan replicate 1b nx ny nz nan 1 endif msknan bottom 0 res bottom values f_nan ENDIF if keyword_set integration then divi 1 else BEGIN divi e123 mask IF msknan 0 NE 1 THEN divi temporary divi msknan if nz EQ 1 then divi reform divi nx ny nz over divi total total divi 1 1 ENDELSE res res e123 mask if nz EQ 1 then res reform res nx ny nz over res total total res 1 nan nan 1 nan nan divi 1 e123 1 if msknan 0 NE 1 then begin testnan msknan mask if nz EQ 1 then testnan reform testnan nx ny nz over testnan total total testnan 1 1 total total mask 1 1 EQ 0 endif end dirx eq 1 and diry eq 0 and dirz eq 1 : begin e133 e1 e3 e133 reform e133 nx ny nz over IF keyword_set key_partialstep AND bottom 0 NE 1 THEN BEGIN IF keyword_set wdepth THEN e133 bottom e1 e3w_ps firstx:lastx firsty:lasty temporary good ELSE e133 bottom e1 e3t_ps firstx:lastx firsty:lasty temporary good ENDIF if keyword_set integration then divi 1 else BEGIN divi e133 mask if msknan 0 NE 1 then divi temporary divi msknan if nz EQ 1 then divi reform divi nx ny nz over divi total total divi 1 2 ENDELSE res res e133 mask if nz EQ 1 then res reform res nx ny nz over res total total res 1 nan nan 2 nan nan divi 1 e133 1 if msknan 0 NE 1 then begin testnan msknan mask if nz EQ 1 then testnan reform testnan nx ny nz over testnan total total testnan 1 2 total total mask 1 2 EQ 0 endif end dirx eq 0 and diry eq 1 and dirz eq 1 : begin e233 e2 e3 e233 reform e233 nx ny nz over IF keyword_set key_partialstep AND bottom 0 NE 1 THEN BEGIN IF keyword_set wdepth THEN e233 bottom e2 e3w_ps firstx:lastx firsty:lasty temporary good ELSE e233 bottom e2 e3t_ps firstx:lastx firsty:lasty temporary good ENDIF if keyword_set integration then divi 1 else BEGIN divi e233 mask if msknan 0 NE 1 then divi temporary divi msknan if nz EQ 1 then divi reform divi nx ny nz over divi total total divi 2 2 ENDELSE res res e233 mask if nz EQ 1 then res reform res nx ny nz over res total total res 2 nan nan 2 nan nan divi 1 e233 1 if msknan 0 NE 1 then begin testnan msknan mask if nz EQ 1 then testnan reform testnan nx ny nz over testnan total total testnan 2 2 total total mask 2 2 EQ 0 endif end dirx eq 1 and diry eq 1 and dirz eq 1 : begin e1233 e1 e2 e3 e1233 reform e1233 nx ny nz over IF keyword_set key_partialstep AND bottom 0 NE 1 THEN BEGIN IF keyword_set wdepth THEN e1233 bottom e1 e2 e3w_ps firstx:lastx firsty:lasty temporary good ELSE e1233 bottom e1 e2 e3t_ps firstx:lastx firsty:lasty temporary good ENDIF if keyword_set integration then divi 1 else BEGIN if msknan 0 NE 1 then divi total e1233 mask msknan ELSE divi total e1233 mask ENDELSE res total res e1233 mask nan nan divi 1 e1233 1 if msknan 0 NE 1 then begin testnan msknan mask testnan total testnan total mask EQ 0 endif end endcase endif IV finishing IV 1 We mask land by a value equal to 1 e 20 valmask 1e 20 terre where divi EQ 0 IF terre 0 NE 1 THEN BEGIN res terre 1e 20 ENDIF IV 2 We replace when nan equal 1 values f_nan by nan if keyword_set nan NE 0 then BEGIN puttonan where testnan EQ 0 if puttonan 0 NE 1 then res puttonan values f_nan if nan NE 1 then BEGIN notanumber where finite res eq 0 if notanumber 0 NE 1 then res notanumber nan ENDIF ENDIF IV 3 We replace in the domain whch was defined at the entry of average if keyword_set savedbox THEN restoreboxparam boxparam4moyenne dat if keyword_set key_performance THEN print temps moyenne systime 1 tempsun return res end"); a[204] = new Array("./ToBeReviewed/CALCULS/projectondepth.html", "projectondepth.pro", "", " file_comments Allows to project a 3d field following a depth array categories Without loop param ARRAYIN type 3d array It is a 3d array whose 3rd dimension must be equal to jpk param DEPTHIN type 2d array It is a 2d array indicating for each point n at which depth to project returns A 2d array which is the projection of the 3d array following depths indicated by depthin uses common restrictions points at values f_nan impossible calculation Land points masked at valmask examples we build a possible depths array IDL a gdept jpk 1 1 jpi jpj findgen jpi jpj We build an array to project on these depths For the test we build a 3d array whose each vector following z is the depth IDL arraytest replicate 1 jpi jpj gdept IDL arraytest reform arraytest jpi jpj jpk over We test the projection of the depth array on the depth IDL plt 1e6 a projectondepth arraytest a nocontour null field at 1e 6 pres verification projecting the temperature of 20 C for example history Sebastien Masson smasson lodyc jussieu fr 15 6 2000 version Id: projectondepth pro 370 2008 08 07 07:59:15Z pinsard FUNCTION projectondepth arrayin depthin compile_opt idl2 strictarrsubs tempsun systime 1 To key_performance common depth litchamp depthin array litchamp arrayin Small verifications tailledepth size depth taillearray size array if tailledepth 0 NE 2 THEN return report Depth array must have 2 dimensions if taillearray 0 NE 3 THEN return report Array in must have 3 dimensions verification of the coherence between array s size and the domain grille mask 1 1 1 nx ny nz firstx firsty firstz lastx lasty lastz case 1 of tailledepth 1 eq jpi and tailledepth 2 eq jpj:depth depth firstx:lastx firsty:lasty tailledepth 1 eq nx and tailledepth 2 eq ny: else:return report Probleme d adequation entre les tailles du domaine et celle du tableau de profondeur endcase case 1 OF taillearray 3 NE jpk:return report 2d array must have its 3d dimension equal to jpk taillearray 1 eq jpi and taillearray 2 eq jpj:array array firstx:lastx firsty:lasty taillearray 1 eq nx and taillearray 2 eq ny: else:return report Probleme d adequation entre les tailles du domaine et celle du tableau de profondeur endcase c est parti flevel depth2floatlevel depth we delete points at values f_nan notanumber where finite flevel nan EQ 1 if notanumber 0 NE 1 then flevel notanumber 0 we sill delete land points at valmask for example flevel 0 flevel jpk 1 indexup level2index floor flevel indexlow nx ny indexup out where indexlow GE nx ny jpk 1 if out 0 NE 1 then indexlow out indexlow out nx ny weight flevel floor flevel res array indexup res res weight array indexlow res We put back points at values f_nan if notanumber 0 NE 1 then res notanumber values f_nan if out 0 NE 1 then res out values f_nan We mask land points at valmask if n_elements valmask EQ 0 then valmask 1e20 terre where temporary mask 0 EQ 0 if terre 0 NE 1 then res terre valmask if keyword_set key_performance THEN print temps projectondepth systime 1 tempsun return res end"); a[205] = new Array("./ToBeReviewed/CALCULS/remplit.html", "remplit.pro", "", " file_comments categories param ZINPUT keyword NAN keyword NITER keyword BASIQUE keyword MASK keyword FILLXDIR keyword FILLYDIR keyword FILLVAL keyword _EXTRA Used to pass keywords returns uses restrictions examples history version Id: remplit pro 327 2007 12 13 16:22:35Z pinsard Extrapole zinout jpi jpj sur les continents en utilisant les 4 plus proches voisins masques oceaniquement et construit un nouveau masque contenant l ancien masque oceanique PLUS les points extrapoles Reitere le processus niter fois C est pas clair essayez Nan: to fill the point which have the value values f_nan Without this keyword these point are not filling and stays at values f_nan todo seb FUNCTION remplit zinput NAN nan NITER niter BASIQUE basique MASK mask FILLXDIR fillxdir FILLYDIR fillydir FILLVAL fillval _EXTRA ex compile_opt idl2 strictarrsubs common tempsun systime 1 pour key_performance les points non remplis sont masques a valmask IF n_elements niter EQ 0 THEN niter 1 IF niter EQ 0 THEN return zinput z zinput if n_elements key_gridtype EQ 0 then key_gridtype c oldkey_gridtype key_gridtype keep only the first letter of the grid type key_gridtype strmid key_gridtype 0 1 if keyword_set basique then begin key_gridtype c nx size zinput 1 ny size zinput 2 if NOT keyword_set mask then mmmask basique ELSE mmmask mask ENDIF ELSE grille mmmask glam gphi gdep nx ny nz _extra ex if keyword_set mask then mmmask mask if size mmmask 0 EQ 3 THEN mmmask mmmask 0 if n_elements mmmask EQ 1 then mmmask replicate 1b nx ny if keyword_set nan then begin nanpoint where finite z EQ 0 if nanpoint 0 NE 1 then begin mmmask nanpoint 0b z nanpoint 0 endif ENDIF mmmask byte mmmask on ajoute un cadre de zero a z mask e1 e2 comme ca apres on peut faire des shifts ds tous les sens sans se soucier des bords du domaine tempdeux systime 1 pour key_performance 2 nx2 nx 2 case key_gridtype of c :BEGIN ztmp bytarr nx 2 ny 2 ztmp 1:nx 1:ny mmmask mmmask temporary ztmp ztmp fltarr nx 2 ny 2 ztmp 1:nx 1:ny z if keyword_set key_periodic AND nx EQ jpi then begin ztmp 0 1:ny z jpi 1 ztmp nx 1 1:ny z 0 endif z temporary ztmp END e :BEGIN ztmp bytarr nx 2 ny 4 ztmp 1:nx 2:ny 1 mmmask mmmask temporary ztmp ztmp fltarr nx 2 ny 4 ztmp 1:nx 2:ny 1 z if keyword_set key_periodic AND nx EQ jpi then begin ztmp 0 2:ny 1 z jpi 1 ztmp nx 1 2:ny 1 z 0 endif z temporary ztmp END endcase IF testvar var key_performance EQ 2 THEN print temps remplit: on ajoute un cadre de zero systime 1 tempdeux iteration FOR n 1 niter DO BEGIN on trouve les points coast tempdeux systime 1 pour key_performance 2 les points du bord du cadre ne doivent pas etre selectionnes comme la coast case key_gridtype of c :BEGIN mmmask 0 1b mmmask nx 1 1b mmmask 0 1b mmmask ny 1 1b END e :BEGIN mmmask 0 1b mmmask nx 1 1b mmmask 0:1 1b mmmask ny 2:ny 3 1b END endcase liste des points terre restant IF keyword_set fillxdir THEN BEGIN we stop if all the lines that contains data have been filled test total mmmask 1:nx 1 IF total test EQ 0 test EQ nx EQ ny 2 THEN GOTO fini ENDIF IF keyword_set fillydir THEN BEGIN we stop if all the columns that contains data have been filled test total mmmask 1:ny 2 IF total test EQ 0 test EQ ny EQ nx 2 THEN GOTO fini ENDIF land where mmmask EQ 0 if land 0 EQ 1 then GOTO fini les points du bord du cadre doivent maintenant etre dans la terre case key_gridtype of c :BEGIN mmmask 0 0b mmmask nx 1 0b mmmask 0 0b mmmask ny 1 0b END e :BEGIN mmmask 0 0b mmmask nx 1 0b mmmask 0:1 0b mmmask ny 2:ny 3 0b END endcase if keyword_set key_periodic AND nx EQ jpi then begin mmmask 0 mmmask nx mmmask nx 1 mmmask 1 endif liste des voisins mer case key_gridtype of c :BEGIN CASE 1 OF keyword_set fillxdir :weight mmmask 1 land mmmask 1 land keyword_set fillydir :weight mmmask nx2 land mmmask nx2 land ELSE:weight mmmask 1 land mmmask 1 land mmmask nx2 land mmmask nx2 land 1 sqrt 2 mmmask nx2 1 land mmmask nx2 1 land mmmask nx2 1 land mmmask nx2 1 land ENDCASE END e :BEGIN shifted glam 0 0 LT glam 0 1 oddeven land nx2 1 shifted MOD 2 weight mmmask 1 land mmmask 1 land mmmask 2 nx2 land mmmask 2 nx2 land sqrt 2 mmmask nx2 oddeven land mmmask nx2 1 oddeven land mmmask nx2 oddeven land mmmask nx2 1 oddeven land END endcase ok where weight GT 0 weight weight ok coast land temporary ok IF testvar var key_performance EQ 2 THEN print temps remplit: trouver la coast systime 1 tempdeux remplissage des points coast tempdeux systime 1 pour key_performance 2 on masque z z temporary z mmmask case key_gridtype of c :BEGIN CASE 1 OF keyword_set fillxdir :zcoast z 1 coast z 1 coast keyword_set fillydir :zcoast z nx2 coast z nx2 coast ELSE:zcoast z 1 coast z 1 coast z nx2 coast z nx2 coast 1 sqrt 2 z nx2 1 coast z nx2 1 coast z nx2 1 coast z nx2 1 coast ENDCASE END e :BEGIN oddeven coast nx2 1 shifted MOD 2 zcoast z 1 coast z 1 coast z 2 nx2 coast z 2 nx2 coast sqrt 2 z nx2 oddeven coast z nx2 1 oddeven coast z nx2 oddeven coast z nx2 1 oddeven coast END endcase z coast temporary zcoast temporary weight we update the boundary conditions of z if keyword_set key_periodic AND nx EQ jpi then begin z 0 z nx z nx 1 z 1 endif IV on reduit le masque mmmask temporary coast 1 IF testvar var key_performance EQ 2 THEN print temps remplit: une iteration systime 1 tempdeux ENDFOR fini: on masque les valeurs sur les lands restantes IF n_elements valmask EQ 0 then valmask 1e20 IF n_elements fillval EQ 0 THEN fillval valmask z temporary z mmmask fillval 1b mmmask on redecoupe le tableau pour retirer le cadre case key_gridtype of c :BEGIN z z 1:nx 1:ny END e :BEGIN z z 1:nx 2:ny 1 END endcase key_gridtype oldkey_gridtype if keyword_set key_performance THEN print temps remplit systime 1 tempsun return z END "); a[206] = new Array("./ToBeReviewed/CALCULS/rhon.html", "rhon.pro", "", " file_comments categories param SN param TN keyword INSITU keyword SIGMA_N returns uses restrictions examples history version Id: rhon pro 327 2007 12 13 16:22:35Z pinsard Calcul de la fonction d etat issue de eos F Creation : 1997 G Roullet adaptation pour les tableaux z zt xyz xyzt par seb todo seb FUNCTION rhon sn tn INSITU insitu SIGMA_N sigma_n compile_opt idl2 strictarrsubs common tempsun systime 1 pour key_performance sn 1e5 double sn double tn 1e5 IF keyword_set sigma_n then insitu 1 taille size sn case taille 0 of 0:BEGIN z zrhop 0d jkmax 1 END 1:BEGIN z zrhop dblarr taille 1 jkmax taille 1 END 2:BEGIN xy jpt 1 ou zt zrhop dblarr taille 1 taille 2 if jpt EQ 1 then jkmax 1 ELSE jkmax taille 1 END 3:BEGIN xyz jpt 1 ou xyt zrhop dblarr taille 1 taille 2 taille 3 if jpt EQ 1 then jkmax taille 3 ELSE jkmax 1 END 4:BEGIN xyzt zrhop dblarr taille 1 taille 2 taille 3 taille 4 jkmax taille 3 END endcase FOR jk 0 jkmax 1 DO BEGIN case taille 0 of 0:BEGIN z ztt tn zs sn END 1:BEGIN z ztt tn jk zs sn jk END 2:BEGIN xy jpt 1 ou zt if jpt EQ 1 then begin ztt tn zs sn ENDIF ELSE BEGIN ztt tn jk zs sn jk ENDELSE END 3:BEGIN xyz jpt 1 ou xyt if jpt EQ 1 then begin ztt tn jk zs sn jk endif ELSE BEGIN ztt tn zs sn ENDELSE END 4:BEGIN xyzt ztt tn jk zs sn jk END endcase if n_elements sigma_n NE 0 then zh 1000 sigma_n ELSE zh gdept jk square root salinity zsr sqrt abs zs compute density pure water at atm pressure zr1 6 536332e 9 ztt 1 120083e 6 ztt 1 001685e 4 ztt 9 095290e 3 ztt 6 793952e 2 ztt 999 842594 seawater density atm pressure zr2 5 3875e 9 ztt 8 2467e 7 ztt 7 6438e 5 ztt 4 0899e 3 ztt 0 824493 zr3 1 6546e 6 ztt 1 0227e 4 ztt 5 72466e 3 zr4 4 8314e 4 potential density reference to the surface case taille 0 of 0: zrhop zr4 zs zr3 zsr zr2 zs zr1 1: zrhop jk zr4 zs zr3 zsr zr2 zs zr1 2:BEGIN if jpt EQ 1 then zrhop zr4 zs zr3 zsr zr2 zs zr1 ELSE zrhop jk zr4 zs zr3 zsr zr2 zs zr1 END 3:BEGIN if jpt EQ 1 then zrhop jk zr4 zs zr3 zsr zr2 zs zr1 ELSE zrhop zr4 zs zr3 zsr zr2 zs zr1 END 4: zrhop jk zr4 zs zr3 zsr zr2 zs zr1 endcase IF n_elements insitu EQ 1 THEN BEGIN add the compression terms ze 3 508914e 8 ztt 1 248266e 8 ztt 2 595994e 6 zbw 1 296821e 6 ztt 5 782165e 9 ztt 1 045941e 4 zb zbw ze zs zd 2 042967e 2 zc 7 267926e 5 ztt 2 598241e 3 ztt 0 1571896 zaw 5 939910e 6 ztt 2 512549e 3 ztt 0 1028859 ztt 4 721788 za zd zsr zc zs zaw zb1 0 1909078 ztt 7 390729 ztt 55 87545 za1 2 326469e 3 ztt 1 553190 ztt 65 00517 ztt 1044 077 zkw 1 361629e 4 ztt 1 852732e 2 ztt 30 41638 ztt 2098 925 ztt 190925 6 zk0 zb1 zsr za1 zs zkw masked in situ density case taille 0 of 0: zrhop zrhop 1 0 zh zk0 zh za zh zb 1: zrhop jk zrhop jk 1 0 zh zk0 zh za zh zb 2:BEGIN if jpt EQ 1 then zrhop zrhop 1 0 zh zk0 zh za zh zb ELSE zrhop jk zrhop jk 1 0 zh zk0 zh za zh zb END 3:BEGIN if jpt EQ 1 then zrhop jk zrhop jk 1 0 zh zk0 zh za zh zb ELSE zrhop zrhop 1 0 zh zk0 zh za zh zb END 4: zrhop jk zrhop jk 1 0 zh zk0 zh za zh zb endcase ENDIF ENDFOR terre where tn GE 1e6 if terre 0 NE 1 then zrhop terre valmask if keyword_set key_performance THEN print temps rhon systime 1 tempsun return zrhop END"); a[207] = new Array("./ToBeReviewed/CALENDRIER/def_month.html", "def_month.pro", "", " file_comments categories param TIMAVE param DATE returns uses restrictions examples history version Id: def_month pro 232 2007 03 20 16:59:36Z pinsard todo seb FUNCTION def_month timave date translate month number in string compile_opt idl2 strictarrsubs IF strpos date _ GT 1 THEN date strmid date 0 strpos date _ CASE strmid timave 0 2 OF 1m : BEGIN CASE strmid date strlen date 2 2 OF 01 : mn January 02 : mn February 03 : mn March 04 : mn April 05 : mn May 06 : mn June 07 : mn July 08 : mn August 09 : mn September 10 : mn October 11 : mn November 12 : mn December ELSE: mn ENDCASE END 3m : BEGIN CASE strmid date strlen date 2 2 OF 01 : mn DJF 02 : mn MMA 03 : mn JJA 04 : mn SON ELSE: mn ENDCASE END ELSE: ENDCASE return mn END "); a[208] = new Array("./ToBeReviewed/COULEURS/palit.html", "palit.pro", "", " file_comments Clarify the current palette playing with brightness param COEF in required The rule of attenuation of colors divide by 2 the brightness by default param RED param GREEN param BLUE todo Seb: compl ter param red green blue PRO palit coef red green blue compile_opt idl2 strictarrsubs IF n_elements coef EQ 0 THEN coef 0 5 IF n_elements red EQ 0 THEN tvlct red green blue get color_convert red green blue h l s rgb_hls l 1 coef 1 l Black must stay really black Each palette starts by Black and ends by white l 0 0 tvlct h l s hls return END"); a[209] = new Array("./ToBeReviewed/GRILLE/changegrid.html", "changegrid.pro", "", " file_comments categories param NEWGRID returns uses restrictions examples history version Id: changegrid pro 325 2007 12 06 10:04:53Z pinsard todo seb FUNCTION changegrid newgrid compile_opt idl2 strictarrsubs cm_4mesh if cmpgrid newgrid EQ 0 then return 0 update the common paramaters ccmeshparameters newgrid ixminmesh newgrid ixminmesh ixmaxmesh newgrid ixmaxmesh iyminmesh newgrid iyminmesh iymaxmesh newgrid iymaxmesh izminmesh newgrid izminmesh izmaxmesh newgrid izmaxmesh read the new file loadgrid newgrid filename IF NOT keyword_set key_forgetold THEN BEGIN updateold ENDIF return 1 end"); a[210] = new Array("./ToBeReviewed/GRILLE/cmpgrid.html", "cmpgrid.pro", "", " file_comments categories param NEWGRID returns uses restrictions examples history version Id: cmpgrid pro 325 2007 12 06 10:04:53Z pinsard todo seb FUNCTION cmpgrid newgrid compile_opt idl2 strictarrsubs common newgrid must be a structure if size newgrid type NE 8 then return 0 does ccmeshparameters exist if n_elements ccmeshparameters EQ 0 then return 1 we compare the structure which characterise the grid with ccmeshparameters case 1 of ccmeshparameters jpiglo NE newgrid jpiglo: ccmeshparameters jpjglo NE newgrid jpjglo: ccmeshparameters jpkglo NE newgrid jpkglo: ccmeshparameters jpi NE newgrid jpi: ccmeshparameters jpj NE newgrid jpj: ccmeshparameters jpk NE newgrid jpk: total ccmeshparameters glaminfo newgrid glaminfo NE 0: total ccmeshparameters gphiinfo newgrid gphiinfo NE 0: ccmeshparameters ixminmesh NE newgrid ixminmesh: ccmeshparameters ixmaxmesh NE newgrid ixmaxmesh: ccmeshparameters iyminmesh NE newgrid iyminmesh: ccmeshparameters iymaxmesh NE newgrid iymaxmesh: ccmeshparameters izminmesh NE newgrid izminmesh: ccmeshparameters izmaxmesh NE newgrid izmaxmesh: ccmeshparameters key_shift NE newgrid key_shift: ccmeshparameters key_periodic NE newgrid key_periodic: array_equal ccmeshparameters key_stride newgrid key_stride EQ 0: ccmeshparameters key_gridtype NE newgrid key_gridtype: ccmeshparameters key_yreverse NE newgrid key_yreverse: ccmeshparameters key_zreverse NE newgrid key_zreverse: ccmeshparameters key_partialstep NE newgrid key_partialstep: ccmeshparameters key_onearth NE newgrid key_onearth: ELSE:return 0 endcase return 1 end"); a[211] = new Array("./ToBeReviewed/GRILLE/decoupeterre.html", "decoupeterre.pro", "", " file_comments Similar to grille Here when vargrid is not T or W we have to recuperate tmask glamt gphit and the array of triangulation on the considered sub domain for the drawing The specificity of decoupeterre in comparaison with grille is that we take if possible a sub domain just a little bit bigger than the one defined by domdef in order to be sure that the mask we draw will cover over all the drawing categories Grid param MASK param GLAM param GPHI param GDEP keyword TYPE keyword INDICEZOOM keyword COINMONTE keyword COINDESCEND keyword REALSECTION keyword USETRI keyword MASKDTA 2d array defining the mask that must be applied to the data instead of the default mask which is defined according to the grid t u v f mask keyword _EXTRA Used to pass keywords keyword TRI This keyword serve to obtain thanks to grille the triangulation which refer to the grid but only on the part of the zoom This array of triangulation is passed in the variable we have equate at TRI For example: grille tri triangulation_reduite This keyword is used in plt keyword WDEPTH To specify that the field is at W depth instead of T depth automatically activated if vargrid eq W uses common history Sebastien Masson smasson lodyc jussieu fr 24 2 99 version Id: decoupeterre pro 388 2008 12 09 09:36:41Z smasson todo seb : manque tous les param et plein de keywords PRO decoupeterre mask glam gphi gdep TYPE type TRI tri INDICEZOOM indicezoom COINMONTE coinmonte COINDESCEND coindescend MASKDTA maskdta WDEPTH wdepth REALSECTION realsection USETRI usetri _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh cm_4data IF NOT keyword_set key_forgetold THEN BEGIN updatenew ENDIF tempsun systime 1 For key_performance if vargrid EQ W then wdepth 1 horizontal parameters if possible extent the domain according to the grid type default case case vargrid of U :BEGIN firstx 0 min firstxt firstxu 1 lastx max lastxt lastxu 1 min firstyt firstyu 1 lasty max lastyt lastyu 1 min firstxt firstxv 1 lastx max lastxt lastxv 1 min firstyt firstyv 1 lasty max lastyt lastyv 1 min firstxt firstxf 1 lastx max lastxt lastxf 1 min firstyt firstyf 1 lasty max lastyt lastyf 1 firstx 1 :lastx firsty:lasty ELSE glam glamu 0 firstx 1 :lastx firsty:lasty ENDELSE END yz :BEGIN if keyword_set realsection EQ 0 then begin if vargrid EQ U OR vargrid EQ F then gphi gphiu firstx:lastx firsty:lasty ENDIF ELSE BEGIN to drawsectionbottom if vargrid EQ U OR vargrid EQ F OR finite gphiv 0 EQ 0 then gphi gphif firstx:lastx 0 firsty 1 :lasty ELSE gphi gphiv firstx:lastx 0 firsty 1 :lasty ENDELSE END ELSE: ENDCASE vertical boundaries if keyword_set wdepth then begin firstzw 0 min firstzt firstzw 1 lastzw max lastzt lastzw 1 jpk 1 nzw lastzw firstzw 1 firstz firstzw lastz lastzw nz nzw ENDIF ELSE BEGIN firstz firstzt lastz lastzt nz nzt ENDELSE mask IF keyword_set maskdta THEN BEGIN mask byte fitintobox maskdta IF keyword_set wdepth THEN BEGIN mask shift temporary mask 0 1 mask 0 0b ENDIF ENDIF ELSE BEGIN case type of xy :BEGIN mask tmask firstx:lastx firsty:lasty firstz profond firstz NE 0 END for the vertical section we have to choose the right mask according to the grid point and to the direction of the section xz :BEGIN if vargrid EQ V OR vargrid EQ F then begin mask vmask firstx:lastx firstyv:lastyv firstz:lastz ENDIF ELSE mask tmask firstx:lastx firsty:lasty firstz:lastz END yz :BEGIN if vargrid EQ U OR vargrid EQ F then begin mask umask firstxu:lastxu firsty:lasty firstz:lastz ENDIF ELSE mask tmask firstx:lastx firsty:lasty firstz:lastz END ELSE:mask tmask firstx:lastx firsty:lasty firstz:lastz ENDCASE ENDELSE vertical axis when we do a real section we directly plot the gdepw in drawsectionbottom pro instead of contouring the mask at 0 5 at gdept IF keyword_set realsection EQ 0 then gdep gdept firstz:lastz ELSE BEGIN if lastz EQ jpk 1 then we add some fictive very deep level that will not be used but that is necessary to avoid array size bugs in draw bottom section gdep gdepw firstz 1:lastz 2 gdept jpk 1 ELSE gdep gdepw firstz 1:lastz 1 gdep gdepw firstz:lastz special case when we are using the partial steps in the vertical section that are only 1 point wide in that case the z axis is a 2d array and we modify the depth of the last level ocean with hdepw that is the real depth of the bottom in domzgr: hdepw ji jj gdepw ji jj ik 1 CASE 1 OF keyword_set key_partialstep AND type EQ xz AND ny EQ 1 AND keyword_set realsection :BEGIN bottom total mask 3 keyword_set maskdta good where bottom NE 0 AND bottom NE nz IF good 0 NE 1 THEN BEGIN bottom lindgen nx bottom nx bottom bottom good gdep replicate 1 nx gdep truegdep hdepw firstx:lastx firsty:lasty gdep bottom truegdep good ENDIF END keyword_set key_partialstep AND type EQ yz AND nx EQ 1 AND keyword_set realsection :BEGIN bottom total mask 3 keyword_set maskdta good where bottom NE 0 AND bottom NE nz IF good 0 NE 1 THEN BEGIN bottom lindgen ny bottom ny bottom bottom good gdep replicate 1 ny gdep truegdep hdepw firstx:lastx firsty:lasty gdep bottom truegdep good ENDIF END ELSE: ENDCASE ENDELSE Triangulation vector when TRI is activated IF arg_present TRI then if triangles_list 0 EQ 1 OR usetri LT 1 then tri 1 ELSE BEGIN If we are tracing a deep level we redo the triangulation if keyword_set profond then begin tri triangule mask coinmonte coinmonte coindescend coindescend _extra ex indicezoom lindgen jpi jpj firstx:lastx firsty:lasty ENDIF ELSE BEGIN Otherwise we recuperate the part of triangulation that interest us and we number them well if nx EQ jpi AND ny EQ jpj then tri triangles_list ELSE BEGIN msk bytarr jpi jpj msk firstx:lastx firsty:lasty 1 ind where msk triangles_list 0 EQ 1 AND msk triangles_list 1 EQ 1 AND msk triangles_list 2 EQ 1 tri triangles_list ind firstx firsty jpi y tri jpi x tri y jpi tri x y nx ENDELSE ENDELSE ENDELSE if keyword_set key_performance THEN print temps decoupeterre systime 1 tempsun return end"); a[212] = new Array("./ToBeReviewed/GRILLE/domdef.html", "domdef.pro", "", " file_comments Allows to extract a sub domain of study by providing parameters needed for drawings see outputs categories Grid param Z1 in optional For a 3d domain whose the horizontal part cover all glam param Z2 in optional For a 3d domain whose the horizontal part cover all gphi param X1 in optional Define the minimum longitude All levels are selected param X2 in optional Define the maximum longitude All levels are selected param Y1 in optional Define the minimum latitude All levels are selected param Y2 in optional Define the maximum latitude All levels are selected keyword ENDPOINTS type vector A four elements vector x1 y1 x2 y2 used to specify that domdef must define the box used to make a plot pltz pltt plt1d done strictly along the line that can have any direction starting at x1 y1 ending at x2 y2 When defining endpoints you must also define TYPE which define the type of plots pltz xt yt zt x y z t will used ENDPOINTS keywords keyword FINDALWAYS Force to redefine a box even when none point is find in the box In this case we select all the grid keyword GRIDTYPE type string or vector It is a string or a vector of strings containing the grids s name Only determined by T U V W F for which the calculation must be done For example: T or T U keyword MEMEINDICES It is possible that points T U V and F correspond to a same geographic box which do not concern the same array indexes This is sometimes a problem or at least serious complications in programs where several type of grid intervene see norme curl Activate MEMEINDICES to force domdef to take same indexes those of the grid T for all other grids keyword INDEX We activate it if we want that all elements passed in input of domdef refer to indexes of glam gphi and gdep arrays rather than to values of these arrays keyword TYPE keyword XINDEX We activate it if we want that all elements passed in input of domdef and concerning the X dimension refer to indexes of glam arrays rather than to values of these arrays keyword YINDEX We activate it if we want that all elements passed in input of domdef and concerning the X dimension refer to indexes of gphi arrays rather than to values of these arrays keyword ZINDEX We activate it if we want that all elements passed in input of domdef and concerning the X dimension refer to indexes of gdep arrays rather than to values of these arrays uses common history Sebastien Masson smasson lodyc jussieu fr 8 2 98 rewrite everything debug and speed up Sebastien Masson April 2005 version Id: domdef pro 393 2009 02 20 15:39:43Z smasson todo seb: output pas clair pas d input required PRO domdef x1 x2 y1 y2 z1 z2 FINDALWAYS findalways GRIDTYPE gridtype MEMEINDICES memeindices XINDEX xindex YINDEX yindex ZINDEX zindex ENDPOINTS endpoints TYPE type INDEX index _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh IF NOT keyword_set key_forgetold THEN BEGIN updatenew updatekwd ENDIF tempsun systime 1 For key_performance CASE N_PARAMS OF 0: 1: 2: 4: 6: ELSE:BEGIN ras report Bad number of parameter in the call of domdef RETURN END ENDCASE IF keyword_set endpoints THEN BEGIN IF NOT keyword_set type THEN BEGIN dummy report If domdef is used do find the box associated to endpoints you must also specify type keyword return ENDIF CASE N_PARAMS OF 0: 1:boxzoom x1 2:boxzoom x1 x2 4:boxzoom x1 x2 y1 y2 6:boxzoom x1 x2 y1 y2 z1 z2 ENDCASE section BOXZOOM boxzoom ENDPOINTS endpoints TYPE type ONLYBOX return ENDIF recall domdef when there is only one input parameter IF N_PARAMS EQ 1 THEN BEGIN CASE n_elements x1 OF 2:domdef x1 0 x1 1 FINDALWAYS findalways GRIDTYPE gridtype MEMEINDICES memeindices XINDEX xindex YINDEX yindex ZINDEX zindex INDEX index _extra ex 4:domdef x1 0 x1 1 x1 2 x1 3 FINDALWAYS findalways GRIDTYPE gridtype MEMEINDICES memeindices XINDEX xindex YINDEX yindex ZINDEX zindex INDEX index _extra ex 6:domdef x1 0 x1 1 x1 2 x1 3 x1 4 x1 5 FINDALWAYS findalways GRIDTYPE gridtype MEMEINDICES memeindices XINDEX xindex YINDEX yindex ZINDEX zindex INDEX index _extra ex ELSE:BEGIN ras report Bad number of elements in x1 RETURN END ENDCASE RETURN ENDIF default definitions and checks IF NOT keyword_set gridtype THEN gridtype T U V W F ELSE gridtype strupcase gridtype IF keyword_set memeindices THEN gridtype T gridtype IF finite glamu 0 eq 0 THEN gridtype gridtype where gridtype NE U IF finite glamv 0 eq 0 THEN gridtype gridtype where gridtype NE V default definitions lon1t 99999 lon2t 99999 lat1t 99999 lat2t 99999 lon1u 99999 lon2u 99999 lat1u 99999 lat2u 99999 lon1v 99999 lon2v 99999 lat1v 99999 lat2v 99999 lon1f 99999 lon2f 99999 lat1f 99999 lat2f 99999 vert1t 99999 vert2t 99999 vert1w 99999 vert2w 99999 IF jpj EQ 1 THEN BEGIN IF where gridtype eq T 0 NE 1 OR where gridtype EQ W 0 NE 1 THEN BEGIN glamt reform glamt jpi jpj over gphit reform gphit jpi jpj over ENDIF IF where gridtype eq U 0 NE 1 THEN BEGIN glamu reform glamu jpi jpj over gphiu reform gphiu jpi jpj over ENDIF IF where gridtype eq V 0 NE 1 THEN BEGIN glamv reform glamv jpi jpj over gphiv reform gphiv jpi jpj over ENDIF IF where gridtype eq F 0 NE 1 THEN BEGIN glamf reform glamf jpi jpj over gphif reform gphif jpi jpj over ENDIF ENDIF IF N_PARAMS EQ 2 THEN GOTO vertical define all horizontal parameters lon1 and lon2 lat1 and lat2 firstx tuvf lastx tuvf nx tuvf check if the grid is defined for U and V points If not take care of the cases gridtype eq U or V errstatus 0 IF finite glamu 0 gphiu 0 EQ 0 OR n_elements glamu EQ 0 OR n_elements gphiu EQ 0 AND where gridtype eq U 0 NE 1 THEN BEGIN firstxu values f_nan lastxu values f_nan nxu values f_nan okgrid where gridtype NE U count IF count NE 0 THEN gridtype gridtype okgrid ELSE errstatus report U grid is undefined Impossible to call domdef with vargid U ENDIF IF finite glamv 0 gphiv 0 EQ 0 OR n_elements glamv EQ 0 OR n_elements gphiv EQ 0 AND where gridtype eq V 0 NE 1 THEN BEGIN firstxv values f_nan lastxv values f_nan nxv values f_nan okgrid where gridtype NE V count IF count NE 0 THEN gridtype gridtype okgrid ELSE errstatus report V grid is undefined Impossible to call domdef with vargid V ENDIF IF errstatus EQ 1 THEN return horizontal domain defined with lon1 lon2 lat1 and lat2 IF N_PARAMS EQ 0 OR N_PARAMS EQ 4 OR N_PARAMS EQ 6 AND NOT keyword_set xindex AND NOT keyword_set yindex AND NOT keyword_set index THEN BEGIN IF N_PARAMS EQ 0 THEN BEGIN find lon1 and lon2 the longitudinal boundaries of the full domain IF where gridtype eq T 0 NE 1 THEN lon1t min glamt max lon2t IF where gridtype eq W 0 NE 1 AND where gridtype eq T 0 EQ 1 THEN lon1t min glamt max lon2t IF where gridtype eq U 0 NE 1 THEN lon1u min glamu max lon2u IF where gridtype eq V 0 NE 1 THEN lon1v min glamv max lon2v IF where gridtype eq F 0 NE 1 THEN lon1f min glamf max lon2f lon1 min lon1t lon1u lon1v lon1f lon2 max lon2t lon2u lon2v lon2f find lat1 and lat2 the latitudinal boundaries of the full domain IF where gridtype eq T 0 NE 1 THEN lat1t min gphit max lat2t IF where gridtype eq W 0 NE 1 AND where gridtype eq T 0 EQ 1 THEN lat1t min gphit max lat2t IF where gridtype eq U 0 NE 1 THEN lat1u min gphiu max lat2u IF where gridtype eq V 0 NE 1 THEN lat1v min gphiv max lat2v IF where gridtype eq F 0 NE 1 THEN lat1f min gphif max lat2f lat1 min lat1t lat1u lat1v lat1f lat2 max lat2t lat2u lat2v lat2f ENDIF ELSE BEGIN lon1 min x1 x2 max lon2 lat1 min y1 y2 max lat2 ENDELSE find firstxt firstxt nxt and nyt according to lon1 lon2 lat1 and lat2 IF where gridtype eq T 0 NE 1 OR where gridtype EQ W 0 NE 1 THEN BEGIN dom where glamt GE lon1 AND glamt LE lon2 AND gphit GE lat1 AND gphit LE lat2 IF dom 0 EQ 1 THEN BEGIN IF keyword_set findalways THEN BEGIN ras report WARNING empty T points box we get the neighbors to define a new box neig1 neighbor lon1 lat1 glamt gphit sphere keyword_set key_onearth keyword_set key_irregular neig2 neighbor lon2 lat2 glamt gphit sphere keyword_set key_onearth keyword_set key_irregular CASE N_PARAMS OF 4:domdef min glamt neig1 max glamt neig2 min gphit neig1 max gphit neig2 GRIDTYPE gridtype MEMEINDICES memeindices ZINDEX zindex _extra ex 6:domdef min glamt neig1 max glamt neig2 min gphit neig1 max gphit neig2 z1 z2 GRIDTYPE gridtype MEMEINDICES memeindices ZINDEX zindex _extra ex ENDCASE RETURN ENDIF ELSE BEGIN ras report WARNING The box does not contain any T points firstxt 1 lastxt 1 nxt 0 firstyt 1 lastyt 1 nyt 0 ENDELSE ENDIF ELSE BEGIN jyt dom jpi ixt temporary dom MOD jpi firstxt min temporary ixt max lastxt firstyt min temporary jyt max lastyt nxt lastxt firstxt 1 nyt lastyt firstyt 1 ENDELSE ENDIF find firstxu firstxu firstyu firstyu nxu and nyu according to lon1 lon2 lat1 and lat2 IF where gridtype eq U 0 NE 1 THEN BEGIN IF keyword_set memeindices THEN BEGIN firstxu firstxt lastxu lastxt nxu nxt firstyu firstyt lastyu lastyt nyu nyt ENDIF ELSE BEGIN dom where glamu GE lon1 AND glamu LE lon2 AND gphiu GE lat1 AND gphiu LE lat2 IF dom 0 EQ 1 THEN BEGIN IF keyword_set findalways THEN BEGIN if t grid parameters alreday defined we use them CASE 1 OF where gridtype eq T 0 NE 1 OR where gridtype EQ W 0 NE 1:BEGIN ras report WARNING empty U points box we use the same index as T points firstxu firstxt lastxu lastxt nxu nxt firstyu firstyt lastyu lastyt nyu nyt END ELSE:BEGIN ras report WARNING empty U points box we get the neighbors to define a new box neig1 neighbor lon1 lat1 glamu gphiu sphere keyword_set key_onearth keyword_set key_irregular neig2 neighbor lon2 lat2 glamu gphiu sphere keyword_set key_onearth keyword_set key_irregular CASE N_PARAMS OF 4:domdef min glamu neig1 max glamu neig2 min gphiu neig1 max gphiu neig2 GRIDTYPE gridtype MEMEINDICES memeindices ZINDEX zindex _extra ex 6:domdef min glamu neig1 max glamu neig2 min gphiu neig1 max gphiu neig2 z1 z2 GRIDTYPE gridtype MEMEINDICES memeindices ZINDEX zindex _extra ex ENDCASE RETURN END ENDCASE ENDIF ELSE BEGIN ras report WARNING The box does not contain any U points firstxu 1 lastxu 1 nxu 0 firstyu 1 lastyu 1 nyu 0 ENDELSE ENDIF ELSE BEGIN jyu dom jpi ixu temporary dom MOD jpi firstxu min temporary ixu max lastxu firstyu min temporary jyu max lastyu nxu lastxu firstxu 1 nyu lastyu firstyu 1 ENDELSE ENDELSE ENDIF find firstxv firstxv firstyv firstyv nxv and nyv according to lon1 lon2 lat1 and lat2 IF where gridtype eq V 0 NE 1 THEN BEGIN IF keyword_set memeindices THEN BEGIN firstxv firstxt lastxv lastxt nxv nxt firstyv firstyt lastyv lastyt nyv nyt ENDIF ELSE BEGIN dom where glamv GE lon1 AND glamv LE lon2 AND gphiv GE lat1 AND gphiv LE lat2 IF dom 0 EQ 1 THEN BEGIN IF keyword_set findalways THEN BEGIN CASE 1 OF where gridtype eq T 0 NE 1 OR where gridtype EQ W 0 NE 1:BEGIN ras report WARNING empty V points box we use the same index as T points firstxv firstxt lastxv lastxt nxv nxt firstyv firstyt lastyv lastyt nyv nyt END where gridtype eq U 0 NE 1:BEGIN ras report WARNING empty V points box we use the same index as U points firstxv firstxu lastxv lastxu nxv nxu firstyv firstyu lastyv lastyu nyv nyu END ELSE:BEGIN ras report WARNING empty V points box we get the neighbors to define a new box neig1 neighbor lon1 lat1 glamv gphiv sphere keyword_set key_onearth keyword_set key_irregular neig2 neighbor lon2 lat2 glamv gphiv sphere keyword_set key_onearth keyword_set key_irregular CASE N_PARAMS OF 4:domdef min glamv neig1 max glamv neig2 min gphiv neig1 max gphiv neig2 GRIDTYPE gridtype MEMEINDICES memeindices ZINDEX zindex _extra ex 6:domdef min glamv neig1 max glamv neig2 min gphiv neig1 max gphiv neig2 z1 z2 GRIDTYPE gridtype MEMEINDICES memeindices ZINDEX zindex _extra ex ENDCASE RETURN END ENDCASE ENDIF ELSE BEGIN ras report WARNING The box does not contain any V points firstxv 1 lastxv 1 nxv 0 firstyv 1 lastyv 1 nyv 0 ENDELSE ENDIF ELSE BEGIN jyv dom jpi ixv temporary dom MOD jpi firstxv min temporary ixv max lastxv firstyv min temporary jyv max lastyv nxv lastxv firstxv 1 nyv lastyv firstyv 1 ENDELSE ENDELSE ENDIF find firstxf firstxf firstyf firstyf nxf and nyf according to lon1 lon2 lat1 and lat2 IF where gridtype eq F 0 NE 1 THEN BEGIN IF keyword_set memeindices THEN BEGIN firstxf firstxt lastxf lastxt nxf nxt firstyf firstyt lastyf lastyt nyf nyt ENDIF ELSE BEGIN dom where glamf GE lon1 AND glamf LE lon2 AND gphif GE lat1 AND gphif LE lat2 IF dom 0 EQ 1 THEN BEGIN IF keyword_set findalways THEN BEGIN CASE 1 OF where gridtype eq T 0 NE 1 OR where gridtype EQ W 0 NE 1:BEGIN ras report WARNING empty F points box we use the same index as T points firstxf firstxt lastxf lastxt nxf nxt firstyf firstyt lastyf lastyt nyf nyt END where gridtype eq U 0 NE 1:BEGIN ras report WARNING empty F points box we use the same index as U points firstxf firstxu lastxf lastxu nxf nxu firstyf firstyu lastyf lastyu nyf nyu END where gridtype eq V 0 NE 1:BEGIN ras report WARNING empty F points box we use the same index as V points firstxf firstxv lastxf lastxv nxf nxv firstyf firstyv lastyf lastyv nyf nyv END ELSE:BEGIN ras report WARNING empty F points box we get the neighbors to define a new box neig1 neighbor lon1 lat1 glamf gphif sphere keyword_set key_onearth keyword_set key_irregular neig2 neighbor lon2 lat2 glamf gphif sphere keyword_set key_onearth keyword_set key_irregular CASE N_PARAMS OF 4:domdef min glamf neig1 max glamf neig2 min gphif neig1 max gphif neig2 GRIDTYPE gridtype MEMEINDICES memeindices ZINDEX zindex _extra ex 6:domdef min glamf neig1 max glamf neig2 min gphif neig1 max gphif neig2 z1 z2 GRIDTYPE gridtype MEMEINDICES memeindices ZINDEX zindex _extra ex ENDCASE RETURN END ENDCASE ENDIF ELSE BEGIN ras report WARNING The box does not contain any F points firstxf 1 lastxf 1 nxf 0 firstyf 1 lastyf 1 nyf 0 ENDELSE ENDIF ELSE BEGIN jyf dom jpi ixf temporary dom MOD jpi firstxf min temporary ixf max lastxf firstyf min temporary jyf max lastyf nxf lastxf firstxf 1 nyf lastyf firstyf 1 ENDELSE ENDELSE ENDIF ENDIF ELSE BEGIN CASE 1 OF horizontal domain defined with the X and Y indexes keyword_set xindex AND keyword_set yindex OR keyword_set index :BEGIN fstx min long x1 x2 max lstx fsty min long y1 y2 max lsty IF fstx LT 0 OR lstx GE jpi THEN BEGIN ras report Bad definition of X1 or X2 return ENDIF IF fsty LT 0 OR lsty GE jpj THEN BEGIN ras report Bad definition of Y1 or Y2 return ENDIF nx lstx fstx 1 ny lsty fsty 1 find lon1t lon2t lat1t lat2t firstxt firstxt nxt and nyt according to x1 x2 y1 y2 IF where gridtype eq T 0 NE 1 OR where gridtype eq W 0 NE 1 THEN BEGIN lon1t min glamt fstx:lstx fsty:lsty max lon2t lat1t min gphit fstx:lstx fsty:lsty max lat2t firstxt fstx lastxt lstx firstyt fsty lastyt lsty nxt nx nyt ny ENDIF find lon1u lon2u lat1u lat2u firstxu firstxu nxu and nyu according to x1 x2 y1 y2 IF where gridtype eq U 0 NE 1 THEN BEGIN lon1u min glamu fstx:lstx fsty:lsty max lon2u lat1u min gphiu fstx:lstx fsty:lsty max lat2u firstxu fstx lastxu lstx firstyu fsty lastyu lsty nxu nx nyu ny ENDIF find lon1v lon2v lat1v lat2v firstxv firstxv nxv and nyv according to x1 x2 y1 y2 IF where gridtype eq V 0 NE 1 THEN BEGIN lon1v min glamv fstx:lstx fsty:lsty max lon2v lat1v min gphiv fstx:lstx fsty:lsty max lat2v firstxv fstx lastxv lstx firstyv fsty lastyv lsty nxv nx nyv ny ENDIF find lon1f lon2f lat1f lat2f firstxf firstxf nxf and nyf according to x1 x2 y1 y2 IF where gridtype eq F 0 NE 1 THEN BEGIN lon1f min glamf fstx:lstx fsty:lsty max lon2f lat1f min gphif fstx:lstx fsty:lsty max lat2f firstxf fstx lastxf lstx firstyf fsty lastyf lsty nxf nx nyf ny ENDIF lon1 min lon1t lon1u lon1v lon1f lon2 max lon2t lon2u lon2v lon2f lat1 min lat1t lat1u lat1v lat1f lat2 max lat2t lat2u lat2v lat2f END horizontal domain defined with the X index and lat1 lat2 keyword_set xindex :BEGIN fstx min long x1 x2 max lstx IF fstx LT 0 OR lstx GE jpi THEN BEGIN ras report Bad definition of X1 or X2 return ENDIF nx lstx fstx 1 lat1 min y1 y2 max lat2 find lon1t lon2t firstxt firstxt firstyt firstyt nxt and nyt according to x1 x2 lat1 and lat2 IF where gridtype eq T 0 NE 1 OR where gridtype EQ W 0 NE 1 THEN BEGIN firstxt fstx lastxt lstx nxt nx dom where gphit fstx:lstx GE lat1 AND gphit fstx:lstx LE lat2 IF dom 0 EQ 1 THEN BEGIN IF keyword_set findalways THEN BEGIN ras report WARNING empty T points box we get the neighbors to define a new box neig1 neighbor lon1 lat1 glamt fstx:lstx gphit fstx:lstx sphere keyword_set key_onearth keyword_set key_irregular neig2 neighbor lon2 lat2 glamt fstx:lstx gphit fstx:lstx sphere keyword_set key_onearth keyword_set key_irregular CASE N_PARAMS OF 4:domdef fstx lstx min gphit fstx:lstx neig1 max gphit fstx:lstx neig2 GRIDTYPE gridtype MEMEINDICES memeindices XINDEX ZINDEX zindex _extra ex 6:domdef fstx lstx min gphit fstx:lstx neig1 max gphit fstx:lstx neig2 z1 z2 GRIDTYPE gridtype MEMEINDICES memeindices XINDEX ZINDEX zindex _extra ex ENDCASE RETURN ENDIF ELSE BEGIN ras report WARNING The box does not contain any T points firstyt 1 lastyt 1 nyt 0 ENDELSE ENDIF ELSE BEGIN jyt temporary dom nx firstyt min temporary jyt max lastyt nyt lastyt firstyt 1 ENDELSE IF nyt NE 0 THEN lon1t min glamt firstxt:lastxt firstyt:lastyt max lon2t ENDIF find lon1u lon2u firstxu firstxu firstyu firstyu nxu and nyu according to x1 x2 lat1 and lat2 IF where gridtype eq U 0 NE 1 THEN BEGIN firstxu fstx lastxu lstx nxu nx IF keyword_set memeindices THEN BEGIN firstyu firstyt lastyu lastyt nyu nyt ENDIF ELSE BEGIN dom where gphiu fstx:lstx GE lat1 AND gphiu fstx:lstx LE lat2 IF dom 0 EQ 1 THEN BEGIN IF keyword_set findalways THEN BEGIN CASE 1 OF where gridtype eq T 0 NE 1 OR where gridtype EQ W 0 NE 1:BEGIN ras report WARNING empty U points box we use the same index as T points firstyu firstyt lastyu lastyt nyu nyt END ELSE:BEGIN ras report WARNING empty U points box we get the neighbors to define a new box neig1 neighbor lon1 lat1 glamu fstx:lstx gphiu fstx:lstx sphere keyword_set key_onearth keyword_set key_irregular neig2 neighbor lon2 lat2 glamu fstx:lstx gphiu fstx:lstx sphere keyword_set key_onearth keyword_set key_irregular CASE N_PARAMS OF 4:domdef fstx lstx min gphiu fstx:lstx neig1 max gphiu fstx:lstx neig2 GRIDTYPE gridtype MEMEINDICES memeindices XINDEX ZINDEX zindex _extra ex 6:domdef fstx lstx min gphiu fstx:lstx neig1 max gphiu fstx:lstx neig2 z1 z2 GRIDTYPE gridtype MEMEINDICES memeindices XINDEX ZINDEX zindex _extra ex ENDCASE RETURN END ENDCASE ENDIF ELSE BEGIN ras report WARNING The box does not contain any U points firstyu 1 lastyu 1 nyu 0 ENDELSE ENDIF ELSE BEGIN jyu temporary dom nx firstyu min temporary jyu max lastyu nyu lastyu firstyu 1 ENDELSE ENDELSE IF nyu NE 0 THEN lon1u min glamu firstxu:lastxu firstyu:lastyu max lon2u ENDIF find lon1v lon2v firstxv firstxv firstyv firstyv nxv and nyv according to x1 x2 lat1 and lat2 IF where gridtype eq V 0 NE 1 THEN BEGIN firstxv fstx lastxv lstx nxv nx IF keyword_set memeindices THEN BEGIN firstyv firstyt lastyv lastyt nyv nyt ENDIF ELSE BEGIN dom where gphiv fstx:lstx GE lat1 AND gphiv fstx:lstx LE lat2 IF dom 0 EQ 1 THEN BEGIN IF keyword_set findalways THEN BEGIN CASE 1 OF where gridtype eq T 0 NE 1 OR where gridtype EQ W 0 NE 1:BEGIN ras report WARNING empty V points box we use the same index as T points firstyv firstyt lastyv lastyt nyv nyt END where gridtype eq U 0 NE 1:BEGIN ras report WARNING empty V points box we use the same index as U points firstyv firstyu lastyv lastyu nyv nyu END ELSE:BEGIN ras report WARNING empty V points box we get the neighbors to define a new box neig1 neighbor lon1 lat1 glamv fstx:lstx gphiv fstx:lstx sphere keyword_set key_onearth keyword_set key_irregular neig2 neighbor lon2 lat2 glamv fstx:lstx gphiv fstx:lstx sphere keyword_set key_onearth keyword_set key_irregular CASE N_PARAMS OF 4:domdef fstx lstx min gphiv fstx:lstx neig1 max gphiv fstx:lstx neig2 GRIDTYPE gridtype MEMEINDICES memeindices XINDEX ZINDEX zindex _extra ex 6:domdef fstx lstx min gphiv fstx:lstx neig1 max gphiv fstx:lstx neig2 z1 z2 GRIDTYPE gridtype MEMEINDICES memeindices XINDEX ZINDEX zindex _extra ex ENDCASE RETURN END ENDCASE ENDIF ELSE BEGIN ras report WARNING The box does not contain any V points firstyv 1 lastyv 1 nyv 0 ENDELSE ENDIF ELSE BEGIN jyv temporary dom nx firstyv min temporary jyv max lastyv nyv lastyv firstyv 1 ENDELSE ENDELSE IF nyv NE 0 THEN lon1v min glamv firstxv:lastxv firstyv:lastyv max lon2v ENDIF find lon1f lon2f firstxf firstxf firstyf firstyf nxf and nyf according to x1 x2 lat1 and lat2 IF where gridtype eq F 0 NE 1 THEN BEGIN firstxf fstx lastxf lstx nxf nx IF keyword_set memeindices THEN BEGIN firstyf firstyt lastyf lastyt nyf nyt ENDIF ELSE BEGIN dom where gphif fstx:lstx GE lat1 AND gphif fstx:lstx LE lat2 IF dom 0 EQ 1 THEN BEGIN IF keyword_set findalways THEN BEGIN CASE 1 OF where gridtype eq T 0 NE 1 OR where gridtype EQ W 0 NE 1:BEGIN ras report WARNING empty F points box we use the same index as T points firstyf firstyt lastyf lastyt nyf nyt END where gridtype eq U 0 NE 1:BEGIN ras report WARNING empty F points box we use the same index as U points firstyf firstyu lastyf lastyu nyf nyu END where gridtype eq V 0 NE 1:BEGIN ras report WARNING empty F points box we use the same index as V points firstyf firstyv lastyf lastyv nyf nyv END ELSE:BEGIN ras report WARNING empty F points box we get the neighbors to define a new box neig1 neighbor lon1 lat1 glamf fstx:lstx gphif fstx:lstx sphere keyword_set key_onearth keyword_set key_irregular neig2 neighbor lon2 lat2 glamf fstx:lstx gphif fstx:lstx sphere keyword_set key_onearth keyword_set key_irregular CASE N_PARAMS OF 4:domdef fstx lstx min gphif fstx:lstx neig1 max gphif fstx:lstx neig2 GRIDTYPE gridtype MEMEINDICES memeindices XINDEX ZINDEX zindex _extra ex 6:domdef fstx lstx min gphif fstx:lstx neig1 max gphif fstx:lstx neig2 z1 z2 GRIDTYPE gridtype MEMEINDICES memeindices XINDEX ZINDEX zindex _extra ex ENDCASE RETURN END ENDCASE ENDIF ELSE BEGIN ras report WARNING The box does not contain any F points firstyf 1 lastyf 1 nyf 0 ENDELSE ENDIF ELSE BEGIN jyf temporary dom nx firstyf min temporary jyf max lastyf nyf lastyf firstyf 1 ENDELSE ENDELSE IF nyf NE 0 THEN lon1f min glamf firstxf:lastxf firstyf:lastyf max lon2f ENDIF lon1 min lon1t lon1u lon1v lon1f lon2 max lon2t lon2u lon2v lon2f END horizontal domain defined with the Y index and lon1 lon2 keyword_set yindex :BEGIN fsty min long y1 y2 max lsty IF fsty LT 0 OR lsty GE jpj THEN BEGIN ras report Bad definition of Y1 or Y2 return ENDIF ny lsty fsty 1 lon1 min x1 x2 max lon2 find lat1t lat2t firstxt firstxt firstyt firstyt nxt and nyt according to x1 x2 lon1 and lon2 IF where gridtype eq T 0 NE 1 OR where gridtype EQ W 0 NE 1 THEN BEGIN firstyt fsty lastyt lsty nyt ny dom where glamt fsty:lsty GE lon1 AND glamt fsty:lsty LE lon2 IF dom 0 EQ 1 THEN BEGIN IF keyword_set findalways THEN BEGIN ras report WARNING empty T points box we get the neighbors to define a new box neig1 neighbor lon1 lat1 glamt fsty:lsty gphit fsty:lsty sphere keyword_set key_onearth keyword_set key_irregular neig2 neighbor lon2 lat2 glamt fsty:lsty gphit fsty:lsty sphere keyword_set key_onearth keyword_set key_irregular CASE N_PARAMS OF 4:domdef min glamt fsty:lsty neig1 max glamt fsty:lsty neig2 fsty lsty GRIDTYPE gridtype MEMEINDICES memeindices YINDEX ZINDEX zindex _extra ex 6:domdef min glamt fsty:lsty neig1 max glamt fsty:lsty neig2 fsty lsty z1 z2 GRIDTYPE gridtype MEMEINDICES memeindices YINDEX ZINDEX zindex _extra ex ENDCASE RETURN ENDIF ELSE BEGIN ras report WARNING The box does not contain any T points firstxt 1 lastxt 1 nxt 0 ENDELSE ENDIF ELSE BEGIN jxt temporary dom MOD jpi firstxt min temporary jxt max lastxt nxt lastxt firstxt 1 ENDELSE IF nxt NE 0 THEN lat1t min gphit firstxt:lastxt firstyt:lastyt max lat2t ENDIF find lat1u lat2u firstxu firstxu firstyu firstyu nxu and nyu according to x1 x2 lon1 and lon2 IF where gridtype eq U 0 NE 1 THEN BEGIN firstyu fsty lastyu lsty nyu ny IF keyword_set memeindices THEN BEGIN firstxu firstyt lastxu lastyt nxu nxt ENDIF ELSE BEGIN dom where glamu fsty:lsty GE lon1 AND glamu fsty:lsty LE lon2 IF dom 0 EQ 1 THEN BEGIN IF keyword_set findalways THEN BEGIN CASE 1 OF where gridtype eq T 0 NE 1 OR where gridtype EQ W 0 NE 1:BEGIN ras report WARNING empty U points box we use the same index as T points firstxu firstxt lastxu lastxt nxu nxt END ELSE:BEGIN ras report WARNING empty U points box we get the neighbors to define a new box neig1 neighbor lon1 lat1 glamu fsty:lsty gphiu fsty:lsty sphere keyword_set key_onearth keyword_set key_irregular neig2 neighbor lon2 lat2 glamu fsty:lsty gphiu fsty:lsty sphere keyword_set key_onearth keyword_set key_irregular CASE N_PARAMS OF 4:domdef min glamu fsty:lsty neig1 max glamu fsty:lsty neig2 fsty lsty GRIDTYPE gridtype MEMEINDICES memeindices YINDEX ZINDEX zindex _extra ex 6:domdef min glamu fsty:lsty neig1 max glamu fsty:lsty neig2 fsty lsty z1 z2 GRIDTYPE gridtype MEMEINDICES memeindices YINDEX ZINDEX zindex _extra ex ENDCASE RETURN END ENDCASE ENDIF ELSE BEGIN ras report WARNING The box does not contain any U points firstxu 1 lastxu 1 nxu 0 ENDELSE ENDIF ELSE BEGIN jxu temporary dom MOD jpi firstxu min temporary jxu max lastxu nxu lastxu firstxu 1 ENDELSE ENDELSE IF nxu NE 0 THEN lat1u min gphiu firstxu:lastxu firstyu:lastyu max lat2u ENDIF find lat1v lat2v firstxv firstxv firstyv firstyv nxv and nyv according to x1 x2 lon1 and lon2 IF where gridtype eq V 0 NE 1 THEN BEGIN firstyv fsty lastyv lsty nyv ny IF keyword_set memeindices THEN BEGIN firstxv firstyt lastxv lastyt nxv nxt ENDIF ELSE BEGIN dom where glamv fsty:lsty GE lon1 AND glamv fsty:lsty LE lon2 IF dom 0 EQ 1 THEN BEGIN IF keyword_set findalways THEN BEGIN CASE 1 OF where gridtype eq T 0 NE 1 OR where gridtype EQ W 0 NE 1:BEGIN ras report WARNING empty V points box we use the same index as T points firstxv firstxt lastxv lastxt nxv nxt END where gridtype eq U 0 NE 1:BEGIN ras report WARNING empty V points box we use the same index as U points firstxv firstxu lastxv lastxu nxv nxu END ELSE:BEGIN ras report WARNING empty V points box we get the neighbors to define a new box neig1 neighbor lon1 lat1 glamv fsty:lsty gphiv fsty:lsty sphere keyword_set key_onearth keyword_set key_irregular neig2 neighbor lon2 lat2 glamv fsty:lsty gphiv fsty:lsty sphere keyword_set key_onearth keyword_set key_irregular CASE N_PARAMS OF 4:domdef min glamv fsty:lsty neig1 max glamv fsty:lsty neig2 fsty lsty GRIDTYPE gridtype MEMEINDICES memeindices YINDEX ZINDEX zindex _extra ex 6:domdef min glamv fsty:lsty neig1 max glamv fsty:lsty neig2 fsty lsty z1 z2 GRIDTYPE gridtype MEMEINDICES memeindices YINDEX ZINDEX zindex _extra ex ENDCASE RETURN END ENDCASE ENDIF ELSE BEGIN ras report WARNING The box does not contain any V points firstxv 1 lastxv 1 nxv 0 ENDELSE ENDIF ELSE BEGIN jxv temporary dom MOD jpi firstxv min temporary jxv max lastxv nxv lastxv firstxv 1 ENDELSE ENDELSE IF nxv NE 0 THEN lat1v min gphiv firstxv:lastxv firstyv:lastyv max lat2v ENDIF find lat1f lat2f firstxf firstxf firstyf firstyf nxf and nyf according to x1 x2 lon1 and lon2 IF where gridtype eq F 0 NE 1 THEN BEGIN firstyf fsty lastyf lsty nyf ny IF keyword_set memeindices THEN BEGIN firstxf firstyt lastxf lastyt nxf nxt ENDIF ELSE BEGIN dom where glamf fsty:lsty GE lon1 AND glamf fsty:lsty LE lon2 IF dom 0 EQ 1 THEN BEGIN IF keyword_set findalways THEN BEGIN CASE 1 OF where gridtype eq T 0 NE 1 OR where gridtype EQ W 0 NE 1:BEGIN ras report WARNING empty F points box we use the same index as T points firstxf firstxt lastxf lastxt nxf nxt END where gridtype eq U 0 NE 1:BEGIN ras report WARNING empty F points box we use the same index as U points firstxf firstxu lastxf lastxu nxf nxu END where gridtype eq V 0 NE 1:BEGIN ras report WARNING empty F points box we use the same index as V points firstxf firstxv lastxf lastxv nxf nxv END ELSE:BEGIN ras report WARNING empty F points box we get the neighbors to define a new box neig1 neighbor lon1 lat1 glamf fsty:lsty gphif fsty:lsty sphere keyword_set key_onearth keyword_set key_irregular neig2 neighbor lon2 lat2 glamf fsty:lsty gphif fsty:lsty sphere keyword_set key_onearth keyword_set key_irregular CASE N_PARAMS OF 4:domdef min glamf fsty:lsty neig1 max glamf fsty:lsty neig2 fsty lsty GRIDTYPE gridtype MEMEINDICES memeindices YINDEX ZINDEX zindex _extra ex 6:domdef min glamf fsty:lsty neig1 max glamf fsty:lsty neig2 fsty lsty z1 z2 GRIDTYPE gridtype MEMEINDICES memeindices YINDEX ZINDEX zindex _extra ex ENDCASE RETURN END ENDCASE ENDIF ELSE BEGIN ras report WARNING The box does not contain any F points firstxf 1 lastyf 1 nxf 0 ENDELSE ENDIF ELSE BEGIN jxf temporary dom MOD jpi firstxf min temporary jxf max lastxf nxf lastxf firstxf 1 ENDELSE ENDELSE IF nxf NE 0 THEN lat1f min gphif firstxf:lastxf firstyf:lastyf max lat2f ENDIF lat1 min lat1t lat1u lat1v lat1f lat2 max lat2t lat2u lat2v lat2f END ENDCASE ENDELSE The extracted domain is it regular or not CASE 1 OF where gridtype eq T 0 NE 1 OR where gridtype eq W 0 NE 1 AND nxt NE 0 AND nyt NE 0:BEGIN to get faster we first test the most basic cases before testing the full array CASE 0 OF array_equal glamt firstxt:lastxt firstyt glamt firstxt:lastxt lastyt :key_irregular 1b array_equal gphit firstxt firstyt:lastyt gphit lastxt firstyt:lastyt :key_irregular 1b array_equal glamt firstxt:lastxt firstyt:lastyt glamt firstxt:lastxt firstyt replicate 1 nyt :key_irregular 1b array_equal gphit firstxt:lastxt firstyt:lastyt replicate 1 nxt gphit firstxt firstyt:lastyt :key_irregular 1b ELSE:key_irregular 0b ENDCASE END where gridtype eq U 0 NE 1 AND nxu NE 0 AND nyu NE 0:BEGIN CASE 0 OF array_equal glamu firstxu:lastxu firstyu glamu firstxu:lastxu lastyu :key_irregular 1b array_equal gphiu firstxu firstyu:lastyu gphiu lastxu firstyu:lastyu :key_irregular 1b array_equal glamu firstxu:lastxu firstyu:lastyu glamu firstxu:lastxu firstyu replicate 1 nyu :key_irregular 1b array_equal gphiu firstxu:lastxu firstyu:lastyu replicate 1 nxu gphiu firstxu firstyu:lastyu :key_irregular 1b ELSE:key_irregular 0b ENDCASE END where gridtype eq V 0 NE 1 AND nxv NE 0 AND nyv NE 0:BEGIN CASE 0 OF array_equal glamv firstxv:lastxv firstyv glamv firstxv:lastxv lastyv :key_irregular 1b array_equal gphiv firstxv firstyv:lastyv gphiv lastxv firstyv:lastyv :key_irregular 1b array_equal glamv firstxv:lastxv firstyv:lastyv glamv firstxv:lastxv firstyv replicate 1 nyv :key_irregular 1b array_equal gphiv firstxv:lastxv firstyv:lastyv replicate 1 nxv gphiv firstxv firstyv:lastyv :key_irregular 1b ELSE:key_irregular 0b ENDCASE END where gridtype eq F 0 NE 1 AND nxf NE 0 AND nyf NE 0:BEGIN CASE 0 OF array_equal glamf firstxf:lastxf firstyf glamf firstxf:lastxf lastyf :key_irregular 1b array_equal gphif firstxf firstyf:lastyf gphif lastxf firstyf:lastyf :key_irregular 1b array_equal glamf firstxf:lastxf firstyf:lastyf glamf firstxf:lastxf firstyf replicate 1 nyf :key_irregular 1b array_equal gphif firstxf:lastxf firstyf:lastyf replicate 1 nxf gphif firstxf firstyf:lastyf :key_irregular 1b ELSE:key_irregular 0b ENDCASE END ELSE: ENDCASE define all vertical parameters vert1 vert2 firstz tw lastz tw nz tw vertical: vertical domain defined with vert1 vert2 IF NOT keyword_set zindex OR keyword_set index THEN BEGIN define vert1 and vert2 CASE N_PARAMS OF 2:vert1 min x1 x2 max vert2 6:vert1 min z1 z2 max vert2 ELSE:BEGIN IF inter byte gridtype byte T U V F 0 NE 1 THEN vert1t min gdept max vert2t IF where gridtype eq W 0 NE 1 AND n_elements gdepw NE 0 THEN vert1w min gdepw max vert2w vert1 min vert1t vert1w vert2 max vert2t vert2w END ENDCASE define firstzt firstzt nzt IF inter byte gridtype byte T U V F 0 NE 1 THEN BEGIN domz where gdept ge vert1 and gdept le vert2 nzt IF nzt NE 0 THEN BEGIN firstzt domz 0 lastzt domz nzt 1 ENDIF ELSE BEGIN ras report WARNING The box does not contain any T level firstzt 1 lastzt 1 ENDELSE ENDIF define firstzw firstzw nzw IF where gridtype eq W 0 NE 1 AND n_elements gdepw NE 0 THEN BEGIN IF keyword_set memeindices THEN BEGIN firstzw firstzt lastzw lastzt nzw nzt ENDIF ELSE BEGIN domz where gdepw ge vert1 and gdepw le vert2 nzw IF nzw NE 0 THEN BEGIN firstzw domz 0 lastzw domz nzw 1 ENDIF ELSE BEGIN ras report WARNING The box does not contain any W level firstzw 1 lastzw 1 ENDELSE ENDELSE ENDIF vertical domain defined with the Z index ENDIF ELSE BEGIN CASE N_PARAMS OF 2:fstz min long x1 x2 max lstz 4:return 6:fstz min long z1 z2 max lstz ENDCASE IF fstz LT 0 OR lstz GE jpk THEN BEGIN ras report Bad definition of X1 X2 Z1 or Z2 return ENDIF nz lstz fstz 1 find vert1t vert2t firstzt firstzt nzt according to x1 x2 or z1 z2 IF where gridtype eq T 0 NE 1 THEN BEGIN vert1t min gdept fstz:lstz max vert2t firstzt fstz lastzt lstz nzt nz ENDIF find vert1w vert2w firstzw firstzw nzw according to x1 x2 or z1 z2 IF where gridtype eq W 0 NE 1 AND n_elements gdepw NE 0 THEN BEGIN vert1w min gdepw fstz:lstz max vert2w firstzw fstz lastzw lstz nzw nz ENDIF vert1 min vert1t vert1w vert2 max vert2t vert2w ENDELSE IF NOT keyword_set key_forgetold THEN BEGIN updateold ENDIF if keyword_set key_performance THEN print temps domdef systime 1 tempsun return end"); a[213] = new Array("./ToBeReviewed/GRILLE/f2v.html", "f2v.pro", "", " file_comments Allows to pass a field referring to the grid F on the grid V thanks to the average: res 0 5 res shift res 1 0 categories Grid param TEMP in required a 2d 3d or 4d array returns a 2d 3d or 4d array uses common restrictions Force parameters of the zoom on the grid V to be the same as those on the grid T restrictions Points which can not be calculated are put at the value NaN consecrated by IDL: values f_nan history From Marina Levy s programs Sebastien Masson smasson lodyc jussieu fr : Validation 5 6 2000 version Id: f2v pro 370 2008 08 07 07:59:15Z pinsard FUNCTION f2v temp compile_opt idl2 strictarrsubs cm_4mesh cm_4data cm_4cal IF NOT keyword_set key_forgetold THEN BEGIN updatenew ENDIF res temp We force nxt nxf etc firstxv firstxf lastxv lastxf firstyv firstyf lastyv lastyf nxv nxf nyv nyf vargrid V if NOT keyword_set valmask then valmask 1e20 lon1 glamv firstxv 0 lon2 glamf lastxf 0 case on tha array s size and application taille size temp CASE taille 0 OF 1: res 1 2: BEGIN case 1 of taille 1 eq nxf and taille 2 eq nyf: taille 1 eq jpi and taille 2 eq jpj: res res firstxf:lastxf firstyf:lastyf else: return report Probleme d adequation entre les tailles du domaine et de la boite endcase mask fmask firstxf:lastxf firstyf:lastyf 0 terre where mask EQ 0 IF terre 0 NE 1 THEN res terre values f_nan res 0 5 res shift res 1 0 if NOT keyword_set key_periodic AND nxf EQ jpi then res 0 values f_nan mask vmask firstxf:lastxf firstyf:lastyf 0 terre where mask EQ 0 IF terre 0 NE 1 THEN res terre valmask END 3: BEGIN case 1 of taille 1 eq nxf and taille 2 eq nyf AND taille 3 EQ nzt: taille 1 eq nxf and taille 2 eq nyf AND taille 3 EQ jpk: res res firstzt:lastzt taille 1 eq nxf and taille 2 eq nyf AND taille 3 EQ jpt: taille 1 eq jpi and taille 2 eq jpj AND taille 3 EQ jpk: res res firstxf:lastxf firstyf:lastyf firstzt:lastzt taille 1 eq jpi and taille 2 eq jpj AND taille 3 EQ jpt: res res firstxf:lastxf firstyf:lastyf else: return report Probleme d adequation entre les tailles du domaine et de la boite ENDCASE if taille 3 EQ jpt then begin mask fmask firstxf:lastxf firstyf:lastyf lastzt nzt NE jpk mask temporary mask replicate 1 jpt mask reform mask nxf nyf jpt over ENDIF ELSE mask fmask firstxf:lastxf firstyf:lastyf firstzt:lastzt terre where temporary mask EQ 0 IF terre 0 NE 1 THEN res temporary terre values f_nan res 0 5 res shift res 1 0 0 if NOT keyword_set key_periodic AND nxf EQ jpi then res 0 values f_nan if taille 3 EQ jpt then BEGIN mask tmask firstxf:lastxf firstyf:lastyf lastzt nzt NE jpk mask temporary mask replicate 1 jpt mask reform mask nxf nyf jpt over ENDIF ELSE mask vmask firstxf:lastxf firstyf:lastyf firstzt:lastzt terre where temporary mask EQ 0 IF terre 0 NE 1 THEN res temporary terre valmask END 4: BEGIN case 1 of taille 1 eq nxf and taille 2 eq nyf AND taille 3 EQ nzt AND taille 4 EQ jpt: taille 1 eq nxf and taille 2 eq nyf AND taille 3 EQ jpk AND taille 4 EQ jpt: res res firstzt:lastzt taille 1 eq jpi and taille 2 eq jpj AND taille 3 EQ jpk AND taille 4 EQ jpt: res res firstxf:lastxf firstyf:lastyf firstzt:lastzt else: return report Probleme d adequation entre les tailles du domaine et de la boite ENDCASE mask fmask firstxf:lastxf firstyf:lastyf firstzt:lastzt mask temporary mask replicate 1 jpt mask reform mask nxf nyf nzt jpt over terre where temporary mask EQ 0 IF terre 0 NE 1 THEN res temporary terre values f_nan res 0 5 res shift res 1 0 0 0 if NOT keyword_set key_periodic AND nxf EQ jpi then res 0 values f_nan mask vmask firstxf:lastxf firstyf:lastyf firstzt:lastzt mask temporary mask replicate 1 jpt mask reform mask nxf nyf nzt jpt over terre where temporary mask EQ 0 IF terre 0 NE 1 THEN res temporary terre valmask END endcase IF NOT keyword_set key_forgetold THEN BEGIN updateold ENDIF return res END"); a[214] = new Array("./ToBeReviewed/GRILLE/fmask.html", "fmask.pro", "", " file_comments calculate fmask Economize memory we do not need to keep fmask anymore categories Grid returns A 3d array corresponding to fmask examples Used like if fmask was a known array by substituing fmask by fmask For example: Instead of write fmask domainef we have to write fmask domainef history Sebastien Masson smasson lodyc jussieu fr 11 12 98 version Id: fmask pro 325 2007 12 06 10:04:53Z pinsard FUNCTION fmask compile_opt idl2 strictarrsubs cm_4mesh IF NOT keyword_set key_forgetold THEN BEGIN updatenew ENDIF tempsun systime 1 For key_performance CASE size tmask n_dimensions OF 2:res tmask shift tmask 1 0 shift tmask 0 1 shift tmask 1 1 3:res tmask shift tmask 1 0 0 shift tmask 0 1 0 shift tmask 1 1 0 ENDCASE if NOT keyword_set key_periodic then res jpi 1 fmaskredy res jpj 1 fmaskredx if keyword_set key_performance THEN print temps fmask systime 1 tempsun return res end"); a[215] = new Array("./ToBeReviewed/GRILLE/grille.html", "grille.pro", "", " file_comments Choose the grid which must be used to do the graph in function of vargrid and send back corresponding parameters calculated in domdef and reduced at the domain defined by domdef contrarily to grandegrille BEWARE The choice of the grid is made from the value of the global variable vargrid which can be equal to T U V W ou F categories Grid keyword TRI This keyword serve to obtain the triangulation which refer to the grid but only on the part of the zoom This array of triangulation is passed in the variable we have equate at TRI For example: grille tri triangulation_reduite This keyword is used in plt keyword GRID default vargrid defined in cm_4data To specify on which grid are located the data keyword WDEPTH default 0 To specify that the field is at W depth instead of T depth automatically activated if vargrid eq W keyword FORPLT In plt we want that land points glam and gphi be equal to glamt and gphit regardless of the grid keyword NOTRI Useful only when TRI is activated In this case grille send back 1 in the variable tri even if the variable of the common triangles_list is defined and different of 1 keyword _EXTRA Used to pass keywords keyword TOUT param MASK out optional For the definition see domdef and the management of subdomains on the web param GLAM out optional For the definition see domdef and the management of subdomains on the web param GPHI out optional For the definition see domdef and the management of subdomains on the web param GDEP out optional For the definition see domdef and the management of subdomains on the web param NX out optional For the definition see domdef and the management of subdomains on the web param NY out optional For the definition see domdef and the management of subdomains on the web param NZ out optional For the definition see domdef and the management of subdomains on the web param FIRSTX out optional For the definition see domdef and the management of subdomains on the web param FIRSTY out optional For the definition see domdef and the management of subdomains on the web param FIRSTZ out optional For the definition see domdef and the management of subdomains on the web param LASTX out optional For the definition see domdef and the management of subdomains on the web param LASTY out optional For the definition see domdef and the management of subdomains on the web param LASTZ out optional For the definition see domdef and the management of subdomains on the web param E1 out optional For the definition see domdef and the management of subdomains on the web param E2 out optional For the definition see domdef and the management of subdomains on the web param E3 out optional For the definition see domdef and the management of subdomains on the web uses cm_4mesh cm_4data restrictions Use the variable vargrid restrictions Vargrid must be T W U V or F history Sebastien Masson smasson lodyc jussieu fr 12 2 1999 10 11 1999 forplt version Id: grille pro 388 2008 12 09 09:36:41Z smasson todo Comment ecrire la remarque sur les inputs PRO grille mask glam gphi gdep nx ny nz firstx firsty firstz lastx lasty lastz e1 e2 e3 TRI tri NOTRI notri TOUT tout FORPLT forplt TYPE type WDEPTH wdepth GRID grid _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh cm_4data cm_4cal for jpt IF NOT keyword_set key_forgetold THEN BEGIN updatenew ENDIF tempsun systime 1 For key_performance vargrid strupcase strmid vargrid 0 reverse_offset IF size grid type EQ 7 THEN vargrid strupcase grid if vargrid eq W then wdepth 1 if keyword_set tout then begin savedbox 1b saveboxparam boxparam4grille dat domdef gridtype vargrid _EXTRA ex endif tempdeux systime 1 For key_performance 2 IF keyword_set wdepth THEN BEGIN firstz firstzw lastz lastzw nz nzw ENDIF ELSE BEGIN firstz firstzt lastz lastzt nz nzt ENDELSE CASE 1 OF grid T and W vargrid eq T OR vargrid eq W : begin scalars nx nxt ny nyt firstx firstxt firsty firstyt lastx lastxt lasty lastyt 2d vectors IF arg_present glam THEN glam glamt firstx:lastx firsty:lasty IF arg_present gphi THEN gphi gphit firstx:lastx firsty:lasty IF arg_present e1 THEN e1 e1t firstx:lastx firsty:lasty IF arg_present e2 THEN e2 e2t firstx:lastx firsty:lasty 3d vectors IF keyword_set forplt THEN mask tmask firstx:lastx firsty:lasty firstz ELSE IF arg_present mask THEN mask tmask firstx:lastx firsty:lasty firstz:lastz end grid U vargrid eq U : begin scalars nx nxu ny nyu firstx firstxu firsty firstyu lastx lastxu lasty lastyu 2d vectors IF arg_present glam THEN glam glamu firstx:lastx firsty:lasty IF arg_present gphi THEN gphi gphiu firstx:lastx firsty:lasty if keyword_set forplt then BEGIN mask 1b tmask firstx:lastx firsty:lasty firstz eastboarder mask shift mask 1 0 mask westboarder mask shift mask 1 0 mask if key_periodic NE 1 OR nx NE jpi then westboarder nx 1 0b tmp1 shift eastboarder 0 1 tmp1 0 0b tmp2 shift eastboarder 0 1 tmp2 ny 1 0b add temporary tmp1 temporary tmp2 1b eastboarder 1b temporary westboarder eastboarder temporary eastboarder temporary add tmp1 mask shift mask 0 1 shift mask 0 1 NE 1b tmp1 ny 1 1b tmp1 0 1b tmp2 mask shift mask 1 0 shift mask 1 0 NE 1b if key_periodic NE 1 OR nx NE jpi then begin tmp2 nx 1 1b tmp2 0 0b endif no1 temporary tmp1 temporary tmp2 tmp temporary eastboarder temporary no1 mask mask 0:nx 2 0b tmp temporary tmp temporary mask tmp where tmp GE 1 if tmp 0 NE 1 then begin glam tmp glamt firstx:lastx firsty:lasty tmp gphi tmp gphit firstx:lastx firsty:lasty tmp endif ENDIF IF arg_present e1 THEN e1 e1u firstx:lastx firsty:lasty IF arg_present e2 THEN e2 e2u firstx:lastx firsty:lasty 3d vectors IF keyword_set forplt THEN mask umask firstx:lastx firsty:lasty firstz ELSE IF arg_present mask THEN mask umask firstx:lastx firsty:lasty firstz:lastz end grid V vargrid eq OPAPTDHV or vargrid eq OPAPT3DV or vargrid eq V : begin scalars nx nxv ny nyv firstx firstxv firsty firstyv lastx lastxv lasty lastyv 2d vectors IF arg_present glam THEN glam glamv firstx:lastx firsty:lasty IF arg_present gphi THEN gphi gphiv firstx:lastx firsty:lasty if keyword_set forplt then BEGIN mask 1b tmask firstx:lastx firsty:lasty firstz northboarder mask shift mask 0 1 mask southboarder mask shift mask 0 1 mask southboarder ny 1 0b tmp1 shift northboarder 1 0 if key_periodic NE 1 OR nx NE jpi then tmp1 nx 1 0b tmp2 shift northboarder 1 0 if key_periodic NE 1 OR nx NE jpi then tmp2 0 0b add temporary tmp1 temporary tmp2 1b northboarder 1b southboarder northboarder temporary northboarder temporary add tmp1 mask shift mask 0 1 shift mask 0 1 NE 1b tmp1 ny 1 1b tmp1 0 0b tmp2 mask shift mask 1 0 shift mask 1 0 NE 1b if key_periodic NE 1 OR nx NE jpi then begin tmp2 nx 1 1b tmp2 0 1b endif no1 temporary tmp1 temporary tmp2 tmp temporary northboarder mask temporary no1 mask 0:ny 2 0b tmp temporary tmp temporary mask tmp where tmp GE 1 if tmp 0 NE 1 then begin glam tmp glamt firstx:lastx firsty:lasty tmp gphi tmp gphit firstx:lastx firsty:lasty tmp endif ENDIF IF arg_present e1 THEN e1 e1v firstx:lastx firsty:lasty IF arg_present e2 THEN e2 e2v firstx:lastx firsty:lasty 3d vecteurs IF keyword_set forplt THEN mask vmask firstx:lastx firsty:lasty firstz ELSE IF arg_present mask THEN mask vmask firstx:lastx firsty:lasty firstz:lastz end grid F vargrid eq OPAPTDHF or vargrid eq OPAPT3DF or vargrid eq F : begin scalars nx nxf ny nyf firstx firstxf firsty firstyf lastx lastxf lasty lastyf 2d vectors IF arg_present glam THEN glam glamf firstx:lastx firsty:lasty IF arg_present gphi THEN gphi gphif firstx:lastx firsty:lasty if keyword_set forplt then BEGIN mask 1b tmask firstx:lastx firsty:lasty firstz eastboarder mask shift mask 1 0 mask westboarder mask shift mask 1 0 mask westboarder nx 1 0b northboarder mask shift mask 0 1 mask southboarder mask shift mask 0 1 mask southboarder ny 1 0b tmp1 shift northboarder 1 0 if key_periodic NE 1 OR nx NE jpi then tmp1 nx 1 0b tmp2 shift northboarder 1 0 if key_periodic NE 1 OR nx NE jpi then tmp2 0 0b add temporary tmp1 temporary tmp2 1b northboarder 1b southboarder northboarder temporary northboarder temporary add tmp1 shift eastboarder 0 1 tmp1 0 0b tmp2 shift eastboarder 0 1 tmp2 ny 1 0b add temporary tmp1 temporary tmp2 1b eastboarder 1b temporary westboarder eastboarder temporary eastboarder temporary add tmp1 mask shift mask 0 1 shift mask 0 1 NE 1b tmp1 ny 1 1b tmp1 0 1b tmp2 mask shift mask 1 0 shift mask 1 0 NE 1b if key_periodic NE 1 OR nx NE jpi then begin tmp2 nx 1 1b tmp2 0 1b endif no1 temporary tmp1 temporary tmp2 tmp temporary northboarder temporary eastboarder mask temporary no1 mask 0:nx 2 0b mask 0:ny 2 0b tmp temporary tmp temporary mask tmp where tmp GE 1 if tmp 0 NE 1 then begin glam tmp glamt firstx:lastx firsty:lasty tmp gphi tmp gphit firstx:lastx firsty:lasty tmp endif ENDIF IF arg_present e1 THEN e1 e1f firstx:lastx firsty:lasty IF arg_present e2 THEN e2 e2f firstx:lastx firsty:lasty 3d vectors IF keyword_set forplt THEN mask fmask firstx:lastx firsty:lasty firstz ELSE IF arg_present mask THEN mask fmask firstx:lastx firsty:lasty firstz:lastz END ELSE:BEGIN ras report Wrong definition of vargrid vargrid Only T U V W or F are acceptable stop END ENDCASE IF testvar var key_performance EQ 2 THEN print temps grille: attribution des scalaires vecteurs et tableaux systime 1 tempdeux Variables refering to the vertical dimension tempdeux systime 1 For key_performance 2 if keyword_set wdepth then begin gdep gdepw firstz:lastz e3 e3w firstz:lastz endif else begin gdep gdept firstz:lastz e3 e3t firstz:lastz ENDELSE for the vertical sections with partial steps from domzgh: hdept ji jj gdept ji jj ik hdepw ji jj gdepw ji jj ik 1 IF keyword_set type AND keyword_set key_partialstep THEN BEGIN CASE 1 OF type EQ xz AND ny EQ 1:BEGIN bottom total tmask firstx:lastx firsty:lasty firstz:lastz 3 good where bottom NE 0 AND bottom NE nz 1 keyword_set wdepth IF good 0 NE 1 THEN BEGIN bottom lindgen nx bottom 1l keyword_set wdepth nx bottom bottom good IF lastz EQ jpk 1 THEN gdep nz 1 max hdepw gdep replicate 1 nx gdep if keyword_set wdepth THEN truegdep hdepw firstx:lastx firsty:lasty ELSE truegdep hdept firstx:lastx firsty:lasty gdep bottom truegdep good ENDIF END type EQ yz AND nx EQ 1:BEGIN bottom total tmask firstx:lastx firsty:lasty firstz:lastz 3 good where bottom NE 0 AND bottom NE nz 1 keyword_set wdepth IF good 0 NE 1 THEN BEGIN bottom lindgen ny bottom 1l keyword_set wdepth ny bottom bottom good IF lastz EQ jpk 1 THEN gdep nz 1 max hdepw gdep replicate 1 ny gdep if keyword_set wdepth THEN truegdep hdepw firstx:lastx firsty:lasty ELSE truegdep hdept firstx:lastx firsty:lasty gdep bottom truegdep good ENDIF END ELSE: ENDCASE ENDIF for the vertical sections with roms IF keyword_set type AND n_elements romszinfos NE 0 THEN BEGIN romsdp romsdepth IF romsdp 0 NE 1 THEN BEGIN IF jpt EQ 1 THEN BEGIN CASE type OF z :gdep moyenne temporary romsdp xy xz :gdep moyenne temporary romsdp y yz :gdep moyenne temporary romsdp x zt :gdep moyenne temporary romsdp xy ELSE: ENDCASE ENDIF ELSE BEGIN CASE type OF z :gdep moyenne temporary romsdp xyt xz :gdep grossemoyenne temporary romsdp yt yz :gdep grossemoyenne temporary romsdp xt zt :gdep grossemoyenne temporary romsdp xy ELSE: ENDCASE ENDELSE IF size gdep n_dimensions EQ 2 THEN gdep remplit gdep niter 32000 mask gdep LT 1 E19 basique fillxdir ENDIF ENDIF IF testvar var key_performance EQ 2 THEN print temps grille: Variables se rapportant a la dimension verticale systime 1 tempdeux Triangulation vector when TRI is activated if arg_present TRI then if triangles_list 0 EQ 1 OR keyword_set notri then tri 1 ELSE BEGIN tempdeux systime 1 pour key_performance 2 msk bytarr jpi jpj msk firstx:lastx firsty:lasty 1 ind where msk triangles_list 0 msk triangles_list 1 msk triangles_list 2 EQ 1 tri triangles_list ind firstx firsty jpi y tri jpi x tri y jpi tri x y nx IF testvar var key_performance EQ 2 THEN print temps grille: decoupage de la triangulation systime 1 tempdeux ENDELSE To make sure there is not any degenerated dimension 1 mask reform mask over glam reform glam over gphi reform gphi over gdep reform gdep over e1 reform e1 over e2 reform e2 over e3 reform e3 over if keyword_set savedbox THEN restoreboxparam boxparam4grille dat if keyword_set key_performance THEN print temps grille systime 1 tempsun IF NOT keyword_set key_forgetold THEN BEGIN updateold ENDIF return end"); a[216] = new Array("./ToBeReviewed/GRILLE/t2v.html", "t2v.pro", "", " file_comments Allows to pass a field referring to the grid T on the grid V thanks to the average res 0 5 res shift res 0 1 categories Grid param TEMP in required a 2d 3d or 4d array returns a 2d 3d or 4d array uses common restrictions Force parameters of the zoom on the grid V to be the same as those on the grid T restrictions Points which can not be calculated are put at the value NaN consecrated by IDL: values f_nan history From Marina Levy s programs Sebastien Masson smasson lodyc jussieu fr : Validation 5 6 2000 version Id: t2v pro 370 2008 08 07 07:59:15Z pinsard FUNCTION t2v temp compile_opt idl2 strictarrsubs cm_4mesh cm_4data cm_4cal IF NOT keyword_set key_forgetold THEN BEGIN updatenew ENDIF res temp We force nxt nxv etc firstxv firstxt lastxv lastxt firstyv firstyt lastyv lastyt nxv nxt nyv nyt vargrid V if NOT keyword_set valmask then valmask 1e20 lat1 gphit 0 firstyt lat2 gphiv 0 lastyv case on tha array s size and application taille size temp CASE taille 0 OF 1: res 1 2: BEGIN case 1 of taille 1 eq nxt and taille 2 eq nyt: taille 1 eq jpi and taille 2 eq jpj: res res firstxt:lastxt firstyt:lastyt else: return report Probleme d adequation entre les tailles du domaine et de la boite endcase mask tmask firstxt:lastxt firstyt:lastyt 0 terre where mask EQ 0 IF terre 0 NE 1 THEN res terre values f_nan res 0 5 res shift res 0 1 res nyt 1 values f_nan mask vmask firstxt:lastxt firstyt:lastyt 0 terre where mask EQ 0 IF terre 0 NE 1 THEN res terre valmask END 3: BEGIN case 1 of taille 1 eq nxt and taille 2 eq nyt AND taille 3 EQ nzt: taille 1 eq nxt and taille 2 eq nyt AND taille 3 EQ jpk: res res firstzt:lastzt taille 1 eq nxt and taille 2 eq nyt AND taille 3 EQ jpt: taille 1 eq jpi and taille 2 eq jpj AND taille 3 EQ jpk: res res firstxt:lastxt firstyt:lastyt firstzt:lastzt taille 1 eq jpi and taille 2 eq jpj AND taille 3 EQ jpt: res res firstxt:lastxt firstyt:lastyt else: return report Probleme d adequation entre les tailles du domaine et de la boite ENDCASE if taille 3 EQ jpt then begin mask tmask firstxt:lastxt firstyt:lastyt lastzt nzt NE jpk mask temporary mask replicate 1 jpt mask reform mask nxt nyt jpt over ENDIF ELSE mask tmask firstxt:lastxt firstyt:lastyt firstzt:lastzt terre where temporary mask EQ 0 IF terre 0 NE 1 THEN res temporary terre values f_nan res 0 5 res shift res 0 1 0 res nyt 1 values f_nan if taille 3 EQ jpt then BEGIN mask vmask firstxt:lastxt firstyt:lastyt lastzt nzt NE jpk mask temporary mask replicate 1 jpt mask reform mask nxt nyt jpt over ENDIF ELSE mask vmask firstxt:lastxt firstyt:lastyt firstzt:lastzt terre where temporary mask EQ 0 IF terre 0 NE 1 THEN res temporary terre valmask END 4: BEGIN case 1 of taille 1 eq nxt and taille 2 eq nyt AND taille 3 EQ nzt AND taille 4 EQ jpt: taille 1 eq nxt and taille 2 eq nyt AND taille 3 EQ jpk AND taille 4 EQ jpt: res res firstzt:lastzt taille 1 eq jpi and taille 2 eq jpj AND taille 3 EQ jpk AND taille 4 EQ jpt: res res firstxt:lastxt firstyt:lastyt firstzt:lastzt else: return report Probleme d adequation entre les tailles du domaine et de la boite ENDCASE mask tmask firstxt:lastxt firstyt:lastyt firstzt:lastzt mask temporary mask replicate 1 jpt mask reform mask nxt nyt nzt jpt over terre where temporary mask EQ 0 IF terre 0 NE 1 THEN res temporary terre values f_nan res 0 5 res shift res 0 1 0 0 res nyt 1 values f_nan mask vmask firstxt:lastxt firstyt:lastyt firstzt:lastzt mask temporary mask replicate 1 jpt mask reform mask nxt nyt nzt jpt over terre where temporary mask EQ 0 IF terre 0 NE 1 THEN res temporary terre valmask END ENDCASE IF NOT keyword_set key_forgetold THEN BEGIN updateold ENDIF return res END"); a[217] = new Array("./ToBeReviewed/GRILLE/tracegrille.html", "tracegrille.pro", "", " file_comments Draw the grid categories Grid param GLAMIN in optional type 1d or 2d array default glam specified by vargrid on the domain defined by domdef Longitude of points of the grid param GPHIIN in optional type 1d or 2d array default gphi specified by vargrid on the domain defined by domdef Latitude of points of the grid keyword XSTRIDE type integer default 1 It specify that we want to trace only one line of constant i every xstride points keyword YSTRIDE type integer default 1 It specify that we want to trace only one line of constant j every ystride points keyword OCEAN To trace the grid only on ocean points keyword EARTH To trace the grid only on land points keyword RMOUT Select to remove all cell having one corner out of the plot boundaries x range y range keyword _EXTRA Used to pass keywords uses common examples IDL plt indgen jpi jpj nocontour nofill IDL vargrid T IDL tracegrille ocean color 20 IDL tracegrille earth color 80 history Sebastien Masson smasson lodyc jussieu fr version Id: tracegrille pro 378 2008 08 12 12:35:46Z pinsard PRO tracegrille glamin gphiin OCEAN ocean EARTH earth XSTRIDE xstride YSTRIDE ystride RMOUT rmout _EXTRA extra compile_opt idl2 strictarrsubs cm_4mesh cm_4data IF NOT keyword_set key_forgetold THEN BEGIN updatenew ENDIF tempsun systime 1 For key_performance to avoid warning message oldexcept except except 0 if n_elements key_gridtype EQ 0 then key_gridtype c if n_elements glamin n_elements gphiin EQ 0 then BEGIN grille mask glam gphi gdep nx ny nz firstx firsty firstz lastx lasty lastz IF keyword_set ocean AND strmid key_gridtype 0 1 EQ c THEN BEGIN we reduce the mask to take into account the point located ON the coastline CASE vargrid OF U :BEGIN mask tmask firstx:lastx firsty:lasty IF NOT keyword_set key_periodic OR nx NE jpi THEN tmpx mask nx 1 mask mask shift mask 1 0 1 IF NOT keyword_set key_periodic OR nx NE jpi THEN mask nx 1 temporary tmpx END V :BEGIN mask tmask firstx:lastx firsty:lasty tmpy mask ny 1 mask mask shift mask 0 1 1 mask ny 1 temporary tmpy END F :BEGIN mask tmask firstx:lastx firsty:lasty IF NOT keyword_set key_periodic OR nx NE jpi THEN tmpx mask nx 1 tmpy mask ny 1 mask mask shift mask 1 0 shift mask 0 1 shift mask 1 1 1 mask ny 1 temporary tmpy IF NOT keyword_set key_periodic OR nx NE jpi THEN mask nx 1 temporary tmpx END ELSE: ENDCASE ENDIF ENDIF ELSE BEGIN glam glamin gphi gphiin IF size glam 0 EQ 1 AND size gphi 0 EQ 1 THEN BEGIN nx n_elements glam ny n_elements gphi glam glam replicate 1 ny gphi replicate 1 nx gphi ENDIF ELSE BEGIN nx size glam 1 ny size glam 2 ENDELSE ENDELSE if n_elements mask EQ 0 then mask replicate 1b nx ny if size mask 0 EQ 3 then mask mask 0 IF keyword_set RMOUT THEN BEGIN out where glam GT max x range OR glam LT min x range OR gphi GT max y range OR gphi LT min y range IF out 0 NE 1 THEN BEGIN glam out values f_nan gphi out values f_nan ENDIF ENDIF IF keyword_set ocean then BEGIN earth where mask EQ 0 if earth 0 NE 1 then begin glam earth values f_nan gphi earth values f_nan ENDIF earth 0 ENDIF IF keyword_set earth THEN BEGIN ocean where mask EQ 1 if ocean 0 NE 1 then begin glam ocean values f_nan gphi ocean values f_nan ENDIF ocean 0 ENDIF if NOT keyword_set xstride then xstride 1 if NOT keyword_set ystride then ystride 1 case strmid key_gridtype 0 1 of c :BEGIN for i 0 ny 1 ystride do begin plots glam i gphi i _extra extra endfor for i 0 nx 1 xstride do begin plots glam i gphi i _extra extra endfor END e :BEGIN shifted glam 0 0 LT glam 0 1 glam2 glam glam 1 glam 0 2 if shifted then begin for i 0 ny 2 do BEGIN xx transpose glam i glam2 i yy transpose gphi i gphi i 1 plots xx 0:2 nx 2 yy 0:2 nx 2 _extra extra ENDFOR ENDIF ELSE BEGIN for i 1 ny 1 do BEGIN xx transpose glam i glam2 i yy transpose gphi i gphi i 1 plots xx 0:2 nx 2 yy 0:2 nx 2 _extra extra ENDFOR ENDELSE for i 1 ny 1 2 do plots glam 0 2 i 1 glam 0 2 i gphi 0 2 i 1 gphi 0 2 i _extra extra for i 0 ny 2 2 do plots glam nx 1 2 i glam nx 1 2 i 1 gphi nx 1 2 i gphi nx 1 2 i 1 _extra extra END endcase if keyword_set key_performance THEN print temps trace grille systime 1 tempsun except oldexcept return end"); a[218] = new Array("./ToBeReviewed/GRILLE/u2t.html", "u2t.pro", "", " file_comments Allows to pass a field referring to the grid U on the grid T thanks to the average: res 0 5 res shift res 1 0 categories Grid param TEMP in required a 2d 3d or 4d array returns a 2d 3d or 4d array uses common restrictions Force parameters of the zoom on the grid V to be the same as those on the grid T restrictions Points which can not be calculated are put at the value NaN consecrated by IDL: values f_nan history From Marina Levy s programs Sebastien Masson smasson lodyc jussieu fr : Validation 5 6 2000 version Id: u2t pro 370 2008 08 07 07:59:15Z pinsard FUNCTION u2t temp compile_opt idl2 strictarrsubs cm_4mesh cm_4data cm_4cal IF NOT keyword_set key_forgetold THEN BEGIN updatenew ENDIF res temp on force nxt nxu etc firstxt firstxu lastxt lastxu firstyt firstyu lastyt lastyu nxt nxu nyt nyu vargrid T if NOT keyword_set valmask then valmask 1e20 lon1 glamt firstxt 0 lon2 glamu lastxu 0 case on tha array s size and application taille size temp CASE taille 0 OF 1: res 1 2: BEGIN case 1 of taille 1 eq nxu and taille 2 eq nyu: taille 1 eq jpi and taille 2 eq jpj: res res firstxu:lastxu firstyu:lastyu else: return report Probleme d adequation entre les tailles du domaine et de la boite endcase mask umask firstxu:lastxu firstyu:lastyu 0 terre where mask EQ 0 IF terre 0 NE 1 THEN res terre values f_nan res 0 5 res shift res 1 0 if NOT keyword_set key_periodic AND nxu EQ jpi then res 0 values f_nan mask tmask firstxu:lastxu firstyu:lastyu 0 terre where mask EQ 0 IF terre 0 NE 1 THEN res terre valmask END 3: BEGIN case 1 of taille 1 eq nxu and taille 2 eq nyu AND taille 3 EQ nzt: taille 1 eq nxu and taille 2 eq nyu AND taille 3 EQ jpk: res res firstzt:lastzt taille 1 eq nxu and taille 2 eq nyu AND taille 3 EQ jpt: taille 1 eq jpi and taille 2 eq jpj AND taille 3 EQ jpk: res res firstxu:lastxu firstyu:lastyu firstzt:lastzt taille 1 eq jpi and taille 2 eq jpj AND taille 3 EQ jpt: res res firstxu:lastxu firstyu:lastyu else: return report Probleme d adequation entre les tailles du domaine et de la boite ENDCASE if taille 3 EQ jpt then begin mask umask firstxu:lastxu firstyu:lastyu lastzt nzt NE jpk mask temporary mask replicate 1 jpt mask reform mask nxu nyu jpt over ENDIF ELSE mask umask firstxu:lastxu firstyu:lastyu firstzt:lastzt terre where temporary mask EQ 0 IF terre 0 NE 1 THEN res temporary terre values f_nan res 0 5 res shift res 1 0 0 if NOT keyword_set key_periodic AND nxu EQ jpi then res 0 values f_nan if taille 3 EQ jpt then BEGIN mask tmask firstxu:lastxu firstyu:lastyu lastzt nzt NE jpk mask temporary mask replicate 1 jpt mask reform mask nxu nyu jpt over ENDIF ELSE mask tmask firstxu:lastxu firstyu:lastyu firstzt:lastzt terre where temporary mask EQ 0 IF terre 0 NE 1 THEN res temporary terre valmask END 4: BEGIN case 1 of taille 1 eq nxu and taille 2 eq nyu AND taille 3 EQ nzt AND taille 4 EQ jpt: taille 1 eq nxu and taille 2 eq nyu AND taille 3 EQ jpk AND taille 4 EQ jpt: res res firstzt:lastzt taille 1 eq jpi and taille 2 eq jpj AND taille 3 EQ jpk AND taille 4 EQ jpt: res res firstxu:lastxu firstyu:lastyu firstzt:lastzt else: return report Probleme d adequation entre les tailles du domaine et de la boite ENDCASE mask umask firstxu:lastxu firstyu:lastyu firstzt:lastzt mask temporary mask replicate 1 jpt mask reform mask nxu nyu nzt jpt over terre where temporary mask EQ 0 IF terre 0 NE 1 THEN res temporary terre values f_nan res 0 5 res shift res 1 0 0 0 if NOT keyword_set key_periodic AND nxu EQ jpi then res 0 values f_nan mask tmask firstxu:lastxu firstyu:lastyu firstzt:lastzt mask temporary mask replicate 1 jpt mask reform mask nxu nyu nzt jpt over terre where temporary mask EQ 0 IF terre 0 NE 1 THEN res temporary terre valmask END endcase IF NOT keyword_set key_forgetold THEN BEGIN updateold ENDIF return res END"); a[219] = new Array("./ToBeReviewed/GRILLE/umask.html", "umask.pro", "", " file_comments calculate umask Economize memory we do not need to keep umask anymore categories Grid returns A 3d array corresponding to umask uses common examples Used like if umask was a known array by substituing umask by umask For example: Instead of write umask domainef we have to write umask domainef history Sebastien Masson smasson lodyc jussieu fr 11 12 98 6 99 introduction of the key_shift 20 9 99 cas jpk 1 Thanks to jpblod ipsl jussieu fr version Id: umask pro 370 2008 08 07 07:59:15Z pinsard FUNCTION umask compile_opt idl2 strictarrsubs cm_4mesh IF NOT keyword_set key_forgetold THEN BEGIN updatenew ENDIF tempsun systime 1 For key_performance CASE size tmask n_dimensions OF 2:res tmask shift tmask 1 0 3:res tmask shift tmask 1 0 0 ENDCASE if NOT keyword_set key_periodic then res jpi 1 umaskred if keyword_set key_performance THEN print temps umask systime 1 tempsun return res end"); a[220] = new Array("./ToBeReviewed/GRILLE/v2t.html", "v2t.pro", "", " file_comments Allows to pass a field referring to the grid V on the grid T thanks to the average: res 0 5 res shift res 1 0 categories Grid param TEMP in required a 2d 3d or 4d array returns a 2d 3d or 4d array uses common restrictions Force parameters of the zoom on the grid V to be the same as those on the grid T restrictions Points which can not be calculated are put at the value NaN consecrated by IDL: values f_nan history From Marina Levy s programs Sebastien Masson smasson lodyc jussieu fr : Validation 5 6 2000 version Id: v2t pro 370 2008 08 07 07:59:15Z pinsard todo seb: nom du input FUNCTION v2t temp compile_opt idl2 strictarrsubs cm_4mesh cm_4data cm_4cal IF NOT keyword_set key_forgetold THEN BEGIN updatenew ENDIF res temp We force nxt nxv etc firstxt firstxv lastxt lastxv firstyt firstyv lastyt lastyv nxt nxv nyt nyv vargrid T if NOT keyword_set valmask then valmask 1e20 lat1 gphit 0 firstyt lat2 gphiv 0 lastyv case on tha array s size and application taille size temp CASE taille 0 OF 1: res 1 2: BEGIN case 1 of taille 1 eq nxv and taille 2 eq nyv: taille 1 eq jpi and taille 2 eq jpj: res res firstxv:lastxv firstyv:lastyv else: return report Probleme d adequation entre les tailles du domaine et de la boite endcase mask vmask firstxv:lastxv firstyv:lastyv 0 terre where mask EQ 0 IF terre 0 NE 1 THEN res terre values f_nan res 0 5 res shift res 0 1 res 0 values f_nan mask tmask firstxv:lastxv firstyv:lastyv 0 terre where mask EQ 0 IF terre 0 NE 1 THEN res terre valmask END 3: BEGIN case 1 of taille 1 eq nxv and taille 2 eq nyv AND taille 3 EQ nzt: taille 1 eq nxv and taille 2 eq nyv AND taille 3 EQ jpk: res res firstzt:lastzt taille 1 eq nxv and taille 2 eq nyv AND taille 3 EQ jpt: taille 1 eq jpi and taille 2 eq jpj AND taille 3 EQ jpk: res res firstxv:lastxv firstyv:lastyv firstzt:lastzt taille 1 eq jpi and taille 2 eq jpj AND taille 3 EQ jpt: res res firstxv:lastxv firstyv:lastyv else: return report Probleme d adequation entre les tailles du domaine et de la boite ENDCASE if taille 3 EQ jpt then begin mask vmask firstxv:lastxv firstyv:lastyv lastzt nzt NE jpk mask temporary mask replicate 1 jpt mask reform mask nxv nyv jpt over ENDIF ELSE mask vmask firstxv:lastxv firstyv:lastyv firstzt:lastzt terre where temporary mask EQ 0 IF terre 0 NE 1 THEN res temporary terre values f_nan res 0 5 res shift res 0 1 0 res 0 values f_nan if taille 3 EQ jpt then BEGIN mask tmask firstxv:lastxv firstyv:lastyv lastzt nzt NE jpk mask temporary mask replicate 1 jpt mask reform mask nxv nyv jpt over ENDIF ELSE mask tmask firstxv:lastxv firstyv:lastyv firstzt:lastzt terre where temporary mask EQ 0 IF terre 0 NE 1 THEN res temporary terre valmask END 4: BEGIN case 1 of taille 1 eq nxv and taille 2 eq nyv AND taille 3 EQ nzt AND taille 4 EQ jpt: taille 1 eq nxv and taille 2 eq nyv AND taille 3 EQ jpk AND taille 4 EQ jpt: res res firstzt:lastzt taille 1 eq jpi and taille 2 eq jpj AND taille 3 EQ jpk AND taille 4 EQ jpt: res res firstxv:lastxv firstyv:lastyv firstzt:lastzt else: return report Probleme d adequation entre les tailles du domaine et de la boite ENDCASE mask vmask firstxv:lastxv firstyv:lastyv firstzt:lastzt mask temporary mask replicate 1 jpt mask reform mask nxv nyv nzt jpt over terre where temporary mask EQ 0 IF terre 0 NE 1 THEN res temporary terre values f_nan res 0 5 res shift res 0 1 0 0 res 0 values f_nan mask tmask firstxv:lastxv firstyv:lastyv firstzt:lastzt mask temporary mask replicate 1 jpt mask reform mask nxv nyv nzt jpt over terre where temporary mask EQ 0 IF terre 0 NE 1 THEN res temporary terre valmask END endcase IF NOT keyword_set key_forgetold THEN BEGIN updateold ENDIF return res END"); a[221] = new Array("./ToBeReviewed/GRILLE/vmask.html", "vmask.pro", "", " file_comments calculate fmask Economize memory we do not need to keep vmask anymore categories Grid returns A 3d array corresponding to vmask examples Used like if vmask was a known array by substituing vmask by vmask For example: Instead of write vmask domainef we have to write vmask domainef history Sebastien Masson smasson lodyc jussieu fr 11 12 98 20 9 99 cas jpk 1 merci jpblod ipsl jussieu fr version Id: vmask pro 325 2007 12 06 10:04:53Z pinsard FUNCTION vmask compile_opt idl2 strictarrsubs common tempsun systime 1 For key_performance CASE size tmask n_dimensions OF 2:res tmask shift tmask 0 1 3:res tmask shift tmask 0 1 0 ENDCASE res jpj 1 vmaskred if keyword_set key_performance THEN print temps vmask systime 1 tempsun return res end"); a[222] = new Array("./ToBeReviewed/HOPE/completetype.html", "completetype.pro", "", " file_comments categories param TYPEIN returns uses restrictions examples history version Id: completetype pro 325 2007 12 06 10:04:53Z pinsard todo seb function completetype typein compile_opt idl2 strictarrsubs type typein case type of x :type type yzt y :type type xzt z :type type zyt t :type type xyz xy :type type zt xz :type type yt yz :type type xt xt :type type yz yt :type type xz zt :type type xy xyz :type type t xyt :type type z yzt :type type x xyzt : endcase return type end "); a[223] = new Array("./ToBeReviewed/HOPE/computehopegrid.html", "computehopegrid.pro", "", " file_comments categories Grid param XAXIS param YAXIS param ZAXIS param LINETYPE keyword FORTHEMASK keyword WPOINT keyword FIRSTS keyword LASTS keyword PTTYPE uses common history Sebastien Masson smasson lodyc jussieu fr 2001 06 version Id: computehopegrid pro 370 2008 08 07 07:59:15Z pinsard todo seb PRO computehopegrid xaxis yaxis zaxis linetype FORTHEMASK forthemask WPOINT wpoint FIRSTS firsts LASTS lasts PTTYPE pttype compile_opt idl2 strictarrsubs cm_4mesh cm_4data IF NOT keyword_set key_forgetold THEN BEGIN updatenew ENDIF if not keyword_set scalar keyword_set vector then scalar 1 jpiglo n_elements xaxis jpjglo n_elements yaxis jpkglo n_elements zaxis jpi jpiglo jpj jpjglo jpk jpkglo if NOT keyword_set firsts then firsts 0 0 0 if NOT keyword_set lasts then lasts jpi 1 jpj 1 jpk 1 determination of the grid type and of the point type if keyword_set pttype then vargrid pttype if linetype EQ odd even then key_gridtype e ELSE key_gridtype c computation of the horizontal grid if key_gridtype EQ e then begin if vargrid EQ T then begin glamt xaxis glamt glamt replicate 1 jpj xstep glamt 1 0 glamt 0 0 2 glamt 2 lindgen jpj 2 glamt 2 lindgen jpj 2 xstep glamu glamt xstep ENDIF ELSE BEGIN glamu xaxis glamu glamu replicate 1 jpj xstep glamu 1 0 glamu 0 0 2 glamu 2 lindgen jpj 2 glamu 2 lindgen jpj 2 xstep glamt glamu xstep ENDELSE zoom glamt glamt firsts 0 :lasts 0 firsts 1 :lasts 1 glamu glamu firsts 0 :lasts 0 firsts 1 :lasts 1 jpiglo lasts 0 firsts 0 1 jpi jpiglo jpjglo lasts 1 firsts 1 1 jpj jpjglo glamv glamu glamf glamu gphit yaxis firsts 1 :lasts 1 gphit replicate 1 jpi gphit gphif gphit gphiu gphit gphiv gphif ENDIF ELSE BEGIN if vargrid eq T then begin glamt xaxis glamt glamt replicate 1 jpj glamu glamt glamt 1 0 glamt 0 0 2 ENDIF ELSE BEGIN glamu xaxis glamu glamu replicate 1 jpj xstep glamu 1 0 glamu 0 0 2 glamt glamu glamu 1 0 glamu 0 0 2 ENDELSE zoom glamt glamt firsts 0 :lasts 0 firsts 1 :lasts 1 glamu glamu firsts 0 :lasts 0 firsts 1 :lasts 1 jpiglo lasts 0 firsts 0 1 jpi jpiglo jpjglo lasts 1 firsts 1 1 jpj jpjglo glamv glamt glamf glamu gphit yaxis firsts 1 :lasts 1 gphit replicate 1 jpi gphit gphiu gphit if jpj GT 1 then begin gphiv gphit gphit 0 1 gphit 0 0 2 gphif gphit gphit 0 1 gphit 0 0 2 ENDIF ELSE BEGIN gphiv gphit gphif gphit ENDELSE ENDELSE computation of the vertical grid if keyword_set wpoint then begin gdepw zaxis if jpk ne 1 then begin gdept shift gdepw 1 gdepw 2 gdept jpk 1 gdepw jpk 1 5 gdepw jpk 1 gdepw jpk 2 endif else gdept zaxis endif else begin gdept zaxis if jpk ne 1 then begin gdepw shift gdept 1 gdept 2 gdepw 0 0 endif else gdepw zaxis endelse computation of the vertical scale factors if jpk ne 1 then begin e3t abs shift gdepw 1 gdepw e3t jpk 1 abs gdept jpk 1 gdepw jpk 1 e3w abs gdept shift gdept 1 e3w 0 abs gdept 0 gdepw 0 endif else begin e3t 1 e3w 1 endelse zoom gdept gdept firsts 2 :lasts 2 gdepw gdepw firsts 2 :lasts 2 e3t e3t firsts 2 :lasts 2 e3w e3w firsts 2 :lasts 2 jpkglo lasts 2 firsts 2 1 jpk jpkglo computation of the horizontal scale factors e1t replicate 1b jpi jpj e2t replicate 1b jpi jpj e1u e1t e2u e2t e1v e1t e2v e2t e1f e1t e2f e2t mask tmask replicate 1b jpi jpj jpk if keyword_set forthemask then BEGIN land where forthemask ge valmask 10 if land 0 ne 1 then tmask land 0b endif umaskred replicate 1 jpj jpk vmaskred replicate 1 jpi jpk fmaskredy replicate 1 jpj jpk fmaskredx replicate 1 jpi jpk updateold domdef if keyword_set firsts AND keyword_set lasts then BEGIN if vargrid EQ T then BEGIN if jpj GT 1 then begin lon1 min glamt 0 0 1 lon2 max glamt jpi 1 0 1 endif ELSE BEGIN lon1 min glamt 0 0 lon2 max glamt jpi 1 0 ENDELSE ENDIF ELSE BEGIN if jpj GT 1 then begin lon1 min glamu 0 0 1 lon2 max glamu jpi 1 0 1 endif ELSE BEGIN lon1 min glamu 0 0 lon2 max glamu jpi 1 0 ENDELSE ENDELSE lat1 min gphit 0 0 gphit 0 jpj 1 lat2 max gphit 0 0 gphit 0 jpj 1 domdef lon1 lon2 lat1 lat2 gdepw 0 gdept jpk 1 gridtype vargrid ENDIF ixminmesh 0l ixmaxmesh long jpi 1 iyminmesh 0l iymaxmesh long jpj 1 izminmesh 0l izmaxmesh long jpk 1 for the triangulation key_periodic glamt 0 EQ glamt jpi 1 glamt 1 glamt 0 MOD 360 if jpi gt 4 AND jpj GT 4 then begin triangles_list triangule shifted glamt 0 0 LT glamt 0 1 twin_corners_up 1 twin_corners_dn 1 ENDIF ELSE BEGIN triangles_list 1 twin_corners_up 1 twin_corners_dn 1 ENDELSE IF NOT keyword_set key_forgetold THEN BEGIN updateold ENDIF return end "); a[224] = new Array("./ToBeReviewed/HOPE/createhopestruct.html", "createhopestruct.pro", "", " file_comments categories param EVENT returns uses restrictions examples history version Id: createhopestruct pro 325 2007 12 06 10:04:53Z pinsard todo seb FUNCTION createhopestruct event compile_opt idl2 strictarrsubs widget_control event top get_uvalue top_uvalue find the selected variable selected top_uvalue 1 findline top_uvalue selected get the variable id varid top_uvalue 1 findline top_uvalue datavarid selected get the section type type top_uvalue 1 findline top_uvalue sectype selected get its dimension dimsvar top_uvalue 1 findline top_uvalue dimvar selected tosort sortdim completetype type dimsvar dimsvar tosort get the specified spatial domain and build reading parameters linetype top_uvalue 1 findline top_uvalue linetype selected case linetype of odd :domainid widget_info event top find_by_uname basedomainodd even :domainid widget_info event top find_by_uname basedomaineven odd even :domainid widget_info event top find_by_uname basedomainodd even endcase allaxes top_uvalue 1 findline top_uvalue dimlist xaxis allaxes dimsvar 0 xlimits top_uvalue 1 findline top_uvalue xlimits if NOT keyword_set xlimits then begin xid widget_info domainid find_by_uname xinterval widget_control xid get_value xint endif ELSE xint xaxis where xaxis GE xlimits 0 AND xaxis LE xlimits 1 yaxis allaxes dimsvar 1 yaxis reverse yaxis latitudes from the south to the north ylimits top_uvalue 1 findline top_uvalue ylimits if NOT keyword_set ylimits then begin yid widget_info domainid find_by_uname yinterval widget_control yid get_value yint endif ELSE yint yaxis where yaxis GE ylimits 0 AND yaxis LE ylimits 1 zaxis allaxes dimsvar 2 zlimits top_uvalue 1 findline top_uvalue zlimits if NOT keyword_set zlimits then begin zid widget_info domainid find_by_uname zinterval widget_control zid get_value zint endif ELSE zint zaxis where zaxis GE zlimits 0 AND zaxis LE zlimits 1 time axis and time interval time allaxes dimsvar 3 yyyymmdd vairdate time tlimits top_uvalue 1 findline top_uvalue tlimits if NOT keyword_set tlimits then BEGIN date1id widget_info event top find_by_uname date1 widget_control date1id get_value date1 date2id widget_info event top find_by_uname date2 widget_control date2id get_value date2 tlimits date1 date2 ENDIF tint time where yyyymmdd GE tlimits 0 AND yyyymmdd LE tlimits 1 limits of the domain nxt n_elements xint nyt n_elements yint nzt n_elements zint jpt n_elements tint firstx where xaxis GE xint 0 0 firsty where yaxis GE yint 0 0 lasty firsty nyt 1 firstz where zaxis GE zint 0 0 firstt where time GE tint 0 0 read the array cdfid ncdf_open top_uvalue 1 findline top_uvalue filename offset firstx n_elements yaxis lasty 1 firstz firstt count nxt nyt nzt jpt tosortinv sortdim completetype type inv sort the offset and count for the case of the array is not written as a xyzt array but for example as a yzxt array offset offset tosortinv count count tosortinv call to ncdf_varget ncdf_varget cdfid varid array offset offset count count force to keep the dimension equal to 1 if count 3 eq 1 then array reform array count 0 count 1 count 2 count 3 over if not array_equal tosort lindgen 4 then array transpose temporary array tosort count nxt nyt nzt jpt if jpt eq 1 then array reform array count 0 count 1 count 2 count 3 over array reverse array 2 over if there is no longitude zoom shift the array to obtain longitude between 20 and 380 if nxt EQ 128 OR nxt EQ 256 then begin key_shift where xaxis GE 20 0 xaxis shift temporary xaxis key_shift xaxis where xaxis LT 20 xaxis where xaxis LT 20 360 array shift temporary array key_shift 0 0 0 ENDIF ELSE key_shift 0 get some informations about the array insidevar ncdf_varinq cdfid varid if insidevar natts NE 0 then begin attnames strarr insidevar natts for attiq 0 insidevar natts 1 do attnames attiq strlowcase ncdf_attname cdfid varid attiq get the name if where attnames EQ long_name 0 EQ 1 then value ELSE ncdf_attget cdfid varid long_name value varname strtrim string value 2 get the units if where attnames EQ units 0 EQ 1 then value ELSE ncdf_attget cdfid varid units value varunit strtrim string value 2 get the missing_value if where attnames EQ missing_value 0 EQ 1 then valmask 1e20 ELSE ncdf_attget cdfid varid missing_value valmask ENDIF ELSE BEGIN varunit valmask 1e20 varname ENDELSE varexp build arguments to use computehopegrid and put it together in a structure firsts firstx firsty firstz lasts firstx nxt 1 firsty nyt 1 firstz nzt 1 vargrid top_uvalue 1 findline top_uvalue pointtype selected hopegrid xaxis:xaxis yaxis:yaxis zaxis:zaxis firsts:firsts lasts:lasts type:type linetype:linetype pttype:vargrid hopestru array:array unit:varunit name:varname date:time firstt:firstt jpt 1 grid:vargrid hopegrid:hopegrid we close the netcdf file before living ncdf_close cdfid return hopestru end"); a[225] = new Array("./ToBeReviewed/HOPE/cw_selectinterval.html", "cw_selectinterval.pro", "", " PRO testwid_event event compile_opt idl2 strictarrsubs widget_control event id get_uvalue uval if n_elements uval EQ 0 then return case uval of done :widget_control event top destroy get :BEGIN id widget_info event top find_by_uname discret widget_control id get_value value1 help value1 print value1 value1 id widget_info event top find_by_uname continus widget_control id get_value value2 help value2 print value2 value2 END ELSE: endcase return end PRO testwid _extra ex compile_opt idl2 strictarrsubs base widget_base COLUMN nothing widget_label base value beginning of the test nothing cw_selectinterval base 10 indgen 5 _extra ex uname discret uvalue discret print nothing nothing cw_selectinterval base indgen 20 _extra ex uname continus uvalue continus print nothing nothing widget_button base value get uvalue get nothing widget_button base value done uvalue done widget_control base REALIZE xmanager testwid base no_block return end file_comments categories Compound widget param ID returns restrictions examples history version Id: cw_selectinterval pro 327 2007 12 13 16:22:35Z pinsard todo seb FUNCTION cw_selectinterval_get_value id compile_opt idl2 strictarrsubs bgroupid widget_info id find_by_uname bgroup the widget is a set of button if bgroupid ne 0 then begin widget_control bgroupid get_value selected widget_control bgroupid get_uvalue vecteur vecteur vecteur vecteur endif else begin the widget is 2 sliders Minid Widget_Info Id Find_by_uname min widget_control minid get_value minval minval minval value maxid widget_info id find_by_uname max widget_control maxid get_value maxval maxval maxval value widget_control minid get_uvalue vecteur vecteur vecteur vecteur selected where vecteur ge minval and vecteur le maxval ENDELSE if selected 0 eq 1 then return 1 else return vecteur selected END file_comments categories Compound widget param EVENT returns restrictions examples history version Id: cw_selectinterval pro 327 2007 12 13 16:22:35Z pinsard FUNCTION cw_selectinterval_event event compile_opt idl2 strictarrsubs widget_control event id get_uvalue uval case uval name of min :begin change the value if the minimum for the slider called max maxid widget_info event handler find_by_uname max widget_control maxid set_value SLIDER_MIN:event value 1 end max :begin change the value if the maximum for the slider called min minid widget_info event handler find_by_uname min widget_control minid set_value SLIDER_MAX:event value 1 end bgroup : endcase return ID:event handler TOP:event top HANDLER:0L END file_comments categories Compound widget param PARENT The widget ID of the parent widget param VECTEUR type vector A vector whose the first element must be the smallest one and the last must be the biggest one keyword _EXTRA Used to pass keywords returns restrictions examples history version Id: cw_selectinterval pro 327 2007 12 13 16:22:35Z pinsard FUNCTION cw_selectinterval parent vecteur _EXTRA ex compile_opt idl2 strictarrsubs base widget_base parent EVENT_FUNC cw_selectinterval_event FUNC_GET_VALUE cw_selectinterval_get_value PRO_SET_VALUE cw_selectinterval_set_value ROW _extra ex if n_elements vecteur le 10 then begin nothing CW_BGROUP base strtrim vecteur 1 nonexclusive row uvalue name: bgroup vecteur:vecteur uname bgroup buttvalue bytarr n_elements nothing buttvalue 0 1 widget_control nothing set_value buttvalue endif else begin min min floor vecteur max max ceil vecteur nothing cw_slider_pm base value min min min max max 1 uvalue name: min vecteur:vecteur uname min nothing cw_slider_pm base value max min min 1 max max uvalue name: max uname max endelse return base end"); a[226] = new Array("./ToBeReviewed/HOPE/domainpart.html", "domainpart.pro", "", " file_comments categories param TOP_UVALUE param BASEDOMAIN param SELECTED keyword DESTROY returns uses restrictions examples history version Id: domainpart pro 327 2007 12 13 16:22:35Z pinsard todo seb PRO domainpart top_uvalue basedomain selected DESTROY destroy compile_opt idl2 strictarrsubs if keyword_set destroy then BEGIN id widget_info basedomain find_by_uname title IF id NE 0 THEN widget_control id destroy id widget_info basedomain find_by_uname oddsecchoice IF id NE 0 THEN widget_control id destroy id widget_info basedomain find_by_uname evensecchoice IF id NE 0 THEN widget_control id destroy id widget_info basedomain find_by_uname odd evensecchoice IF id NE 0 THEN widget_control id destroy id widget_info basedomain find_by_uname basex IF id NE 0 THEN widget_control id destroy id widget_info basedomain find_by_uname basey IF id NE 0 THEN widget_control id destroy id widget_info basedomain find_by_uname basez IF id NE 0 THEN widget_control id destroy return endif we get the size of the dimension id of this section dimvar top_uvalue 1 findline top_uvalue dimvar selecteddim dimvar selected typedim top_uvalue 1 findline top_uvalue typedim sorteddim selecteddim sortdim typedim selecteddim dimlist top_uvalue 1 findline top_uvalue dimlist longitude part basex widget_info basedomain find_by_uname basex IF basex NE 0 THEN widget_control basex destroy basex widget_base basedomain row uname basex nothing widget_text basex value longitude xsize 10 nothing cw_selectinterval basex dimlist sorteddim 0 uname xinterval uvalue name: xinterval latitude part basey widget_info basedomain find_by_uname basey IF basey NE 0 THEN widget_control basey destroy basey widget_base basedomain row uname basey nothing widget_text basey value latitude xsize 10 nothing cw_selectinterval basey reverse dimlist sorteddim 1 uname yinterval uvalue name: yinterval depth part basez widget_info basedomain find_by_uname basez IF basez NE 0 THEN widget_control basez destroy basez widget_base basedomain row uname basez nothing widget_text basez value depth xsize 10 nothing cw_selectinterval basez dimlist sorteddim 2 uname zinterval uvalue name: zinterval end"); a[227] = new Array("./ToBeReviewed/HOPE/findlineandpointtype.html", "findlineandpointtype.pro", "", " file_comments categories param SECTYPE param XAXIS param YAXIS param IODIR returns uses restrictions examples history version Id: findlineandpointtype pro 325 2007 12 06 10:04:53Z pinsard todo seb FUNCTION findlineandpointtype sectype xaxis yaxis iodir the file HOPE_lonlat nc is used in this function This file must be localized in iodir netcdf HOPE_lonlat dimensions: latTlow 242 lonTlowodd 128 latThigh 390 lonThighodd 256 variables: float latTlow latTlow latTlow:units degrees_north float lonTlowodd lonTlowodd lonTlowodd:units degrees_east lonTlowodd:point_spacing even lonTlowodd:modulo float latThigh latThigh latThigh:units degrees_north float lonThighodd lonThighodd lonThighodd:units degrees_east lonThighodd:point_spacing even lonThighodd:modulo compile_opt idl2 strictarrsubs jpi n_elements xaxis jpj n_elements yaxis determination of the grid type and of the point type low resolution grid: jpi 128 jpj 121 x 2 jpk 20 0 1 4 2 8 4 2 5 6 odd T u T u 93 3 even T u T u 92 2 odd T u T u 91 1 even T u T u 90 0 high resolution grid: jpi 256 jpj 195 x 2 jpk 29 0 0 7 1 4 2 1 2 8 odd T u T u 91 6 even T u T u 91 0 odd T u T u 90 5 even T u T u 90 0 x0 floor xaxis 0 10 10 y0 floor yaxis 0 10 10 case sectype of xy :BEGIN if jpi NE 128 and jpi NE 256 OR jpj NE 121 AND jpj NE 121 2 AND jpj NE 195 AND jpj NE 195 2 then begin ras report CASE NOT coded stop ENDIF case 1 of jpj EQ 195: BEGIN case X0 OF 0:BEGIN line even vargrid T END 0 7:BEGIN case y0 OF 91 6:BEGIN line odd vargrid T END 91 0:BEGIN line even vargrid U END ELSE:BEGIN ras report CASE NOT coded stop END endcase END 1 4:BEGIN line odd vargrid U END endcase END jpj EQ 121:BEGIN case x0 OF 0:BEGIN line even vargrid T END 1 4:BEGIN case y0 OF 93 3:BEGIN line odd vargrid T END 92 2:BEGIN line even vargrid U END ELSE:BEGIN ras report CASE NOT coded stop END endcase END 2 8:BEGIN line odd vargrid U END endcase END jpj EQ 195 2:BEGIN line odd even case x0 OF 0 7:vargrid T 1 4:vargrid U ELSE:BEGIN ras report CASE NOT coded stop END endcase END jpj EQ 121 2:BEGIN line odd even case x0 OF 1 4:vargrid T 2 8:vargrid U ELSE:BEGIN ras report CASE NOT coded stop END endcase END ELSE:BEGIN ras report CASE NOT coded stop END endcase END xz :BEGIN if jpi NE 128 and jpi NE 256 then begin ras report CASE NOT coded stop ENDIF case X0 OF 0:BEGIN line even vargrid T END 0 7:BEGIN id ncdf_open iodir HOPE_lonlat nc ncdf_varget id latThigh lat test where lat EQ yaxis 0 0 if test EQ 1 then begin ras report CASE NOT coded stop endif IF test MOD 2 EQ 1 THEN BEGIN line even vargrid U ENDIF ELSE BEGIN line odd vargrid T ENDELSE ncdf_close id END 1 4:BEGIN if jpi EQ 128 then begin id ncdf_open iodir HOPE_lonlat nc ncdf_varget id latTlow lat test where lat EQ yaxis 0 0 if test EQ 1 then begin ras report CASE NOT coded stop endif IF test MOD 2 EQ 1 THEN BEGIN line even vargrid U ENDIF ELSE BEGIN line odd vargrid T ENDELSE ncdf_close id ENDIF ELSE BEGIN line odd vargrid U ENDELSE END 2 8:BEGIN line odd vargrid U END endcase END yz :BEGIN if jpj NE 121 AND jpj NE 195 then begin ras report CASE NOT coded stop ENDIF id ncdf_open iodir HOPE_lonlat nc case y0 of 93 3:BEGIN line odd ncdf_varget id lonTlowodd lonTodd xstep lonTodd 1 lonTodd 0 2 case 1 OF where lonTodd EQ xaxis 0 0 NE 1:vargrid T where lonTodd xstep EQ xaxis 0 0 NE 1:vargrid U ELSE:BEGIN ras report CASE NOT coded stop END endcase END 92 2:BEGIN line even ncdf_varget id lonTlowodd lonTodd xstep lonTodd 1 lonTodd 0 2 case 1 OF where lonTodd EQ xaxis 0 0 NE 1:vargrid U where lonTodd xstep EQ xaxis 0 0 NE 1:vargrid T ELSE:BEGIN ras report CASE NOT coded stop END endcase END 91 6:BEGIN line odd ncdf_varget id lonThighodd lonTodd xstep lonTodd 1 lonTodd 0 2 case 1 OF where lonTodd EQ xaxis 0 0 NE 1:vargrid T where lonTodd xstep EQ xaxis 0 0 NE 1:vargrid U ELSE:BEGIN ras report CASE NOT coded stop END endcase END 91 0:BEGIN line even ncdf_varget id lonThighodd lonTodd xstep lonTodd 1 lonTodd 0 2 case 1 OF where lonTodd EQ xaxis 0 0 NE 1:vargrid U where lonTodd xstep EQ xaxis 0 0 NE 1:vargrid T ELSE:BEGIN ras report CASE NOT coded stop END endcase END ELSE:BEGIN ras report CASE NOT coded stop END endcase ncdf_close id END else:BEGIN ras report CASE NOT coded stop END endcase return linetype:line pointtype:vargrid end"); a[228] = new Array("./ToBeReviewed/HOPE/read_hope.html", "read_hope.pro", "", " file_comments categories param EVENT returns restrictions examples history version Id: read_hope pro 371 2008 08 07 09:32:02Z pinsard PRO read_hope_event event compile_opt idl2 strictarrsubs widget_control event id get_uvalue uval widget_control event top get_uvalue top_uvalue case uval name OF cancel :begin close the file cdfid top_uvalue 1 findline top_uvalue cdfid ncdf_close cdfid clear the pointer for i 0 n_elements top_uvalue 1 do ptr_free top_uvalue i kill the widget widget_control event top destroy end type choice :begin find the new type of selected section typeindex widget_info event id droplist_select selectedtype top_uvalue 1 findline top_uvalue type choice typeindex find the available variables for this type of section sectype top_uvalue 1 findline top_uvalue sectype goodvar where sectype EQ selectedtype namevar top_uvalue 1 findline top_uvalue namevar goodnamevar namevar goodvar find the selected var name varchoiceid widget_info event top find_by_uname var choice varindex widget_info varchoiceid droplist_select varchoice top_uvalue 1 findline top_uvalue var choice selectedvarname varchoice varindex do we change the variable if where goodnamevar EQ selectedvarname 0 EQ 1 then begin selectedvarname goodnamevar 0 varindex where varchoice EQ selectedvarname 0 widget_control varchoiceid set_droplist_select varindex ENDIF displays the different domains selected goodvar where goodnamevar EQ selectedvarname rh_alldomains event top selected end var choice :BEGIN find the new variable varindex widget_info event id droplist_select selectedvar top_uvalue 1 findline top_uvalue var choice varindex find the available variables for this type of section namevar top_uvalue 1 findline top_uvalue namevar goodvar where namevar EQ selectedvar sectype top_uvalue 1 findline top_uvalue sectype goodtype sectype goodvar find the selected type of section typechoiceid widget_info event top find_by_uname type choice typeindex widget_info typechoiceid droplist_select typechoice top_uvalue 1 findline top_uvalue type choice selectedtype typechoice typeindex do we change the type of section if where goodtype EQ selectedtype 0 EQ 1 then begin selectedtype goodtype 0 typeindex where typechoice EQ selectedtype 0 widget_control typechoiceid set_droplist_select typeindex ENDIF displays the different domains selected goodvar where goodtype EQ selectedtype rh_alldomains event top selected END plot :BEGIN plot the array res createhopestruct event type of section selected top_uvalue 1 findline top_uvalue selected type top_uvalue 1 findline top_uvalue sectype selected get the informations of cw_specifie specifieid widget_info event top find_by_uname specifie widget_control specifieid get_value specifie specifie struct2string specifie direct2string case type of x :command plt1d res x specifie y :command plt1d res y specifie z :command plt1d res z specifie t :command pltt res t specifie xy :command plt res specifie xz :command pltz res xz specifie yz :command pltz res yz specifie xt :command pltt res xt specifie yt :command pltt res yt specifie zt :command pltt res zt specifie xyz : xyt : yzt : xyzt : ENDCASE test execute command if test EQ 0 then stop end linechoice :BEGIN if event select EQ 1 then begin sensitive bytarr 3 sensitive where odd even odd even eq event value 1 basedomainodd widget_info event top find_by_uname basedomainodd widget_control basedomainodd sensitive sensitive 0 basedomaineven widget_info event top find_by_uname basedomaineven widget_control basedomaineven sensitive sensitive 1 basedomainoddeven widget_info event top find_by_uname basedomainodd even widget_control basedomainoddeven sensitive sensitive 2 case where sensitive EQ 1 0 of 0:BEGIN widget_control basedomainodd get_uvalue oddsecchoice oddsecchoiceid widget_info event top find_by_uname oddsecchoice if oddsecchoiceid NE 0 then index widget_info oddsecchoiceid droplist_select ELSE index 0 top_uvalue 1 findline top_uvalue selected oddsecchoice index END 1:BEGIN widget_control basedomaineven get_uvalue evensecchoice evensecchoiceid widget_info event top find_by_uname evensecchoice if evensecchoiceid NE 0 then index widget_info evensecchoiceid droplist_select ELSE index 0 top_uvalue 1 findline top_uvalue selected evensecchoice index END 2:BEGIN widget_control basedomainodd get_uvalue oddevensecchoice oddevensecchoiceid widget_info event top find_by_uname odd evensecchoice if oddevensecchoiceid NE 0 then index widget_info oddevensecchoiceid droplist_select ELSE index 0 top_uvalue 1 findline top_uvalue selected oddevensecchoice index END endcase endif END oddsecchoice :BEGIN widget_control event top update 0 basedomainodd widget_info event top find_by_uname basedomainodd widget_control basedomainodd get_uvalue oddsecchoice domainpart top_uvalue basedomainodd oddsecchoice event index top_uvalue 1 findline top_uvalue selected oddsecchoice event index widget_control event top update 1 END evensecchoice :BEGIN widget_control event top update 0 basedomaineven widget_info event top find_by_uname basedomaineven widget_control basedomaineven get_uvalue evensecchoice domainpart top_uvalue basedomaineven evensecchoice event index top_uvalue 1 findline top_uvalue selected evensecchoice event index widget_control event top update 1 END odd evensecchoice :BEGIN widget_control event top update 0 basedomainoddeven widget_info event top find_by_uname basedomainodd even widget_control basedomainoddeven get_uvalue oddevensecchoice domainpart top_uvalue basedomainoddeven oddevensecchoice event index top_uvalue 1 findline top_uvalue selected oddevensecchoice event index widget_control event top update 1 END date1 :BEGIN date2id widget_info event top find_by_uname date2 widget_control date2id get_value date2 if event value GT date2 then widget_control date2id set_value event value END date2 :BEGIN date1id widget_info event top find_by_uname date1 widget_control date1id get_value date1 if event value LT date1 then widget_control date1id set_value event value END else: endcase return end file_comments Read the Hope grid file converted in NetCdf by xconv categories Reading param TYPEIN in required type string A string specifying from which type of section the 4D array based: xy xz yz param VARNAMEIN in required type string A string the name of the variable to be read in lower or upper case keyword FILENAME type string The name of the file to be read keyword XLIMITS type vector A two elements vector lonmin lonmax the boundary of the longitudes from 0 to 360 keyword YLIMITS type vector A two elements vector latmin latmax the boundary of the latitudes from 90 to 90 keyword ZLIMITS type vector A two elements vector depthmin depthmax the boundary of the depth keyword TLIMITS type vector A two elements vector date1 date2 the boundary of the calendar with date1 and date2 following the syntax yyyymmdd keyword ODDPT Activate to read only the sections located on ODD points keyword EVENPT Activate to read only the sections located on even points keyword ODDEVENPT Activate to read only the sections located on both even and odd points horizontal sections keyword _EXTRA Used to pass keywords returns 1 if typein and varnamein are undefined this is the widget version A structure which but be read by litchamp and is necessary to complete the grid associated to the data see the example uses common useful only for the definition of iodir restrictions x y z t xt yt and zt section not coded xconv must be able to works with this kind of function The grid file has no zoom possibilities on horizontal dimensions restrictions When typein and varnamein are defined the method to find the good variable is: 1 find the variables which are available on this type of sections with this name 2 if ODDPT EVENPT or ODDEVENPT are specified consider only these types of sections 3 For an XY section the chosen variable is the one which has the most level in the vertical domain specified by ZLIMITS For an XZ section the chosen variable is the one which has the most points in the latitude domain specified by YLIMITS For an YZ section the chosen variable is the one which has the most points in the longitude domain specified by XLIMITS examples IDL a read_hope xy ocpt filename CLIM_CNT_1993 1998 nc IDL help a struct Structure 6 tags length 1860176 refs 1: ARRAY FLOAT Array 128 242 15 UNIT STRING deg C NAME STRING Ocean potential temperature DATE FLOAT Array 1 GRID STRING T HOPEGRID STRUCT Array 1 IDL help a hopegrid struct Structure 8 tags length 1588 refs 2: XAXIS FLOAT Array 128 YAXIS FLOAT Array 242 ZAXIS FLOAT Array 15 FIRSTS LONG Array 3 LASTS LONG Array 3 TYPE STRING xy LINETYPE STRING odd even PTTYPE STRING T IDL help litchamp a FLOAT Array 128 242 15 history Sebastien Masson smasson lodyc jussieu fr June 2001 version Id: read_hope pro 371 2008 08 07 09:32:02Z pinsard FUNCTION read_hope typein varnamein FILENAME filename XLIMITS xlimits YLIMITS ylimits ZLIMITS zlimits TLIMITS tlimits ODDPT oddpt ODDEVENPT oddevenpt EVENPT evenpt _EXTRA ex compile_opt idl2 strictarrsubs common usefull only for the definition of iodir if n_elements filename EQ 0 then filename isafile iodirectory iodir _extra ex IF size filename type NE 7 THEN return 1 filename isafile filename filename iodirectory iodir _extra ex cdfid ncdf_open filename id of the netcdf file wathinside ncdf_inquire cdfid structure with global informations dimensions namedim strarr wathinside ndims name of the dimensions typedim strarr wathinside ndims type of the dimensions x y z t sizedim lonarr wathinside ndims size of each dimension loop on the dimensions to get the names and sizes for dimiq 0 wathinside ndims 1 do begin ncdf_diminq cdfid dimiq name value namedim dimiq name case 1 of STRCMP name lon 3 FOLD_CASE :typedim dimiq x STRCMP name lat 3 FOLD_CASE :typedim dimiq y STRCMP name z 1 FOLD_CASE :typedim dimiq z STRCMP name t 1 FOLD_CASE :typedim dimiq t ELSE:BEGIN ncdf_close cdfid return report Unknown name of dimension END endcase sizedim dimiq value endfor dimlist: structure which contains the name and the value of each dimension we suppose that there is always a variable which has the same name that the dimension and which gives the values of this dimension ncdf_varget cdfid namedim 0 value dimlist create_struct namedim 0 value for dimiq 1 wathinside ndims 1 do begin ncdf_varget cdfid namedim dimiq value get the value dimlist create_struct dimlist namedim dimiq value endfor variables namevar strarr wathinside nvars names of the variables ndimsvar lonarr wathinside nvars number of dim for each variable dimvar replicate 1 wathinside ndims wathinside nvars dims of each variables loop over the variable ids to fill namevar ndimsvar and dimvar for varid 0 wathinside nvars 1 do begin res ncdf_varinq cdfid varid namevar varid res name namevar varid strjoin strsplit namevar varid _ 0 99 EXTRACT REGEX ndimsvar varid res ndims dimvar 0:res ndims 1 varid res dim ENDFOR we cut dimvar to select only the interessant part dimvar dimvar 0:max ndimsvar 1 selection of the data variables which are different from the dimension variables we suppose that that data variables are 4D array with sometime dimensions equal to 1 they must be different from dimension variables which have only 1 dimension datavarid where ndimsvar eq 4 numberofvar n_elements datavarid namevar namevar datavarid ndimsvar ndimsvar datavarid dimvar dimvar datavarid sectype strarr numberofvar the type of section for each variable : xy xz yz linetype strarr numberofvar the line of the points : odd even or odd even pointtype strarr numberofvar the type of variable : scalar T or vector U for i 0 numberofvar 1 do begin dimofthevar dimvar i sectype i typedim dimofthevar 0 typedim dimofthevar 1 xaxisid dimofthevar where typedim dimofthevar EQ x yaxisid dimofthevar where typedim dimofthevar EQ y lineandpt findlineandpointtype sectype i dimlist xaxisid 0 dimlist yaxisid 0 iodir linetype i lineandpt linetype pointtype i lineandpt pointtype endfor definition of the widget base widget_base column first base: droplist to select the type of section droplist to select the variable button to select type of line : odd even or odd even base1 widget_base base row frame typechoice sectype uniq sectype sort sectype if n_elements typechoice GT 1 then typechoice typechoice sortdim typechoice base11 widget_droplist base1 title Type of section value typechoice uvalue name: type choice uname type choice if n_elements typein NE 0 then BEGIN selectedtype strmid typein 0 2 widget_control base11 set_droplist_select 0L where typechoice EQ selectedtype 0 ENDIF ELSE selectedtype typechoice 0 varchoice namevar uniq namevar sort namevar base12 widget_droplist base1 title Available data value varchoice uvalue name: var choice uname var choice if n_elements varnamein NE 0 THEN BEGIN selectedname varnamein widget_control base12 set_droplist_select 0L where strlowcase varchoice EQ strlowcase varnamein 0 ENDIF ELSE selectedname varchoice 0 base13 widget_base base1 row uname linechoicebase base 2: base to select the domain of the odd points base2 widget_base base column uname basedomainodd frame base 3: base to select the domain of the even points base3 widget_base base column uname basedomaineven frame base 4: base to select the domain of the odd even points base4 widget_base base column uname basedomainodd even frame base 5: calendar base5 widget_base base row uname baset frame timename strlowcase tag_names dimlist wathinside recdim read the time axis in julina days time ncdf_gettime filename cdfid update the dimlist structure dimlist wathinside recdim time base51 cw_calendar base5 time uname date1 uvalue name: date1 base52 cw_calendar base5 time uname date2 uvalue name: date2 base 6: base to select the min max and others keywords base6 cw_specifie base column uname specifie uvalue name: specifie base 7: last base with the action buttons base7 widget_base base row uname finalaction base71 widget_button base7 value Plot uvalue name: plot base72 widget_button base7 value Cancel uvalue name: cancel determination of the selected variable goodname 0 where strlowcase namevar EQ strlowcase selectedname goodtype 0 where sectype EQ selectedtype selected inter goodname goodtype if selected 0 EQ 1 then BEGIN widget_control base destroy ncdf_close cdfid return report impossible combinaison : type of section selectedtype variable name selectedname ENDIF if n_elements typein NE 0 then BEGIN if NOT keyword_set xlimits then xlimits 1e9 1e9 if NOT keyword_set ylimits then ylimits 1e9 1e9 if NOT keyword_set zlimits then zlimits 1e9 1e9 if NOT keyword_set tlimits then tlimits 1e9 1e9 ENDIF if n_elements typein NE 0 AND n_elements selected NE 1 then BEGIN if keyword_set oddpt then selected inter selected where linetype EQ odd if keyword_set evenpt then selected inter selected where linetype EQ even if keyword_set oddevenpt then selected inter selected where linetype EQ odd even if selected 0 EQ 1 then BEGIN widget_control base destroy ncdf_close cdfid return report impossible combinaison : type of section selectedtype variable name selectedname and line type endif if n_elements selected NE 1 then begin case selectedtype of xy :BEGIN choice on the vertical axis choice based on the variable which has the most available levels between the zlimits if NOT keyword_set zlimits then begin print case not coded stop ENDIF number lonarr n_elements selected for i 0 n_elements selected 1 do begin zdim dimvar 2 selected i zaxis dimlist zdim nothing where zaxis GE zlimits 0 AND zaxis LE zlimits 1 count number i count ENDFOR selected selected where number EQ max number if n_elements selected NE 1 then begin print case not coded stop endif END xz :BEGIN choice on the latitude axis if NOT keyword_set ylimits then begin print case not coded stop ENDIF number lonarr n_elements selected for i 0 n_elements selected 1 do begin ydim dimvar 2 selected i yaxis dimlist ydim nothing where yaxis GE ylimits 0 AND yaxis LE ylimits 1 count number i count ENDFOR selected selected where number EQ max number if n_elements selected NE 1 then begin print case not coded stop endif END yz :BEGIN choice on the longitude axis if NOT keyword_set xlimits then begin print case not coded stop ENDIF number lonarr n_elements selected for i 0 n_elements selected 1 do begin xdim dimvar 2 selected i xaxis dimlist xdim nothing where xaxis GE xlimits 0 AND xaxis LE xlimits 1 count number i count ENDFOR selected selected where number EQ max number if n_elements selected NE 1 then begin print case not coded stop endif END endcase endif ENDIF definition of the uvalue of the base which allows to share the variables between programs top_uvalue ptrarr 2 18 allocate_heap top_uvalue 0 0 type choice top_uvalue 1 0 temporary typechoice top_uvalue 0 1 var choice top_uvalue 1 1 temporary varchoice top_uvalue 0 2 namevar top_uvalue 1 2 temporary namevar top_uvalue 0 3 dimvar top_uvalue 1 3 temporary dimvar top_uvalue 0 4 sectype top_uvalue 1 4 temporary sectype top_uvalue 0 5 linetype top_uvalue 1 5 temporary linetype top_uvalue 0 6 pointtype top_uvalue 1 6 temporary pointtype top_uvalue 0 7 dimlist top_uvalue 1 7 temporary dimlist top_uvalue 0 8 typedim top_uvalue 1 8 temporary typedim top_uvalue 0 9 sizedim top_uvalue 1 9 temporary sizedim top_uvalue 0 10 cdfid top_uvalue 1 10 cdfid top_uvalue 0 11 datavarid top_uvalue 1 11 datavarid top_uvalue 0 12 selected top_uvalue 1 12 selected top_uvalue 0 13 filename top_uvalue 1 13 filename top_uvalue 0 14 xlimits top_uvalue 1 14 testvar var xlimits top_uvalue 0 15 ylimits top_uvalue 1 15 testvar var ylimits top_uvalue 0 16 zlimits top_uvalue 1 16 testvar var zlimits top_uvalue 0 17 tlimits top_uvalue 1 17 testvar var tlimits widget_control base set_uvalue top_uvalue rh_alldomains base selected if n_params EQ 0 then BEGIN we use the widget widget_control base REALIZE xmanager read_hope base no_block return 1 ENDIF get the output output createhopestruct top:base clear the pointer for i 0 n_elements top_uvalue 1 do ptr_free top_uvalue i close the file ncdf_close cdfid return output end"); a[229] = new Array("./ToBeReviewed/HOPE/rh_alldomains.html", "rh_alldomains.pro", "", " file_comments categories param TOPID param SELECTED returns uses restrictions examples history version Id: rh_alldomains pro 325 2007 12 06 10:04:53Z pinsard todo seb PRO rh_alldomains topid selected compile_opt idl2 strictarrsubs widget_control topid get_uvalue top_uvalue widget_control topid update 0 selectedline top_uvalue 1 findline top_uvalue linetype selected we get the size of the dimension id of this section dimvar top_uvalue 1 findline top_uvalue dimvar typedim top_uvalue 1 findline top_uvalue typedim dimlist top_uvalue 1 findline top_uvalue dimlist sizedim top_uvalue 1 findline top_uvalue sizedim buttons to select type of line : odd even or odd even linechoicebase widget_info topid find_by_uname linechoicebase id widget_info linechoicebase find_by_uname linechoice IF id NE 0 THEN widget_control id destroy choice if where selectedline EQ odd 0 NE 1 then choice choice odd if where selectedline EQ even 0 NE 1 then choice choice even if where selectedline EQ odd even 0 NE 1 then choice choice odd even choice choice 1:n_elements choice 1 nothing cw_bgroup linechoicebase choice row exclusive return_name uname linechoice uvalue name: linechoice widget_control nothing set_value 0 sensitive bytarr 3 sensitive where odd even odd even eq choice 0 1 odd points domain basedomainodd widget_info topid find_by_uname basedomainodd id widget_info basedomainodd find_by_uname title IF id NE 0 THEN widget_control id destroy oddsecchoice where selectedline EQ odd if oddsecchoice 0 NE 1 then BEGIN oddsecchoice selected oddsecchoice nothing widget_label basedomainodd value Domain of the odd points uname title IF n_elements oddsecchoice GT 1 THEN BEGIN selecteddim dimvar oddsecchoice sorteddim selecteddim FOR i 0 n_elements oddsecchoice 1 DO sorteddim i selecteddim sortdim typedim selecteddim i i zdim sorteddim 2 sizedims sizedim zdim sortedzdim sort sizedims sizedims sizedims sortedzdim oddsecchoice oddsecchoice sortedzdim nothing widget_droplist basedomainodd title number of levels value strtrim sizedims 2 uvalue name: oddsecchoice uname oddsecchoice ENDIF domainpart top_uvalue basedomainodd oddsecchoice 0 widget_control basedomainodd set_uvalue oddsecchoice ENDIF ELSE BEGIN nothing widget_label basedomainodd value uname title domainpart top_uvalue basedomainodd destroy widget_control basedomainodd set_uvalue 1 ENDELSE widget_control basedomainodd sensitive sensitive 0 even points domain basedomaineven widget_info topid find_by_uname basedomaineven id widget_info basedomaineven find_by_uname title IF id NE 0 THEN widget_control id destroy evensecchoice where selectedline EQ even if evensecchoice 0 NE 1 then BEGIN evensecchoice selected evensecchoice nothing widget_label basedomaineven value Domain of the even points uname title IF n_elements evensecchoice GT 1 THEN BEGIN selecteddim dimvar evensecchoice sorteddim selecteddim FOR i 0 n_elements evensecchoice 1 DO sorteddim i selecteddim sortdim typedim selecteddim i i zdim sorteddim 2 sizedims sizedim zdim sortedzdim sort sizedims sizedims sizedims sortedzdim evensecchoice evensecchoice sortedzdim nothing widget_droplist basedomaineven title number of levels value strtrim sizedims 2 uvalue name: evensecchoice uname evensecchoice ENDIF domainpart top_uvalue basedomaineven evensecchoice 0 widget_control basedomaineven set_uvalue evensecchoice ENDIF ELSE BEGIN domainpart top_uvalue basedomaineven destroy nothing widget_label basedomaineven value uname title widget_control basedomaineven set_uvalue 1 ENDELSE widget_control basedomaineven sensitive sensitive 1 odd even points domain basedomainoddeven widget_info topid find_by_uname basedomainodd even id widget_info basedomainoddeven find_by_uname title IF id NE 0 THEN widget_control id destroy oddevensecchoice where selectedline EQ odd even if oddevensecchoice 0 NE 1 then BEGIN oddevensecchoice selected oddevensecchoice nothing widget_label basedomainoddeven value Domain of the odd even points uname title IF n_elements oddevensecchoice GT 1 THEN BEGIN selecteddim dimvar oddevensecchoice sorteddim selecteddim FOR i 0 n_elements oddevensecchoice 1 DO sorteddim i selecteddim sortdim typedim selecteddim i i zdim sorteddim 2 sizedims sizedim zdim sortedzdim sort sizedims sizedims sizedims sortedzdim oddevensecchoice oddevensecchoice sortedzdim nothing widget_droplist basedomainoddeven title number of levels value strtrim sizedims 2 uvalue name: odd evensecchoice uname odd evensecchoice ENDIF domainpart top_uvalue basedomainoddeven oddevensecchoice 0 widget_control basedomainoddeven set_uvalue oddevensecchoice ENDIF ELSE BEGIN domainpart top_uvalue basedomainoddeven destroy nothing widget_label basedomainoddeven value uname title widget_control basedomainoddeven set_uvalue 1 ENDELSE widget_control basedomainoddeven sensitive sensitive 2 case where sensitive EQ 1 0 of 0: top_uvalue 1 findline top_uvalue selected oddsecchoice 0 1: top_uvalue 1 findline top_uvalue selected evensecchoice 0 2: top_uvalue 1 findline top_uvalue selected oddevensecchoice 0 endcase widget_control topid update 1 return end"); a[230] = new Array("./ToBeReviewed/HOPE/sortdim.html", "sortdim.pro", "", " file_comments categories param DIMS keyword INVERSE returns uses restrictions examples history version Id: sortdim pro 325 2007 12 06 10:04:53Z pinsard todo seb function sortdim dims inverse inverse IDL a x y t z IDL b a sortdim a IDL print a x y t z IDL print b x y z t IDL print b sortdim a inv x y t z IDL a xytz IDL print sortdim a 0 1 3 2 compile_opt idl2 strictarrsubs tosort dims if n_elements tosort eq 1 then tosort string reform byte tosort 1 strlen tosort 0 tosort strrepl tosort strwhere tosort x a tosort strrepl tosort strwhere tosort y b tosort strrepl tosort strwhere tosort z c tosort strrepl tosort strwhere tosort t d tosort uniq tosort sort tosort if keyword_set inverse then tosort sort tosort return tosort end"); a[231] = new Array("./ToBeReviewed/HOPE/xrh.html", "xrh.pro", "", " file_comments procedure to call read_hope in the widget mode categories keyword _EXTRA Used to pass keywords returns uses restrictions examples history version Id: xrh pro 327 2007 12 13 16:22:35Z pinsard todo seb PRO xrh _EXTRA ex compile_opt idl2 strictarrsubs a read_hope _extra ex return end"); a[232] = new Array("./ToBeReviewed/IMAGE/animgif.html", "animgif.pro", "", " file_comments Build a gif animation categories Animated drawings param nomfic in required It is the name of the gif file containing the animation Comment: this file is placed in the directory defined by iodir uses common restrictions We use the Z buffer to go faster So if it failed in animgif you have to do: IDL device close IDL set_plot x IDL retall If we want to delete the common we have to define manually the picture s size variables xsize and ysize just as iodir history Guillaume Roullet grlod ipsl jussieu fr Sebastien Masson smasson lodyc jussieu fr 30 4 1999 version Id: animgif pro 371 2008 08 07 09:32:02Z pinsard PRO animgif nomfic compile_opt idl2 strictarrsubs common It recuperates the color palette and put it in red green blue tvlct rouge vert bleu get It completes the current palette on 256 colors red rouge replicate 255 256 n_elements rouge green vert replicate 255 256 n_elements rouge blue bleu replicate 255 256 n_elements rouge It rocks on the z device allowing to create the picture without display it thisOS VERSION OS_FAMILY thisOS STRMID thisOS 0 3 thisOS STRUPCASE thisOS set_plot z size of the picture in pixel : xsize 30 min page_size max ma key_portrait ma 1 key_portrait ysize 30 min page_size max ma 1 key_portrait ma key_portrait device set_resolution xsize ysize Beginning of the gif file Writing of an empty picture reinitplt plot 0 0 nodata write_gif iodir nomfic tvrd red green blue multiple Beggining of the part we want to change Loop of picture s creation calen TIMEGEN 366 START JULDAY 1 1 2000 debut where calen EQ 19810105 debut where calen EQ 19790105 debut debut 0 if debut EQ 1 then begin device close CASE thisOS of MAC : SET_PLOT thisOS WIN : SET_PLOT thisOS ELSE: SET_PLOT X ENDCASE stop endif for i 0 73 15 1 do begin for i 0 3 2 1 do begin for i 0 73 2 1 do begin print Image numero : strtrim i 2 date calen debut i erase 255 plt nlec sst date ATF 19 29 int 5 noerase plt nlec sss date ATF label 2 noerase plt nlec htoth date RE3 nlec hpycn date RE3 10 60 int 5 inv noerase domdef 290 340 5 15 plt norme nlec unsurf date RE3 nlec vnsurf date RE3 0 1 2 int 1 noerase Writing of the picture in the file gif write_gif iodir nomfic tvrd red green blue multiple ENDFOR End of the part we want to change Closing of the file write_gif iodir nomfic close Rerock on terminal X mode device close CASE thisOS of MAC : SET_PLOT thisOS WIN : SET_PLOT thisOS ELSE: SET_PLOT X ENDCASE return end"); a[233] = new Array("./ToBeReviewed/INIT/initncdf.html", "initncdf.pro", "", " file_comments Initfile for Netcdf file define all the grid parameters through an appropriate call to computegrid categories Grid param ncfilein in required type scalar string A string giving the name of the NetCdf file keyword START1 default 0 type scalar: 0 or 1 Index the axis from 1 instead of 0 when using xyindex and or zindex keyword ZAXISNAME default z level lev depth type scalar string A string giving the name of the variable in the file that contains the xyz axis keyword XYINDEX default 0 type scalar: 0 or 1 To define the x y axis with index instead of using the values contained in X YAXISNAME x yaxis keyword_set start1 findgen jpi jpj this forces key_onearth 0 keyword ZINDEX default 0 type scalar: 0 or 1 To define the z axis with index instead of using the values contained in ZAXISNAME zaxis keyword_set start1 findgen jpk keyword _EXTRA Used to pass keywords to computegrid ncdf_getaxis ncdf_getmask and isafile uses common restrictions Change the grid parameters see computegrid the file must contain an x and an y axis 1 ou 2 dimensional array examples IDL initncdf toto nc glam 180 180 history Sebastien Masson smasson lodyc jussieu fr 8 May 2002 version Id: initncdf pro 371 2008 08 07 09:32:02Z pinsard PRO initncdf ncfilein ZAXISNAME zaxisname START1 start1 XYINDEX xyindex ZINDEX zindex _EXTRA ex compile_opt idl2 strictarrsubs common check the name of the file ncfile isafile FILENAME ncfilein IODIRECTORY iodir _extra ex if size ncfile type NE 7 then BEGIN ras report initncdf cancelled return endif if the file is stored on tape if version os_family EQ unix then spawn file ncfile dev null open the file cdfid ncdf_open ncfile what is inside the file inside ncdf_inquire cdfid name of the variables namevar strarr inside nvars for varid 0 inside nvars 1 do begin invar ncdf_varinq cdfid varid namevar varid strlowcase invar name ENDFOR find the x yaxis ncdf_getaxis cdfid dimidx dimidy xaxis yaxis START1 start1 XYINDEX xyindex ROMSGRID romsgrid _extra ex find the zaxis IF keyword_set romsgrid THEN BEGIN FOR i 0 inside ndims 1 DO BEGIN ncdf_diminq cdfid i name size CASE strlowcase name OF s_rho :zaxis reverse indgen size s_u :zaxis reverse indgen size s_v :zaxis reverse indgen size s_psi :zaxis reverse indgen size s_w :zaxis reverse indgen size 1 ELSE: ENDCASE ENDFOR IF where namevar EQ h 0 NE 1 THEN BEGIN ncdf_varget cdfid h romsh ENDIF ELSE romsh 1 ENDIF ELSE BEGIN if keyword_set zaxisname then zaxisname strlowcase zaxisname ELSE zaxisname z zvarid where namevar EQ nav_lev or namevar EQ zaxisname OR namevar EQ level OR namevar EQ lev OR strmid namevar 0 5 EQ depth 0 if zvarid EQ 1 AND inside ndims GT 3 then begin ras report initncdf: the zaxis was not found check the use of ZAXISNAME keyword if you want to find one stop endif read the zaxis if zvarid NE 1 THEN ncdf_varget cdfid zvarid zaxis ENDELSE IF keyword_set zindex AND keyword_set zaxis THEN zaxis keyword_set start1 findgen n_elements zaxis mask tmask ncdf_getmask cdfid _extra ex ncdf_close cdfid call compute the grid if NOT keyword_set zaxis then BEGIN computegrid xaxis xaxis yaxis yaxis mask tmask onearth 1b keyword_set xyindex ROMSH romsh _EXTRA ex ENDIF ELSE BEGIN computegrid xaxis xaxis yaxis yaxis zaxis zaxis mask tmask onearth 1b keyword_set xyindex ROMSH romsh _EXTRA ex ENDELSE IF n_elements time EQ 0 THEN time 0 jpt n_elements time return end"); a[234] = new Array("./ToBeReviewed/INIT/initncdfxxx.html", "initncdfxxx.pro", "", ""); a[235] = new Array("./ToBeReviewed/INIT/initorca05.html", "initorca05.pro", "", ""); a[236] = new Array("./ToBeReviewed/INIT/initorca2.html", "initorca2.pro", "", ""); a[237] = new Array("./ToBeReviewed/INIT/initorca2full.html", "initorca2full.pro", "", ""); a[238] = new Array("./ToBeReviewed/LECTURE/GRIB/bit2int.html", "bit2int.pro", "", " file_comments categories param BITIN keyword CHECKNEG returns uses restrictions examples history version Id: bit2int pro 327 2007 12 13 16:22:35Z pinsard todo seb FUNCTION bit2int bitin CHECKNEG checkneg compile_opt idl2 strictarrsubs res 0L n n_elements bitin 1 IF keyword_set checkneg THEN BEGIN IF bitin 0 EQ 1 THEN BEGIN bitin 0 0 neg 1 ENDIF ELSE neg 1 ENDIF ELSE neg 1 FOR i 0 n DO res res 2L i bitin n i RETURN neg res END"); a[239] = new Array("./ToBeReviewed/LECTURE/GRIB/read_grib.html", "read_grib.pro", "", " file_comments categories param VARCODE param DATE1 in optional Date of the beginning yyyymmdd if TIMESTEP is not activate param DATE2 in optional Last date Optional if not specified date2 date1 keyword FILE type array or string A single filename or an array of filenames to be retrieved returns restrictions examples history version Id: read_grib pro 327 2007 12 13 16:22:35Z pinsard FUNCTION read_grib varcode date1 date2 FILE file compile_opt idl2 strictarrsubs common http: www wmo ch web www WDM Guides Guide binary 2 html gribfile d1fes2 raid6 SINTEX common ES10 d 00 atm 5d ES10 d 00_5d_00911201_00911230 grib IF keyword_set file THEN gribfile isafile file file iodir iodir ELSE gribfile d1fes2 raid6 SINTEX common ES10 atm 5d ZOOM_IND ES10_5d_00210101_00301230 grib openr num gribfile GET_LUN ERROR err SWAP_IF_LITTLE_ENDIAN if err ne 0 then begin ras report err_string return 1 ENDIF recstart scan_grib_recstart num messize scan_grib_messize num recstart addoff lonarr n_elements recstart FOR i 1L n_elements recstart 1 DO addoff i recstart i recstart i 1 messize i 1 nbits scan_grib_nbits num recstart print nbits uniq nbits sort nbits codes scan_grib_code num recstart nbcodes uniq codes sort codes dates scan_grib_date num recstart nbdates uniq dates sort dates goodvar where codes EQ varcode IF goodvar 0 EQ 1 THEN BEGIN ras report no var code strtrim varcode 2 in the file return 1 ENDIF recstart recstart goodvar dates dates goodvar gooddate where dates GE date1 AND dates LE date2 IF gooddate 0 EQ 1 THEN BEGIN ras report no dates between strtrim date1 2 and strtrim date2 2 in the file return 1 ENDIF recstart recstart gooddate dates dates gooddate key_caltype 360d time date2jul dates jpt n_elements time IF jpt EQ 1 THEN vardate strtrim dates 0 2 ELSE vardate strtrim dates 0 2 strtrim dates jpt 1 2 varname vargrid T varexp varunit grib_pds read_grib_pds num recstart 0 grid parameters IF grib_pds gdsnotomitted THEN BEGIN grib_gds read_grib_gds num recstart 0 min max of the latitude with a precision of 10 2 lat1 fix 100 grib_gds la1 100 lat2 fix 100 grib_gds la2 100 CASE grib_gds gridtype OF Latitude Longitude Grid 0:BEGIN computegrid grib_gds lo1 grib_gds la1 grib_gds di grib_gds dj grib_gds ni grib_gds nj END Gaussian Latitude Longitude Grid 4:BEGIN find the latitude axis CASE 1 OF n48 grib_gds n EQ 48 AND lat1 EQ 88 57 AND lat2 EQ 88 57: gphit n48gaussian n80 grib_gds n EQ 80 AND lat1 EQ 89 14 AND lat2 EQ 89 14: gphit n80gaussian n128 grib_gds n EQ 128 AND lat1 EQ 89 46 AND lat2 EQ 89 46: gphit n128gaussian n160 grib_gds n EQ 160 AND lat1 EQ 89 57 AND lat2 EQ 89 57: gphit n160gaussian n256 grib_gds n EQ 256 AND lat1 EQ 89 73 AND lat2 EQ 89 73: gphit n256gaussian part of one of the gaussian grids defined above ELSE:BEGIN cnt 0 REPEAT BEGIN CASE cnt OF 0:gphit n48gaussian 1:gphit n80gaussian 2:gphit n128gaussian 3:gphit n160gaussian 4:gphit n256gaussian 5:BEGIN gphit n80gaussian lat1 29 71 lat2 19 62 END ELSE:stop ENDCASE nfix fix gphit 100 100 nlat1 where nfix EQ lat1 0 nlat2 where nfix EQ lat2 0 IF nlat1 NE 1 AND nlat2 NE 1 AND nlat2 nlat1 1 EQ grib_gds nj THEN gphit gphit nlat1:nlat2 ELSE gphit 1 cnt cnt 1 ENDREP UNTIL gphit 0 NE 1 END ENDCASE computegrid grib_gds lo1 1 grib_gds di 1 grib_gds ni 1 YAXIS gphit END Mercator Projection Grid gridtype EQ 1: Gnomonic Projection Grid gridtype EQ 2: Lambert Conformal secant or tangent conical or bipolar normal or oblique Projection Grid gridtype EQ 3: Polar Stereographic Projection Grid gridtype EQ 5: Oblique Lambert conformal secant or tangent conical or bipolar projection gridtype EQ 13: Spherical Harmonic Coefficients gridtype EQ 50: Space view perspective or orthographic grid gridtype EQ 90: reserved see Manual on Codes ELSE: ENDCASE ENDIF ELSE stop res fltarr grib_gds ni grib_gds nj n_elements recstart FOR i 0 n_elements recstart 1 DO BEGIN res i read_grib_bds num recstart i grib_gds ni grib_gds nj ENDFOR free_lun num IF keyword_set key_yreverse THEN res reverse res 2 RETURN res END"); a[240] = new Array("./ToBeReviewed/LECTURE/GRIB/read_grib_bds.html", "read_grib_bds.pro", "", " file_comments categories param NUM param RECSTART param NI param NJ returns restrictions examples history version Id: read_grib_bds pro 325 2007 12 06 10:04:53Z pinsard FUNCTION read_grib_bds num recstart ni nj compile_opt idl2 strictarrsubs offset recstart 8 a assoc num bytarr 1 nozero offset 1 sizepds bit2int binary a 1 binary a 2 binary a 3 flag binary a 8 gdsnotomitted flag 0 bmsnotomitted flag 1 ddd bit2int binary a 27 binary a 28 checkneg offset offset sizepds IF gdsnotomitted THEN BEGIN a assoc num bytarr 1 nozero offset 1 sizedds bit2int binary a 1 binary a 2 binary a 3 offset offset sizedds ENDIF IF bmsnotomitted THEN BEGIN a assoc num bytarr 1 nozero offset 1 sizebms bit2int binary a 1 binary a 2 binary a 3 offset offset sizebms ENDIF a assoc num bytarr 1 nozero offset 1 sizebds bit2int binary a 1 binary a 2 binary a 3 flags binary a 4 BIT VALUE MEANING 1 0 Grid point data 1 Spherical Harmonic Coefficients 2 0 Simple packing 1 Second order Complex Packing 3 0 Original data were floating point values 1 Original data were integer values 4 0 No additional flags at octet 14 1 Octet 14 contains flag bits 5 12 5 Reserved set to 0 6 0 Single datum at each grid point 1 Matrix of values at each grid point 7 0 No secondary bit maps 1 Secondary bit maps present 8 0 Second order values have constant width 1 Second order values have different widths 9 12 Reserved set to 0 eee bit2int binary a 5 binary a 6 checkneg aaa bit2int binary a 7 checkneg bbb bit2int binary a 8 binary a 9 binary a 10 IF aaa LT 0 THEN rrr 2 24 bbb 16 aaa 64 ELSE rrr 2 24 bbb 16 aaa 64 nbits a 11 0 CASE 1 OF flags 0 EQ 0 AND flags 1 EQ 0:BEGIN CASE nbits OF 8 :a assoc num bytarr ni nj nozero offset 1 12 16:a assoc num uintarr ni nj nozero offset 1 12 32:a assoc num ulonarr ni nj nozero offset 1 12 64:a assoc num ulon64arr ni nj nozero offset 1 12 ELSE: ENDCASE END ENDCASE RETURN rrr a 0 2 eee 10 ddd END"); a[241] = new Array("./ToBeReviewed/LECTURE/GRIB/read_grib_end.html", "read_grib_end.pro", "", " file_comments categories param NUM param OFFSET returns restrictions examples history version Id: read_grib_end pro 325 2007 12 06 10:04:53Z pinsard PRO read_grib_end num offset compile_opt idl2 strictarrsubs a assoc num bytarr 4 nozero offset endcode string a 0 IF endcode NE 7777 THEN stop RETURN END"); a[242] = new Array("./ToBeReviewed/LECTURE/GRIB/read_grib_gds.html", "read_grib_gds.pro", "", " file_comments categories param NUM param RECSTART returns restrictions examples history version Id: read_grib_gds pro 325 2007 12 06 10:04:53Z pinsard FUNCTION read_grib_gds num recstart compile_opt idl2 strictarrsubs offset recstart 8 a assoc num bytarr 1 nozero offset 1 sizepds bit2int binary a 1 binary a 2 binary a 3 offset recstart 8 sizepds a assoc num bytarr 1 nozero offset 1 sizegds bit2int binary a 1 binary a 2 binary a 3 nv a 4 0 pv a 5 0 gridtype a 6 0 CASE 1 OF Latitude Longitude Grid Gaussian Latitude Longitude Grid gridtype EQ 0 OR gridtype EQ 4:BEGIN ni bit2int binary a 7 binary a 8 nj bit2int binary a 9 binary a 10 la1 bit2int binary a 11 binary a 12 binary a 13 checkneg 1000 lo1 bit2int binary a 14 binary a 15 binary a 16 checkneg 1000 resflags binary a 17 la2 bit2int binary a 18 binary a 19 binary a 20 checkneg 1000 lo2 bit2int binary a 21 binary a 22 binary a 23 checkneg 1000 di bit2int binary a 24 binary a 25 1000 IF di EQ 65 5350 THEN di 1 IF gridtype EQ 0 THEN BEGIN dj bit2int binary a 26 binary a 27 1000 IF dj EQ 65 5350 THEN dj 1 ENDIF ELSE BEGIN n bit2int binary a 26 binary a 27 ENDELSE scanflags binary a 28 res size:sizegds gridtype:gridtype ni:ni nj:nj la1:la1 la2:la2 lo1:lo1 lo2:lo2 di:di IF gridtype EQ 0 THEN res create_struct res dj dj ELSE res create_struct res n n RETURN res END Mercator Projection Grid gridtype EQ 1: Gnomonic Projection Grid gridtype EQ 2: Lambert Conformal secant or tangent conical or bipolar normal or oblique Projection Grid gridtype EQ 3: Polar Stereographic Projection Grid gridtype EQ 5: Oblique Lambert conformal secant or tangent conical or bipolar projection gridtype EQ 13: Spherical Harmonic Coefficients gridtype EQ 50: Space view perspective or orthographic grid gridtype EQ 90: reserved see Manual on Codes ELSE: ENDCASE RETURN 1 END"); a[243] = new Array("./ToBeReviewed/LECTURE/GRIB/read_grib_is.html", "read_grib_is.pro", "", " file_comments categories param NUM param OFFSET returns restrictions examples history version Id: read_grib_is pro 325 2007 12 06 10:04:53Z pinsard FUNCTION read_grib_is num offset compile_opt idl2 strictarrsubs infofile fstat num a assoc num bytarr 4 nozero offset typefile string a 0 IF typefile NE GRIB THEN stop a assoc num bytarr 1 nozero offset 4 sizerecord bit2int binary a 0 binary a 1 binary a 2 a assoc num bytarr 1 nozero offset 7 gribed a 0 IF gribed NE 1 THEN stop RETURN typefile:typefile sizerecord:sizerecord gribed:gribed 0 END"); a[244] = new Array("./ToBeReviewed/LECTURE/GRIB/read_grib_pds.html", "read_grib_pds.pro", "", " file_comments categories param NUM param RECSTART returns restrictions examples history version Id: read_grib_pds pro 325 2007 12 06 10:04:53Z pinsard FUNCTION read_grib_pds num recstart compile_opt idl2 strictarrsubs offset recstart 8 a assoc num bytarr 1 nozero offset 1 sizepds bit2int binary a 1 binary a 2 binary a 3 paramtableversion a 4 0 centerid a 5 0 procid a 6 0 gridid a 7 0 flag binary a 8 gdsnotomitted flag 0 bmsnotomitted flag 1 paramunitid a 9 0 levtype a 10 0 levalue1 a 11 0 levalue2 a 12 0 year a 13 0 month a 14 0 day a 15 0 hour a 16 0 minute a 17 0 timeunit a 18 0 p1 a 19 0 p2 a 20 0 timerange a 21 0 n1 a 22 0 n2 a 23 0 nbmiss a 24 0 century a 25 0 subcenterid a 26 0 d bit2int binary a 27 binary a 28 checkneg RETURN size:sizepds gdsnotomitted:gdsnotomitted bmsnotomitted:bmsnotomitted d:d END"); a[245] = new Array("./ToBeReviewed/LECTURE/GRIB/read_gribtable.html", "read_gribtable.pro", "", " file_comments Read contents of a gribtable Gribtables are located in the gribtables subdirectory of HIPHOP categories param TABLENAME in required The full path name of a gribtable file keyword PARMTABL keyword CENTER keyword SUBCENTER keyword TABLNUM returns uses restrictions examples IDL tablename ectab_128 history Dominik Brunner Apr 2000 version Id: read_gribtable pro 371 2008 08 07 09:32:02Z pinsard PRO read_gribtable tablename PARMTABL parmtabl CENTER center SUBCENTER subcenter TABLNUM tablnum compile_opt idl2 strictarrsubs ON_ERROR 2 parmtabl StrArr 3 256 center 1 subcenter 1 tablnum 1 First Subscript 3 is name description units Second 256 is defined size of a parameter table IF n_elements tablename EQ 0 THEN return openr lun tablename get line read first line which eventually contains information about center subcenter and table number readf lun line parts STR_SEP line : IF n_elements parts GT 3 THEN BEGIN center fix parts 1 subcenter fix parts 2 tablnum fix parts 3 ENDIF ELSE BEGIN IF n_elements parts GE 3 THEN parmtabl 0:1 fix parts 0 parts 1:2 ELSE IF n_elements parts EQ 2 THEN parmtabl 0 fix parts 0 parts 1 ENDELSE loop over remaining lines REPEAT BEGIN readf lun line parts STR_SEP line : IF n_elements parts GE 3 THEN parmtabl 0:1 fix parts 0 parts 1:2 ELSE IF n_elements parts EQ 2 THEN parmtabl 0 fix parts 0 parts 1 END UNTIL EOF lun free_lun lun fill up missing variable names index WHERE parmtabl 0 EQ count IF count GT 0 THEN parmtabl 0 index var strcompress index rem END"); a[246] = new Array("./ToBeReviewed/LECTURE/GRIB/scan_grib_code.html", "scan_grib_code.pro", "", " file_comments categories param NUM param RECSTART returns restrictions examples history version Id: scan_grib_code pro 325 2007 12 06 10:04:53Z pinsard FUNCTION scan_grib_code num recstart compile_opt idl2 strictarrsubs nrec n_elements recstart codes bytarr nrec FOR i 0L nrec 1 DO BEGIN offset recstart i a assoc num bytarr 1 nozero offset 8 9 1 codes i a 0 ENDFOR RETURN codes END"); a[247] = new Array("./ToBeReviewed/LECTURE/GRIB/scan_grib_date.html", "scan_grib_date.pro", "", " file_comments categories param NUM param RECSTART returns restrictions examples history version Id: scan_grib_date pro 325 2007 12 06 10:04:53Z pinsard FUNCTION scan_grib_date num recstart compile_opt idl2 strictarrsubs nrec n_elements recstart dates lonarr nrec FOR i 0L nrec 1 DO BEGIN offset recstart i a assoc num bytarr 1 nozero offset 8 1 dates i a 13 100L a 25 1 10000L a 14 100L a 15 ENDFOR RETURN dates END"); a[248] = new Array("./ToBeReviewed/LECTURE/GRIB/scan_grib_messize.html", "scan_grib_messize.pro", "", " file_comments categories param NUM param RECSTART returns restrictions examples history version Id: scan_grib_messize pro 325 2007 12 06 10:04:53Z pinsard FUNCTION scan_grib_messize num recstart compile_opt idl2 strictarrsubs nrec n_elements recstart messize lonarr nrec FOR i 0L nrec 1 DO BEGIN offset recstart i a assoc num bytarr 1 nozero offset 4 messize i bit2int binary a 0 binary a 1 binary a 2 ENDFOR RETURN messize END"); a[249] = new Array("./ToBeReviewed/LECTURE/GRIB/scan_grib_nbits.html", "scan_grib_nbits.pro", "", " file_comments categories param NUM param RECSTART returns restrictions examples history version Id: scan_grib_nbits pro 325 2007 12 06 10:04:53Z pinsard FUNCTION scan_grib_nbits num recstart compile_opt idl2 strictarrsubs nrec n_elements recstart nbits bytarr nrec FOR i 0L nrec 1 DO BEGIN offset recstart i 8 a assoc num bytarr 1 nozero offset 1 sizepds bit2int binary a 1 binary a 2 binary a 3 flag binary a 8 gdsnotomitted flag 0 bmsnotomitted flag 1 ddd bit2int binary a 27 binary a 28 checkneg offset offset sizepds IF gdsnotomitted THEN BEGIN a assoc num bytarr 1 nozero offset 1 sizedds bit2int binary a 1 binary a 2 binary a 3 offset offset sizedds ENDIF IF bmsnotomitted THEN BEGIN a assoc num bytarr 1 nozero offset 1 sizebms bit2int binary a 1 binary a 2 binary a 3 offset offset sizebms ENDIF a assoc num bytarr 1 nozero offset 1 nbits i a 11 ENDFOR RETURN nbits END"); a[250] = new Array("./ToBeReviewed/LECTURE/GRIB/scan_grib_recstart.html", "scan_grib_recstart.pro", "", " file_comments categories param NUM returns restrictions examples history version Id: scan_grib_recstart pro 325 2007 12 06 10:04:53Z pinsard FUNCTION scan_grib_recstart num compile_opt idl2 strictarrsubs infofile fstat num minimum size of one record minisize 8L 28L 4L 4L maxoffset infofile size minisize start 0L offset 0L previousrecsize 0L WHILE offset LT maxoffset DO BEGIN Every record must begin with GRIB However their is no rule to define the space between 2 records 1 we try space previousrecsize MOD 8 because for echam outputs the total size of the records is rounded to modulo 8 addoff 8 previousrecsize MOD 8 offset offset addoff IF offset GE maxoffset THEN GOTO out a assoc num bytarr 4 nozero offset typefile string a 0 IF typefile NE GRIB THEN offset offset addoff 2 we try space previousrecsize MOD 120 because for ecmwf outputs the total size of the records is rounded to modulo 120 addoff 120 previousrecsize MOD 120 IF typefile NE GRIB THEN BEGIN offset offset addoff IF offset GE maxoffset THEN GOTO out a assoc num bytarr 4 nozero offset typefile string a 0 IF typefile NE GRIB THEN offset offset addoff ENDIF 3 we try space 0 IF typefile NE GRIB THEN BEGIN a assoc num bytarr 4 nozero offset typefile string a 0 ENDIF 4 we try any value for space IF typefile NE GRIB THEN BEGIN REPEAT BEGIN CASE 1 OF array_equal a 0 3 byte G :offset offset 3 array_equal a 0 2:3 byte GR :offset offset 2 array_equal a 0 1:3 byte GRI :offset offset 1 else:offset offset 4 ENDCASE IF offset GE maxoffset THEN GOTO out a assoc num bytarr 4 nozero offset typefile string a 0 ENDREP UNTIL typefile EQ GRIB ENDIF start start offset a assoc num bytarr 1 nozero offset 4 recsize bit2int binary a 0 binary a 1 binary a 2 offset offset recsize previousrecsize recsize ENDWHILE out: RETURN start 1:n_elements start 1 END"); a[251] = new Array("./ToBeReviewed/LECTURE/binary.html", "binary.pro", "", " file_comments Returns the binary representation of a number of any numerical type param NUMBER in required scalar or array of numbers any numerical type returns Byte array with binary representation of numbers examples Binary representation of 11b: IDL print binary 11b 0 0 0 0 1 0 1 1 Binary representation of pi x86: Little endian IEEE representation : IDL print format z9 8 5x 4 1x 8i1 long pi 0 binary pi 40490fdb 01000000 01001001 00001111 11011011 x86 Linux 0fdb4149 00001111 11011011 01000001 01001001 Alpha OpenVMS IDL print format 8 1x 8i0 binary dpi 01000000 00001001 00100001 11111011 01010100 01000100 00101101 00011000 Some first tests before type double was added: IDL print format 2a6 4x 2z9 8 4x 8z3 2 version arch version os long dpi 0 2 byte dpi 0 8 x86 linux 54442d18 400921fb 18 2d 44 54 fb 21 09 40 sparc sunos 400921fb 54442d18 40 09 21 fb 54 44 2d 18 alpha vms 0fda4149 68c0a221 49 41 da 0f 21 a2 c0 68 Beginning with IDL 5 1 Alpha VMS uses IEEE representation as well history 19 Dec 1997 Originally a news posting by David Fanning Re: bits from bytes 20 Dec 1997 Complete rewrite: eliminate loops 22 Dec 1997 Bit shift instead of exponentiation return byte array handle input arrays Think about double and complex types 22 Sep 1998 Complete rewrite: reduce every numerical type to single bytes Check that big and little endian machines return exactly the same results if IEEE 7 May 2003 Added newish data types unsigned and long64 BT version Id: binary pro 371 2008 08 07 09:32:02Z pinsard FUNCTION binary number compile_opt idl2 strictarrsubs s size number type s s 0 1 n_no s s 0 2 Numerical types: will have to be completed if IDL adds double long 1: byte 1 byte unsigned integer 2: integer 2 byte signed integer 3: long 4 byte signed integer 4: floating point 4 byte single precision 5: double precision 8 byte double precision 6: complex 2x4 byte single precision 9: double complex 2x8 byte double precision 12: uInt 2 byte unsigned integer 13: uLong 4 byte unsigned integer 14: Long64 8 byte signed integer 15: uLong64 8 byte unsigned integer Non numerical types: 0: undefined 7: string 8: structure 10: pointer 11: object reference nbyt 0 1 2 4 4 8 8 0 0 16 0 0 number of bytes per type code 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 nbyt 0 1 2 4 4 8 8 0 0 16 0 0 2 4 8 8 ntyp nbyt type if ntyp eq 0 then message Invalid argument must be numerical type bits 128 64 32 16 8 4 2 1 ishft 1b 7 indgen 8 For correct array handling and byte comparison number and bits require same dimensions numvalue and bitvalue bitvalue bits intarr ntyp intarr n_no little_endian byte 1 0 1 0 In case of complex type and little endian machine swap the two float values before the complete second dimension is reversed at returning if type eq 6 or type eq 9 and little_endian then type complex numvalue reform byte number 0 1 ntyp 2 2 n_no intarr 8 1 0 8 ntyp n_no else numvalue byte number 0 1 ntyp n_no intarr 8 On little endian machines the second dimension of the return value must be reversed if little_endian AND type NE 1 then return reverse numvalue and bitvalue ne 0 2 else return numvalue and bitvalue ne 0 end"); a[252] = new Array("./ToBeReviewed/LECTURE/changeread.html", "changeread.pro", "", " file_comments categories param NEWREAD returns uses restrictions examples history version Id: changeread pro 325 2007 12 06 10:04:53Z pinsard todo seb FUNCTION changeread newread compile_opt idl2 strictarrsubs common newread must be two structures if size newread type NE 8 then return 0 we compare the two structure which characterise the read case 1 of ccreadparameters funclec_name NE newread funclec_name: ccreadparameters jpidta NE newread jpidta: ccreadparameters jpjdta NE newread jpjdta: ccreadparameters jpkdta NE newread jpkdta: ccreadparameters ixmindta NE newread ixmindta: ccreadparameters ixmaxdta NE newread ixmaxdta: ccreadparameters iymindta NE newread iymindta: ccreadparameters iymaxdta NE newread iymaxdta: ccreadparameters izmindta NE newread izmindta: ccreadparameters izmaxdta NE newread izmaxdta: ELSE:return 0 endcase update the common paramaters ccreadparameters newread jpidta newread jpidta jpjdta newread jpjdta jpkdta newread jpkdta ixmindta newread ixmindta ixmaxdta newread ixmaxdta iymindta newread iymindta iymaxdta newread iymaxdta izmindta newread izmindta izmaxdta newread izmaxdta return 1 end"); a[253] = new Array("./ToBeReviewed/LECTURE/inverse_binary.html", "inverse_binary.pro", "", " file_comments Inverse function of the binary function given a input array of 0 1 return its corresponding byte integer long representation categories param BINNUMB in required Must be a binary type array containing only 0 and 1 According to binary outputs binnum array must have the following dimensions values: 8 t d1 d2 t gives the output type: t 1 byte t 2 integer t 4 long d1 d2 are the output dimensions returns A byte integer long array with d1 d2 dimensions restrictions The binary number can represent only byte integer long examples IDL a indgen 5 IDL b binary a IDL help b B BYTE Array 8 2 5 IDL print b 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 IDL help inverse_binary b INT Array 5 IDL print inverse_binary b 0 1 2 3 4 history Sebastien Masson smasson jamstec go jp July 2004 version Id: inverse_binary pro 371 2008 08 07 09:32:02Z pinsard FUNCTION inverse_binary binnumb compile_opt idl2 strictarrsubs s size binnumb dimensions IF n_elements s EQ 1 THEN numbofbit 8 ELSE numbofbit 8 s 1 nvalues n_elements binnumb numbofbit bn reform long binnumb numbofbit nvalues CASE numbofbit OF 8:res byte total temporary bn 2b reverse indgen numbofbit replicate 1b nvalues 1 1 16:res fix total temporary bn 2 reverse indgen numbofbit replicate 1 nvalues 1 1 double 32:res long total temporary bn 2L reverse indgen numbofbit replicate 1L nvalues 1 1 double ENDCASE CASE n_elements s OF 1:res res 0 2:res res 0 3: ELSE:res reform res s 2:n_elements s 1 over ENDCASE return res end"); a[254] = new Array("./ToBeReviewed/LECTURE/litchamp.html", "litchamp.pro", "", " file_comments Allows to read an array or a structure corresponding to a field If we have in input: an array litchamp send back the array a structure litchamp send back the first element of the structure which must be the field in an array litchamp profit of this to look other elements of the structure and update if needed global variables which refer to the field: vargrid varname varunit vardate varexp valmask et time categories Graphics param STRUCT in required type array or struct type array or structure If STRUCT is a structure it must follow following rules: the first element is the array containing the field other elements are strings containing informations on the field except for the one about the date This one can be either a string to designate a particular date ex: August 1999 or a vector of julian days of IDL corresponding to the calendar to be associated with the field if it is a temporal series the order of elements except the first has not any importance the other elements except the first are optional they are recognized by the first letter of their names: g to update vargrid u to update varunit e to update varexp d to update vardate n to update varname m to update valmask keyword GRID We activate this keyword if we want litchamp to send back the variable associated with the element of the structure starting by g if it exist and if it does not keyword UNIT We activate this keyword if we want litchamp to send back the variable associated with the element of the structure starting by u if it exist and if it does not keyword EXP We activate this keyword if we want litchamp to send back the variable associated with the element of the structure starting by u if it exist and if it does not keyword DATE We activate this keyword if we want litchamp to send back the variable associated with the element of the structure starting by d if it exist and if it does not keyword NAME We activate this keyword if we want litchamp to send back the variable associated with the element of the structure starting by n if it exist and if it does not keyword LEVEL We activate this keyword if we want litchamp to send back the variable associated with the element of the structure starting by l if it exist and 1 if it does not keyword MASK We activate this keyword if we want litchamp to send back the variable associated with the element of the structure starting by m if it exist and 1 if it does not returns It is the array containing the field uses common restrictions Update if needed global variables vargrid varname varunit vardate varexp valmask and time examples IDL print vargrid varname varunit vardate varexp T 0 IDL help litchamp a:indgen 5 u: C name: toto INT Array 5 IDL print vargrid varname varunit vardate varexp T toto C 0 IDL help litchamp a:indgen 5 da: 1999 INT Array 5 IDL print vargrid varname varunit vardate varexp T toto C 1999 history Sebastien Masson smasson lodyc jussieu fr 28 5 1999 version Id: litchamp pro 371 2008 08 07 09:32:02Z pinsard FUNCTION litchamp struct GRID grid NAME name UNIT unit EXP exp DATE date LEVEL level MASK mask compile_opt idl2 strictarrsubs common if size struct type ne 8 then BEGIN so contour is not a structure if keyword_set grid then return if keyword_set name then return if keyword_set unit then return if keyword_set exp then return if keyword_set date then return if keyword_set level then return 1 if keyword_set mask then return 1 return struct ENDIF IF n_tags struct EQ 1 then BEGIN The structure has only one element if keyword_set grid then return if keyword_set name then return if keyword_set unit then return if keyword_set exp then return if keyword_set date then return if keyword_set level then return 1 if keyword_set mask then return 1 return struct 0 ENDIF nomelements tag_names struct for i 1 n_tags struct 1 do begin case strlowcase strmid nomelements i 0 1 of g :BEGIN if keyword_set grid then return strupcase struct i vargrid strupcase struct i END n :BEGIN if keyword_set name then return struct i varname struct i END u :BEGIN if keyword_set unit then return struct i varunit struct i END e :BEGIN if keyword_set exp then return struct i varexp struct i END m :BEGIN if keyword_set mask then return struct i valmask struct i END d :BEGIN if size struct i type EQ 7 THEN BEGIN vardate struct i ENDIF ELSE BEGIN time struct i jpt n_elements time if jpt EQ 1 then vardate strtrim vairdate struct i 0 2 ELSE vardate strtrim vairdate struct i 0 2 strtrim vairdate struct i jpt 1 2 ENDELSE if keyword_set date then return vardate END h :BEGIN computehopegrid struct i xaxis struct i yaxis struct i zaxis struct i linetype FIRSTS struct i firsts LASTS struct i lasts FORTHEMASK struct 0 pttype struct i pttype END ELSE:BEGIN ras report Le nom nomelements i ne correspont a aucun element reconnu de la structure cf IDL xhelp litchamp end endcase endfor if keyword_set grid then return if keyword_set name then return if keyword_set unit then return if keyword_set exp then return if keyword_set date then return if keyword_set level then return 1 if keyword_set mask then return 1 return struct 0 end"); a[255] = new Array("./ToBeReviewed/LECTURE/ncdf_lec.html", "ncdf_lec.pro", "", " file_comments Give informations on a file netcdf and allows to recuperate variables which are written in it categories Reading param NOM in required Name of a file netcdf located in the directory stipulated by iodir keyword ATT global or the name of a variable Allows to see all attributes associated to variable keyword DIM Give the list of dimensions keyword VAR 1 var: Give the list of dimensions 2 var name_of_a_variable : in this case the function send back the variable keyword IODIR String containing the directory containing the file to be read keyword _EXTRA Used to pass keywords defined by IDL to functions NETCDF especially OFFSET and COUNT in NCDF_VARGET returns 1 except if var nom de variable then the function send back the variable restrictions Variables s names of the program are similar to these used by the IDL manual scientific data formats history Sebastien Masson smasson lodyc jussieu fr 4 1 98 version Id: ncdf_lec pro 327 2007 12 13 16:22:35Z pinsard FUNCTION ncdf_lec nom ATT att DIM dim VAR var IODIR iodir _EXTRA ex compile_opt idl2 strictarrsubs res 1 if NOT keyword_set IODIR then iodir if not keyword_set att or keyword_set dim or keyword_set var then BEGIN att 1 dim 1 var 1 commande ncdump c iodir nom spawn commande goto fini endif opening of the file name cdfid ncdf_open iodir nom What does the file contain wathinside ncdf_inquire cdfid print in the file iodir nom there are: if keyword_set dim then begin ras report number of dimensions: strtrim wathinside ndims 1 number of the dimension which value is infinite : strtrim wathinside recdim 1 endif if keyword_set var then if size var type NE 7 then ras report number of variables : strtrim wathinside nvars 1 if keyword_set att then begin if strlowcase att ne global then goto nonglobal ras report number of global attributes : strtrim wathinside ngatts 1 endif Global attributes if keyword_set att then begin print print ATTRIBUTS GLOBAUX for attiq 0 wathinside ngatts 1 do begin name ncdf_attname cdfid attiq global attribute s name ncdf_attget cdfid name value global attribute s value ras report name : string value endfor endif nonglobal: Display of different dimensions if keyword_set dim then begin print print DIMENSIONS endif nomdim strarr wathinside ndims tailledim lonarr wathinside ndims for dimiq 0 wathinside ndims 1 do begin ncdf_diminq cdfid dimiq name value dimension s name and value nomdim dimiq name tailledim dimiq value if keyword_set dim then begin ras report dimension number strtrim dimiq 1 name: nomdim dimiq value: strtrim tailledim dimiq 1 endif endfor Display of different variables if keyword_set att or keyword_set var then begin var s value string or 1 help var output nature if strpos nature STRING 0 NE 1 then nature string ELSE nature 1 If we just have to read the variable if nature EQ string then begin ncdf_varget cdfid var res _extra ex GOTO sortie ENDIF If it is to have pieces of information if not keyword_set att then att rien print for varid 0 wathinside nvars 1 do begin varcontent ncdf_varinq cdfid varid What does variable contain if strlowcase att eq strlowcase varcontent name or keyword_set var then begin ras report variable number: strtrim varid 1 name: varcontent name type: varcontent datatype dimensions: nomdim varcontent dim if strlowcase att eq strlowcase varcontent name then begin for attiq 0 varcontent natts 1 do begin name ncdf_attname cdfid varid attiq ncdf_attget cdfid varid name value ras report strtrim attiq name : strtrim string value 1 endfor goto sortie endif endif endfor endif sortie: ncdf_close cdfid fini: return res end"); a[256] = new Array("./ToBeReviewed/LECTURE/read_ftp.html", "read_ftp.pro", "", " file_comments categories param U param CMD param RES keyword OUT keyword COUNT Upon return the number of elements in the result set This is only important when the result set is the empty set in which case COUNT is set to zero restrictions examples history version Id: read_ftp pro 371 2008 08 07 09:32:02Z pinsard PRO ftp_post u cmd res out out count count compile_opt idl2 strictarrsubs if cmd ne then begin printf u cmd format a comment out the following line to disable debug info print cmd endif if size out type eq 0 then out 2 catch err if err ne 0 then return line count 0 while arg_present res do begin readf u line if count eq 0 then res line else res res line count count 1 comment out the following line to disable debug info print READ_FTP ftp: ftp rsinc com pub gzip README GZIP DATA data IDL help data DATA BYTE Array 2134 IDL print string data README file: Research Systems Anonymous FTP site ftp rsinc com pub directory gzip directory 2 Retrieve some files from podaac jpl nasa gov and store the files in the current working directory: IDL files string lindgen 10 50 format MGB370 3 3d gz IDL READ_FTP podaac jpl nasa gov files IDL pub sea_surface_height topex_poseidon mgdrb data MGB_370 FILE IDL spawn dir MGB log_output Volume in drive C is Local Disk Volume Serial Number is 34CE 24DF Directory of C: test test0307 07 28 2003 11:58a 362 167 MGB370 050 gz 07 28 2003 11:58a 333 005 MGB370 051 gz 07 28 2003 11:58a 310 287 MGB370 052 gz 07 28 2003 11:58a 358 771 MGB370 053 gz 07 28 2003 11:59a 387 282 MGB370 054 gz 07 28 2003 11:59a 361 633 MGB370 055 gz 07 28 2003 11:59a 383 075 MGB370 056 gz 07 28 2003 11:59a 365 844 MGB370 057 gz 07 28 2003 11:59a 383 918 MGB370 058 gz 07 28 2003 12:00p 372 712 MGB370 059 gz 10 File s 3 618 694 bytes These compressed files can consequently be opened with OPENR and the COMPRESSED keyword history version Id: read_ftp pro 371 2008 08 07 09:32:02Z pinsard todo seb: que fait on de syntax au debut du header give examples with date in year 0 should not exists but may happen PRO read_ftp site files dir port data data file file user user pass pass ptr ptr compile_opt idl2 if n_elements port eq 0 then port ftp if n_elements files eq 0 then begin if strcmp site ftp: 6 then host strmid site 6 else host site pos strpos host dir strmid host pos host strmid host 0 pos pos strpos dir reverse_search files strmid dir pos 1 dir strmid dir 0 pos endif else host site if size user type eq 0 then user anonymous if size pass type eq 0 then pass test test com socket u host port connect_timeout 5 read_timeout 5 get_lun ftp_post u res ftp_post u USER user res out 3 ftp_post u PASS pass res ftp_post u TYPE I res if size dir type ne 0 then ftp_post u CWD dir res if keyword_set file or arg_present data then begin bufsize 512 buffer bytarr bufsize n n_elements files if arg_present data then dat ptrarr n for i 0 n 1 do begin ftp_post u SIZE files i res out 213 sz long64 strmid res n_elements res 1 4 if arg_present data then dat i ptr_new bytarr sz ftp_post u PASV res ftp_parse_pasv res host port ftp_post u RETR files i res out 1 socket v host port connect_timeout 5 read_timeout 5 get_lun rawio tc 0ll if keyword_set file then openw w files i get_lun while tc lt sz do begin if sz tc lt bufsize then begin bufsize sz tc buffer bytarr bufsize endif readu v buffer transfer_count dtc if arg_present data then dat i tc dtc eq bufsize buffer:buffer 0:dtc 1 if keyword_set file then writeu w dtc eq bufsize buffer:buffer 0:dtc 1 tc tc dtc endwhile free_lun v if keyword_set file then free_lun w ftp_post u res endfor if arg_present data then begin if n gt 1 or keyword_set ptr then data dat else data temporary dat 0 endif endif ftp_post u QUIT res free_lun u end"); a[257] = new Array("./ToBeReviewed/LECTURE/read_ncdf.html", "read_ncdf.pro", "", " file_comments Reading function for the file net_cdf This program is less universal than ncdf_lec it appeal to declared variables in common but it is very easier to be used It considerate the declaration of the different zooms which have been defined ixminmesh premierx the declaration of the variable key_shift To put it in a nutshell the result of read_ncdf can be directly used in plt This is also this program which is used by default in our reading widgets categories Reading param NAME in required type string It define the field to be read param BEGINNING in required Relative with the time axis These can be 2 dates of the type yyyymmdd and in this case we select data which are included between these two dates 2 indexes which define between which and which time steps we have to extract the temporal dimension param ENDING in required Relative with the time axis See BEGINNING param COMPATIBILITY in optional Useless defined for compatibility keyword ADDSCL_BEFORE default 0 type scalar: 0 or 1 put 1 to apply add_offset and scale factor on data before looking for missing values keyword BOXZOOM Contain the boxzoom on which we have to do the reading keyword CALLITSELF default 0 type scalar: 0 or 1 For ROMS outputs Use by read_ncdf itself to access auxilliary data h and zeta keyword DIREC a string used to specify the direction along which we want to make spatial and or temporal mean It could be: x y z t xy xz yz xyz xt yt zt xyt xzt yzt or xyzt keyword FILENAME required type string It contains the file s name keyword INIT default 0 type scalar: 0 or 1 To call automatically initncdf with filename as input argument and thus redefine all the grid parameters keyword GRID UTVWF to specify the type of grid Default is 1 based on the name of the file if the file ends by GRID _ TUVFW NC not case sensible or 2 T if case 1 is not found keyword TIMESTEP default 0 type scalar: 0 or 1 Specify that BEGINNING and ENDING refer to indexes of the time axis and not to dates keyword TOUT default 0 type scalar: 0 or 1 We activate it if we want to read the file on the whole domain without considerate the sub domain defined by the boxzoom or lon1 lon2 lat1 lat2 vert1 vert2 keyword NOSTRUCT default 0 type scalar: 0 or 1 We activate it if we do not want that read_ncdf send back a structure but only the array referring to the field keyword ZETAFILENAME default FILENAME type string For ROMS outputs The filename of the file where zeta variable should be read keyword ZETAZERO default 0 type scalar: 0 or 1 For ROMS outputs To define zeta to 0 instead of reading it keyword ZINVAR type named variable Set this keyword to a named variable in which 1 is returned if a vertical dimension is found in the variable Returns 0 otherwise keyword _EXTRA Used to pass keywords to isafile initncdf ncdf_gettime ncdf_getatt and domdef returns Structure readable by litchamp or an array if NOSTRUCT is activated uses common restrictions The field must have a temporal dimension history Sebastien Masson smasson lodyc jussieu fr 15 10 1999 version Id: read_ncdf pro 399 2009 07 02 08:38:54Z smasson FUNCTION read_ncdf name beginning ending compatibility BOXZOOM boxzoom FILENAME filename PARENTIN parentin TIMESTEP timestep ADDSCL_BEFORE addscl_before TOUT tout NOSTRUCT nostruct CONT_NOFILL CONT_NOFILL INIT init GRID grid CALLITSELF callitself DIREC direc ZETAFILENAME zetafilename ZETAZERO zetazero ZINVAR zinvar _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh cm_4data cm_4cal IF NOT keyword_set key_forgetold THEN BEGIN updatenew updatekwd ENDIF we find the filename print filename is parent a valid widget IF keyword_set parentin THEN BEGIN parent long parentin parent parent widget_info parent managed ENDIF filename isafile filename filename IODIRECTORY iodir _EXTRA ex Opening of the name file IF size filename type NE 7 THEN return report read_ncdf cancelled IF version OS_FAMILY EQ unix THEN spawn file filename dev null cdfid ncdf_open filename inq ncdf_inquire cdfid we check if the variable name exists in the file IF ncdf_varid cdfid name EQ 1 THEN BEGIN ncdf_close cdfid return report variable name C not found in the file filename ENDIF varinq ncdf_varinq cdfid name IF varinq ndims LT 2 THEN return report read_ncdf cannot read scalar or 1D data look for the dimension names dimnames strarr varinq ndims FOR i 0 varinq ndims 1 DO BEGIN ncdf_diminq cdfid varinq dim i tmp dimsize dimnames i tmp ENDFOR we check if the variable has a vertical dimension and or a record dimension This is useful to define boxzoom keyword in domdef dummy where varinq dim EQ inq recdim tinvar check the presence of a vertical dimension according to the number of dimensions and the presence of a record dimension zinvar varinq ndims EQ 3 AND tinvar NE 1 OR varinq ndims EQ 4 shall we redefine the grid parameters IF keyword_set init THEN initncdf filename _extra ex check the time axis and the debut and ending dates IF n_elements beginning EQ 0 THEN BEGIN beginning 0L timestep 1L ENDIF define time and jpt CASE 1 OF keyword_set timestep :BEGIN firsttps long beginning 0 IF n_elements ending NE 0 THEN lasttps long ending 0 ELSE lasttps firsttps jpt lasttps firsttps 1 IF NOT keyword_set callitself then time julday 1 1 1 lindgen jpt END keyword_set parent :BEGIN widget_control parent get_uvalue top_uvalue filelist extractatt top_uvalue filelist IF filelist 0 EQ many THEN filelist filename currentfile where filelist EQ filename 0 time extractatt top_uvalue fileparameters currentfile time_counter date1 date2jul beginning 0 if n_elements ending NE 0 then date2 date2jul ending 0 ELSE date2 date1 firsttps where abs time date1 LT 0 9d 86400 d 0 beware of rounding errors lasttps where abs time date2 LT 0 9d 86400 d 0 jpt lasttps firsttps 1 END ELSE:BEGIN time ncdf_gettime filename cdfid caller read_ncdf err err _extra ex IF n_elements err NE 0 THEN BEGIN dummy report err ncdf_close cdfid return 1 ENDIF date1 date1 date2jul beginning 0 date2 if n_elements ending NE 0 then date2 date2jul ending 0 ELSE date2 date1 firsttps firsttps where time GE date1 0 9d 86400 d firsttps firsttps 0 if firsttps EQ 1 THEN BEGIN ncdf_close cdfid return report date 1: strtrim jul2date date1 1 is not found in the time axis ENDIF lasttps lasttps where time LE date2 0 9d 86400 d lasttps lasttps n_elements lasttps 1 if lasttps EQ 1 THEN BEGIN ncdf_close cdfid return report the time axis has no date before date 2: strtrim jul2date date2 1 endif if lasttps LT firsttps then BEGIN ncdf_close cdfid return report the time axis has no dates between date1 and date 2: strtrim jul2date date1 1 strtrim jul2date date2 1 endif time time firsttps:lasttps jpt lasttps firsttps 1 END ENDCASE Name of the grid on which the field refer to IF keyword_set grid THEN vargrid strupcase grid ELSE BEGIN vargrid T default definition IF finite glamu 0 EQ 1 THEN BEGIN are we in one of the case corresponding to ROMS conventions CASE 1 OF dimnames 2 long key_stride read_ncdf_varget We define common cm_4data variables associated with the variable varname IF NOT keyword_set callitself THEN varname name varunit and others ncdf_getatt cdfid name add_offset add_offset scale_factor scale_factor missing_value missing_value units units _extra ex IF NOT keyword_set callitself THEN varunit units vardate We make a legible date caldat time 0 month day year vardate string format C CMoA 31 month 1 strtrim day 1 strtrim year 1 varexp file_basename filename We apply the value valmask on land points if NOT keyword_set cont_nofill then begin valmask 1 e20 case 1 of varinq ndims eq 2: earth where mask 0 EQ 0 xy array varinq ndims eq 3 AND where varinq dim EQ inq recdim 0 EQ 1:earth where mask EQ 0 xyz array varinq ndims eq 3 AND where varinq dim EQ inq recdim 0 NE 1:earth where mask 0 EQ 0 xyt array varinq ndims eq 4: earth where mask EQ 0 xyzt array ENDCASE ENDIF ELSE earth 1 we look for missing_value we apply add_offset scale_factor and missing_value IF keyword_set addscl_before THEN BEGIN IF scale_factor NE 1 THEN res temporary res scale_factor IF add_offset NE 0 THEN res temporary res add_offset ENDIF IF size missing_value type NE 7 THEN BEGIN IF finite missing_value EQ 1 THEN BEGIN CASE 1 OF missing_value GT 1 e6:missing where res GT missing_value 10 missing_value LT 1 e6:missing where res LT missing_value 10 abs missing_value LT 1 e 6:missing where abs res LT 1 e 6 ELSE:missing where res EQ missing_value ENDCASE ENDIF ELSE missing where finite res EQ 0 ENDIF ELSE missing 1 IF NOT keyword_set addscl_before THEN BEGIN if scale_factor NE 1 then res temporary res scale_factor if add_offset NE 0 then res temporary res add_offset ENDIF IF missing 0 NE 1 THEN res temporary missing values f_nan IF earth 0 NE 1 THEN BEGIN IF varinq ndims eq 3 AND where varinq dim EQ inq recdim 0 NE 1 THEN xyt array earth earth replicate 1 jpt replicate nx ny n_elements earth lindgen jpt IF varinq ndims eq 4 THEN earth earth replicate 1 jpt replicate nx ny nz n_elements earth lindgen jpt res temporary earth 1 e20 ENDIF if it is roms outputs we need to get additionals infos IF NOT keyword_set callitself THEN BEGIN IF strmid dimnames 0 0 3 EQ xi_ AND strmid dimnames 1 0 4 EQ eta_ THEN BEGIN ncdf_attget cdfid theta_s theta_s global ncdf_attget cdfid theta_b theta_b global ncdf_attget cdfid hc hc global look for all variables names allvarnames strarr inq nvars FOR i 0 inq nvars 1 DO BEGIN tmp ncdf_varinq cdfid i allvarnames i tmp name ENDFOR CASE 1 OF keyword_set zetazero :zeta fltarr nx ny jpt keyword_set zetafilename : zeta read_ncdf zeta firsttps lasttps FILENAME zetafilename TIMESTEP NOSTRUCT CONT_NOFILL CONT_NOFILL GRID vargrid CALLITSELF _EXTRA ex where allvarnames EQ zeta 0 NE 1: zeta read_ncdf zeta firsttps lasttps FILENAME filename TIMESTEP NOSTRUCT CONT_NOFILL CONT_NOFILL GRID vargrid CALLITSELF _EXTRA ex ELSE:return report The variable zeta was not found in the file please use the keyword ZETAFILENAME to specify the name of a file containing zeta or use keyword ZETAZERO to define zeta to 0 ENDCASE romszinfos h:romszinfos h zeta:temporary zeta theta_s:theta_s theta_b:theta_b hc:hc ENDIF ELSE romszinfos h: 1 zeta: 1 theta_s: 1 theta_b: 1 hc: 1 ENDIF IF keyword_set direc THEN BEGIN IF jpt EQ 1 THEN res moyenne temporary res direc _extra ex ELSE BEGIN res grossemoyenne temporary res direc _extra ex IF strpos strlowcase direc t ge 0 THEN BEGIN vardate strtrim jul2date time 0 1 strtrim jul2date time jpt 1 1 time total time float jpt jpt 1 ENDIF ENDELSE ENDIF ncdf_close cdfid IF keyword_set nostruct THEN return res IF keyword_set key_forgetold THEN BEGIN return arr:temporary res grid:vargrid unit:varunit experiment:varexp name:varname ENDIF ELSE BEGIN return tab:temporary res grille:vargrid unite:varunit experience:varexp nom:varname ENDELSE END"); a[258] = new Array("./ToBeReviewed/LECTURE/read_ncdf_varget.html", "read_ncdf_varget.pro", "", ""); a[259] = new Array("./ToBeReviewed/LECTURE/xncdf_lec.html", "xncdf_lec.pro", "", " file_comments Reading of a NetCdf file with widgets categories Widget param NAME in optional type string It give the name of the file to be opened If NAME does not contain the separating character of directories under unix for example the file will be looked for in the current directory keyword IODIR type string It contains the directory where to go look for the file to be read If NAME does not contain the separating character of directories under unix for example the file will be called iodir nom_fichier keyword COUNT type vector An optional vector containing the counts to be used in reading Value COUNT is a 1 based vector with an element for each dimension of the data to be written The default matches the size of the variable so that all data is written out keyword GROUP The widget ID of the widget that calls XNCDF_LEC When this ID is specified a death of the caller results in a death of XNCDF_LEC keyword OFFSET type vector default 0 0 An optional vector containing the starting position for the read keyword SHIFT type vector default 0 0 A vector of integers specifying for each dimension how much we have to shift it See the function SHIFT for more explanations BEWARE the shift is done on the biggest array before a possible reduction determined by OFFSET and COUNT On the other hand it is done after the possible extraction created by the STRIDE keyword STRIDE type vector default 1 1 An optional vector containing the strides or sampling intervals between accessed values of the netCDF variable returns 2 different cases: 1 None attribute has been selected In this case res is the array we wanted to read 2 Some attributes has been selected In this case res is a structure whose the first element having the name of the variable is the values array and the other arguments are the select arguments uses wididbase infovariable resultat motcle examples IDL help xncdf_lec history Sebastien Masson smasson lodyc jussieu fr 24 8 1999 version Id: xncdf_lec pro 378 2008 08 12 12:35:46Z pinsard FUNCTION xncdf_lec name ATT att COUNT count GROUP group OFFSET offset IODIR iodir SHIFT shift STRIDE stride VAR var compile_opt idl2 strictarrsubs COMMON wididbase base COMMON infovariable cdfid listename contient nomdim tailledim varid varcontient COMMON resultat res COMMON motcle mcatt mccount mcoffset mciodir mcshift mcstride mcvar Trick for using keywords we pass by variables declared in a common res 1 if keyword_set att then mcatt att ELSE mcatt 0 if keyword_set count then mccount count ELSE mccount 0 if keyword_set offset then mcoffset offset ELSE mcoffset 0 if keyword_set shift then mcshift shift ELSE mcshift 0 if keyword_set stride then mcstride stride ELSE mcstride 0 if keyword_set var then mcvar var ELSE mcvar 0 choice of the file s name What type of machine is used thisOS strupcase strmid version os_family 0 3 CASE thisOS of MAC :sep : WIN :sep ELSE: sep ENDCASE If IODIR is not defined we initialize it at the current directory if NOT keyword_set iodir then cd current iodir mciodir iodir We complete IODIR with a separating character if needed IF rstrpos iodir sep NE strlen iodir 1 THEN iodir iodir sep if n_elements name EQ 0 then BEGIN If NAME is not defined we find one thanks to the program dialog_pickfile name dialog_pickfile filter iodir nc if name 0 EQ then return 1 If we do not have find anything we go out We complete NAME by IODIR if NAME does not contain any directory separating character ENDIF ELSE if strpos name sep EQ 1 then name iodir name test findfile name Does the name looked for correspond to a file while test 0 EQ OR n_elements test GT 1 do BEGIN We look for one as long as it correspond to nothing test test 0 name dialog_pickfile filter iodir nc if name EQ then return 1 test findfile name endwhile Opening of the file name cdfid ncdf_open name contient ncdf_inquire cdfid What does this file contain Opening of the base window as columns if n_elements group EQ 0 then base widget_base column title Fichier: name align_left ELSE base widget_base column title Fichier: name align_left GROUP_LEADER group Opening of base sub windows base 1 title having the file s name base1 widget_base base column align_center rien widget_label base1 value NetCdf filename align_center rien widget_text base1 value name align_center uvalue 1 editable File s name we can change rien widget_label base1 value We jump a line base 2 General informations on the file base2 widget_base base column Informations on global attributes if contient ngatts NE 1 then begin rien widget_label base2 value Nombre de attributs globaux: strtrim contient ngatts 1 align_left for attiq 0 contient ngatts 1 do BEGIN Loop on the number of global attributes name ncdf_attname cdfid attiq global Attribute s name ncdf_attget cdfid name value global Attribute s value rien widget_text base2 value name : strtrim string value 1 xsize 60 scroll wrap align_right endfor rien widget_label base2 value endif Informations on dimensions rien widget_label base2 value Nombre de dimensions: strtrim contient ndims 1 align_left if contient recdim NE 1 then begin Loop on the number of global attributes ncdf_diminq cdfid contient recdim name value Name and value of the dimension rien widget_label base2 value name de la dimension infinie: name align_left endif nomdim strarr contient ndims Vector containing dimensions s name tailledim lonarr contient ndims Vector containing dimensions s value for dimiq 0 contient ndims 1 do begin Loop on the number of dimensions ncdf_diminq cdfid dimiq name value Name and value of the dimension nomdim dimiq name tailledim dimiq value rien widget_label base2 value name de taille: strtrim value 1 align_right ENDFOR rien widget_label base2 value We jump a line base 3 choice of the variable base3 widget_base base column rien widget_label base3 value Nombre de variables: strtrim contient nvars 1 align_left base31 widget_base base3 row align_center Creation of a listename containing the name of all file s variables listename strarr contient nvars for varid 0 contient nvars 1 do begin varcontient ncdf_varinq cdfid varid that the variable contain listename varid varcontient name endfor rien widget_label base31 value variable Creation of a button with a pop up menu base311 widget_droplist base31 value listename uvalue 2 rien widget_label base3 value base 4 button done base4 widget_base base row base42 widget_button base4 value done uvalue 3 align_right Execution of the base window and of sub windows widget_control base realize xmanager xncdf_lec base return res end La lecture de ce programme se fait de bas en haut: 1 xncdf_lec 2 xncdf_lec_event 3 wid_var wid_var_event file_comments Procedure called by xmanager when we press on a button of a second widget created by wid_var param EVENT in required A structure characterizing the type of event which arrive to a widget number1 2 uses wididbase resultat infovariable indicewid motcle version Id: xncdf_lec pro 378 2008 08 12 12:35:46Z pinsard PRO wid_var_event event compile_opt idl2 strictarrsubs COMMON wididbase base COMMON resultat res COMMON infovariable cdfid listename contient nomdim tailledim varid varcontient COMMON indicewid_var widbase1 widbase2111 widbase212 widbase213 selectatt COMMON motcle mcatt mccount mcoffset mciodir mcshift mcstride mcvar What is the type of event widget_control event id get_uvalue uval tailledimvar tailledim varcontient dim if n_elements uval EQ 0 then return case on the type of event case uval OF 1:BEGIN We change values in the array We check that values put in the array are not totally false widget_control widbase1 get_value table Is it the good type of argument If the type is wrong we automatically change it by default values if event x GT size table 1 then return if event y GT size table 2 then return if size table event x event y type GE 6 OR size table event x event y type EQ 0 then BEGIN if event x EQ 1 then widget_control widbase1 use_table_select 1 event y 1 event y set_value tailledimvar event y ELSE widget_control widbase1 use_table_select event x event y event x event y set_value 0 endif Argument with a wrong name value table fix table case event x of 0:BEGIN We touched the offset if table 0 event y LT 0 then BEGIN table 0 event y 0 widget_control widbase1 use_table_select 0 event y 0 event y set_value 0 endif If it exceed the dimension of the array we put it at the max and the cont at 1 if table 0 event y GT tailledimvar event y table 3 event y then begin widget_control widbase1 use_table_select 0 event y 1 event y set_value tailledimvar event y table 3 event y 1 ENDIF ELSE BEGIN If with the new offset the cont is too big we reduce it until it goes well if table 1 event y GT tailledimvar event y table 3 event y table 0 event y then begin widget_control widbase1 use_table_select 1 event y 1 event y set_value tailledimvar event y table 3 event y table 0 event y endif ENDELSE END 1:BEGIN We touched the cont if table 1 event y LT 1 then BEGIN table 1 event y 1 widget_control widbase1 use_table_select 1 event y 1 event y set_value 1 endif If it is too big we reduce it until it goes well if table 1 event y GT tailledimvar event y table 3 event y table 0 event y then BEGIN widget_control widbase1 use_table_select 1 event y 1 event y set_value tailledimvar event y table 3 event y table 0 event y endif END 2:BEGIN We touched the shift widget_control widbase1 use_table_select 2 event y 2 event y set_value table 2 event y MOD tailledimvar event y table 3 event y END 3:BEGIN We touched the stride if table 3 event y LT 1 then BEGIN table 3 event y 1 widget_control widbase1 use_table_select 3 event y 3 event y set_value 1 endif if table 3 event y EQ 0 then It must not be null widget_control widbase1 use_table_select 3 event y 3 event y set_value 1 It must not be too big if table 3 event y GT tailledimvar event y then widget_control widbase1 use_table_select 0 event y 3 event y set_value 0 1 0 tailledimvar event y ELSE BEGIN if table 1 event y GT tailledimvar event y table 3 event y table 0 event y then begin widget_control widbase1 use_table_select 1 event y 1 event y set_value tailledimvar event y table 3 event y table 0 event y endif ENDELSE END ELSE: endcase END 2111:BEGIN We touched buttons yes no We update the vector selectatt at 0 or 1 for the concerned attribute number event id selectatt where widbase2111 EQ event id event select end 31:BEGIN We pressed on get widget_control widbase1 get_value table table fix table mcshift where table 2 NE 0 mcoffset table 0 mccount table 1 mcstride table 3 if mcshift 0 NE 1 then BEGIN There are some shifts We read the wholeness of dimensions for which ones there is a shift mcoffset mcshift 0 mccount mcshift tailledimvar mcshift We do not activate stride when there is no need because it makes write something weird on the screen if total mcstride EQ n_elements mcstride then ncdf_varget cdfid varid res OFFSET mcoffset COUNT mccount ELSE ncdf_varget cdfid varid res OFFSET mcoffset COUNT mccount STRIDE mcstride To do the shift mcshift table 2 mcoffset table 0 mccount table 1 We define the command allowing to do a shift commande res shift res for dim 0 varcontient ndims 1 do commande commande string table 2 dim commande commande rien execute commande We redefine the command allowing to cut dimensions which has not been cut yet ones we shift commande res res initialization of the command for dim 0 varcontient ndims 1 do BEGIN if mcshift dim EQ 0 then commande commande ELSE commande commande string mcoffset dim : string mccount dim mcoffset dim 1 ENDFOR commande strmid commande 0 strlen commande 1 rien execute commande Case without shift we read directly the good part of the array ENDIF ELSE BEGIN if total mcstride EQ n_elements mcstride then ncdf_varget cdfid varid res OFFSET mcoffset COUNT mccount ELSE ncdf_varget cdfid varid res OFFSET mcoffset COUNT mccount STRIDE mcstride ENDELSE Do we have to constitute a structure with selected attributes if total selectatt NE 0 then BEGIN There are selected attributes res create_struct varcontient name res We create the structure selectatt where selectatt EQ 1 We find selected attributes for attid 0 n_elements selectatt 1 do BEGIN for which we take widget_control widbase212 selectatt attid get_value attname the name widget_control widbase213 selectatt attid get_value attvalue the value res create_struct res attname 0 attvalue 0 We concatenate the structure endfor endif widget_control event top destroy We shut the second widget widget_control base destroy We shut the first widget ncdf_close cdfid END 32: Case of the display of a held with xdisplayfile 33:widget_control event top destroy We shut the second widget ELSE: endcase return end file_comments This procedure manage the second created widget when we call xncdf_lec This widget concern the reading of the variable param WIDID_PERE type scalar in required It contains the identity of the father widget which was created by xncdf_lec and which has allowed to select the variable to be read returns indirectement res le tableau ou la structure resultat uses resultat infovariable indicewid_var motcle version Id: xncdf_lec pro 378 2008 08 12 12:35:46Z pinsard PRO wid_var widid_pere compile_opt idl2 strictarrsubs COMMON resultat res COMMON infovariable cdfid listename contient nomdim tailledim varid varcontient COMMON indicewid_var widbase1 widbase2111 widbase212 widbase213 selectatt COMMON motcle mcatt mccount mcoffset mciodir mcshift mcstride mcvar res 1 Opening of the base window as columns widbase widget_base column title variable: varcontient name align_center group_leader widid_pere Opening of the base subwindow widbase1 array of offsets rien widget_label widbase value We jump a line Definition of labels of lines of the array rowlab string tailledim varcontient dim for i 0 n_elements rowlab 1 do rowlab i strtrim rowlab i 1 rowlab nomdim varcontient dim replicate : n_elements varcontient dim rowlab Definition of array s initial values valinit lonarr 4 n_elements varcontient dim column 0 : offsets if keyword_set mcoffset AND n_elements mcoffset EQ varcontient ndims THEN valinit 0 mcoffset ELSE valinit 0 0 colomn 1 : counts if keyword_set mccount AND n_elements mccount EQ varcontient ndims THEN valinit 1 mccount ELSE valinit 1 tailledim varcontient dim column 2 : shifts if keyword_set mcshift AND n_elements mcshift EQ varcontient ndims THEN valinit 2 mcshift ELSE valinit 2 0 column 3 : strides if keyword_set mcstride AND n_elements mcstride EQ varcontient ndims THEN valinit 3 mcstride ELSE valinit 3 1 test of initial values of the array valinit fix valinit valinit 3 1 valinit 3 valinit 0 valinit 1 tailledim varcontient dim valinit 3 valinit 0 valinit 2 valinit 2 MOD tailledim varcontient dim valinit 3 test of shifts declaration of the array widbase1 widget_table widbase row_labels rowlab value valinit editable column_labels Offset Count Shift Stride uvalue 1 un petit blabla rien widget_label widbase value ATTENTION: Faire des return pour que les valeurs align_center rien widget_label widbase value du tableau ou des textes soient bien prises en compte align_center widbase2 choice of attributes rien widget_label widbase value We jump a line widbase2 widget_base widbase column To each attribute we created a widget widbase21 containing in line a button yes no widbase211 and two widget text widbase212 widbase213 comprising the name and the value of the attribute widbase21 lonarr varcontient natts widbase211 lonarr varcontient natts widbase2111 lonarr varcontient natts Vector which will serve to know which yes no are selected see wid_var_event selectatt lonarr varcontient natts selectatt 0 widbase212 lonarr varcontient natts widbase213 lonarr varcontient natts for attid 0 varcontient natts 1 do BEGIN Loop on the number of attribute widbase21 attid widget_base widbase2 row name ncdf_attname cdfid varid attid ncdf_attget cdfid varid name value widbase211 attid widget_base widbase21 attid nonexclusive widbase2111 attid widget_button widbase211 attid value uvalue 2111 widbase212 attid widget_text widbase21 attid value name editable widbase213 attid widget_text widbase21 attid value strtrim string value 1 editable endfor widbase3 buttons of the bottom widbase3 widget_base widbase row align_center widbase31 widget_button widbase3 value GET uvalue 31 widbase32 widget_button widbase3 value Help uvalue 32 widbase33 widget_button widbase3 value DONE uvalue 33 execution of the base window and of sub window widget_control widbase realize xmanager wid_var widbase return end file_comments Procedure called by xmanager when we press a button of the first widget created by xncdf_lec param EVENT A structure characterising the event type which arrive at the widget number 1 uses resultat infovariable motcle version Id: xncdf_lec pro 378 2008 08 12 12:35:46Z pinsard PRO xncdf_lec_event event compile_opt idl2 strictarrsubs COMMON resultat res COMMON infovariable cdfid listename contient nomdim tailledim varid varcontient COMMON motcle mcatt mccount mcoffset mciodir mcshift mcstride mcvar What is the type of event widget_control event id get_uvalue uval case on the type of event case uval of 1:BEGIN We want to read an other file widget_control event id get_value nom We recuperate the name widget_control event top destroy We shut the widget ncdf_close cdfid We shut the wrong file which has been opened We call back xncdf_lec res xncdf_lec nom 0 ATT mcatt COUNT mccount OFFSET mcoffset IODIR mciodir SHIFT mcshift STRIDE mcstride VAR mcvar return END 2:BEGIN A variable is selected varid event index We recuperat its number in the file Netcdf varcontient ncdf_varinq cdfid varid wid_var event top We call the program which launch the second widget See sooner END 3:BEGIN button done widget_control event top destroy We delete the widget ncdf_close cdfid We shut the file END ELSE: endcase return end"); a[260] = new Array("./ToBeReviewed/MATRICE/colle.html", "colle.pro", "", " file_comments This concatenation function exist in IDL so long as we do not try to stick with a dimension superior or equal at 4 categories Utilities param a0 in required param a1 in required param a2 in required param a3 in required param a4 in required param a5 in required param a6 in required param a7 in required param a8 in required param a9 in required param a10 in required param a11 in required param a12 in required param a13 in required param a14 in required param a15 in required param a16 in required param a17 in required param a18 in required param a19 in required param a20 in required keyword SAUVE force to save the pointer array and arrays to be stuck returns matrice resultat examples IDL print colle replicate 1 2 2 2 indgen 2 2 2 2 1 1 1 1 0 1 2 3 1 1 1 1 4 5 6 7 history Sebastien Masson smasson lodyc jussieu fr 13 1 98 version Id: colle pro 371 2008 08 07 09:32:02Z pinsard FUNCTION colle a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 SAUVE sauve compile_opt idl2 strictarrsubs res 1 We put in place ptrtab and direc in function of input arguments case 1 of n_params EQ 2:BEGIN case where we directly give the pointer array ptrtab a0 direc a1 if NOT keyword_set sauve then undefine a0 on recuperate the number of array to be pasted nbretab size ptrtab 1 end n_params GT 2:BEGIN on recuperate the number of array to be pasted nbretab n_params 1 bidon execute direc a strtrim n_params 1 2 We write the pointer array whose each element point on an array ptrtab ptrarr nbretab allocate_heap for n 0 nbretab 1 do begin bidon execute ptrtab n a strtrim n 2 if NOT keyword_set sauve then bidon execute undefine a strtrim n 2 endfor sauve 0 end ELSE: endcase case on the direct s value case direc of 1:BEGIN we paste following the dimension 1 res ptrtab 0 if NOT keyword_set sauve then ptr_free ptrtab 0 FOR n 1 nbretab 1 DO BEGIN res temporary res ptrtab n if NOT keyword_set sauve then ptr_free ptrtab n ENDFOR END 2:BEGIN we paste following the dimension 2 res ptrtab 0 if NOT keyword_set sauve then ptr_free ptrtab 0 FOR n 1 nbretab 1 DO BEGIN res temporary res ptrtab n if NOT keyword_set sauve then ptr_free ptrtab n ENDFOR END 3:BEGIN we paste following the dimension 3 res ptrtab 0 if NOT keyword_set sauve then ptr_free ptrtab 0 FOR n 1 nbretab 1 DO BEGIN res temporary res ptrtab n if NOT keyword_set sauve then ptr_free ptrtab n ENDFOR END ELSE:BEGIN We transpose res in order to put the dimension to be pasted number 1 To this we contain the permuter vector which give the place that dimension in the transposed matrix must take siz size ptrtab 0 0 if siz LT direc then ptrtab 0 reform ptrtab 0 size ptrtab 0 1:siz replicate 1 direc siz over permute indgen size ptrtab 0 0 permute 0 direc 1 permute direc 1 0 res transpose ptrtab 0 permute if NOT keyword_set sauve then ptr_free ptrtab 0 FOR n 1 nbretab 1 DO BEGIN we paste following the dimension 1on colle suivant la dimension 1 if size ptrtab n 0 LT direc then ptrtab n reform ptrtab n size ptrtab n 1:siz replicate 1 direc siz res temporary res transpose ptrtab n permute if NOT keyword_set sauve then ptr_free ptrtab n ENDFOR res transpose temporary res permute END ENDCASE if NOT keyword_set sauve then undefine ptrtab sortie: return res END"); a[261] = new Array("./ToBeReviewed/PLOTS/DESSINE/bar_plot.html", "bar_plot.pro", "", " file_comments Create a bar graph or overplot on an existing one categories Graphics param Values in required type vector A vector containing the values to be represented by the bars Each element in VALUES corresponds to a single bar in the output keyword BASELINES type vector A vector the same size as VALUES that contains the base value associated with each bar If not specified a base value of zero is used for all bars keyword COLORS type vector A vector the same size as VALUES containing the color index to be used for each bar If not specified the colors are selected based on spacing the color indexes as widely as possible within the available colors specified by D N_COLORS keyword BARNAMES type string A string array containing one string label per bar If the bars are vertical the labels are placed beneath them If horizontal rotated bars are specified the labels are placed to the left of the bars keyword TITLE type string A string containing the main title to for the bar plot keyword XTITLE type string A string containing the title for the X axis keyword YTITLE type string A string containing the title for the Y axis keyword BASERANGE type float A floating point scalar in the range 0 0 to 1 0 that determines the fraction of the total available plotting area in the direction perpendicular to the bars to be used If not specified the full available area is used keyword BARWIDTH type float A floating point value that specifies the width of the bars in units of nominal bar width The nominal bar width is computed so that all the bars and the space between them set by default to 20 of the width of the bars will fill the available space optionally controlled with the BASERANGE keyword keyword BARSPACE type scalar A scalar that specifies in units of nominal bar width the spacing between bars For example if BARSPACE is 1 0 then all bars will have one bar width of space between them If not specified the bars are spaced apart by 20 of the bar width keyword BAROFFSET default BARSPACE type scalar A scalar that specifies the offset to be applied to the first bar in units of nominal bar width This keyword allows for example different groups of bars to be overplotted on the same graph keyword OUTLINE If set this keyword specifies that an outline should be drawn around each bar keyword OVERPLOT If set this keyword specifies that the bar plot should be overplotted on an existing graph keyword BACKGROUND default The normal IDL background color is used type scalar A scalar that specifies the color index to be used for the background color keyword ROTATE If set this keyword indicates that horizontal rather than vertical bars should be drawn The bases of horizontal bars are on the left Y axis and the bars extend to the right examples By using the overplotting capability it is relatively easy to create stacked bar charts or different groups of bars on the same graph For example if ARRAY is a two dimensional array of 5 columns and 8 rows it is natural to make a plot with 5 bars each of which is a stacked composite of 8 sections First create a 2D COLORS array equal in size to ARRAY that has identical color index values across each row to ensure that the same item is represented by the same color in all bars With ARRAYS and COLORS defined the following code fragment illustrates the creation of stacked bars note that the number of rows and columns is arbitrary : Y RANGE 0 ymax Scale range to accommodate the total bar lengths BASE INTARR NROWS FOR I 0 NROWS 1 DO BEGIN BAR_PLOT ARRAY I COLORS COLORS I BASELINES BASE BARWIDTH 0 75 BARSPACE 0 25 OVER I GT 0 BASE BASE ARRAY I ENDFOR To plot each row of ARRAY as a clustered group of bars within the same graph use the BASERANGE keyword to restrict the available plotting region for each set of bars The sample code fragment below illustrates this method: FOR I 0 NROWS 1 DO BAR_PLOT ARRAY I COLORS COLORVECT BARWIDTH 0 8 BARSPACE 0 2 BAROFFSET I 1 0 BARSPACE NCOLS OVER I GT 0 BASERANGE 0 19 where NCOLS is the number of columns in ARRAY and COLORVECT is a vector containing the color indices to be used for each group of bars In this example each group uses the same set of colors but this could easily be changed history August 1990 T J Armitage RSI initial programming Replacement for PLOTBAR and OPLOTBAR routines written by William Thompson September 1990 Steve Richards RSI changed defaults to improve the appearance of the bar plots in the default mode Included spacing the bars slightly version Id: bar_plot pro 327 2007 12 13 16:22:35Z pinsard PRO bar_plot values BASELINES baselines COLORS colors BARNAMES barnames TITLE title XTITLE xtitle YTITLE ytitle BASERANGE baserange BARWIDTH barwidth BARSPACE barspace BAROFFSET baroffset OUTLINE outline OVERPLOT overplot BACKGROUND background ROTATE rotate _EXTRA ex compile_opt idl2 strictarrsubs if n_params d eq 0 then begin Print call return if no parameters ras report bar_test values baselines baselines colors colors barnames barnames title title xtitle xtitle ytitle ytitle baserange baserange barwidth barwidth barspace barspace baroffset baroffset outline outline overplot overplot background background rotate rotate return endif nbars n_elements values Determine number of bars Baselines bars extend from baselines through values default 0 if not keyword_set baselines then baselines intarr nbars Default colors spaced evenly in current color table if not keyword_set colors then colors fix d n_colors float nbars indgen nbars 0 5 Labels for the individual bars none by default if not keyword_set barnames then barnames strarr nbars Main title if not keyword_set title then title Centered title under X axis if not keyword_set xtitle then xtitle Title for Y axis if not keyword_set ytitle then ytitle Fraction 0 1 of full X range to use if not keyword_set baserange then baserange 1 0 Space betw bars taken from nominal bar widths default is none If not keyword_set barspace then barspace 0 2 Bar width scaling factor relative to nominal if not keyword_set barwidth then barwidth 1 0 barspace barspace nbars Initial X offset in scaled bar widths default is none if not keyword_set baroffset then baroffset barspace barwidth Outline of bars default is none outline keyword_set outline Overplot do not erase the existing display default is to create new plot overplot keyword_set overplot Background color index defaults to 0 usually black if not specified if not keyword_set background then background 0 Rotate make horizontal bars default is vertical bars rotate keyword_set rotate mnB MIN baselines MAX mxB NAN mnV MIN values MAX mxV NAN range mnB mxV Maximum of bases values if rotate then begin Horizontal bars if x range 0 eq 0 and x range 1 eq 0 Determine range for X axis then xrange range else xrange x range Or use range specified if y range 0 eq 0 and y range 1 eq 0 Plot will calculate then defaults for X but not yrange 0 n_elements values for Ys so fill in here else yrange y range Axis perpend to bars yticks 1 Suppress ticks in plot ytickname strarr 2 xticks 0 xtickname strarr 1 endif else begin Vertical bars if y range 0 eq 0 and y range 1 eq 0 Determine range for Y axis then yrange range else yrange y range Or use range specified xrange x range Axis perpend to bars xticks 1 Suppress ticks in plot xtickname strarr 2 yticks 0 ytickname strarr 1 endelse if overplot eq 0 then Create new plot no data plot values nodata title title xtitle xtitle ytitle ytitle noerase overplot xrange xrange yrange yrange xticks xticks xtickname xtickname yticks yticks ytickname ytickname xstyle 1 ystyle 1 data background background _EXTRA ex if rotate then begin Horizontal bars base_win y window Window range in Y scal_fact x s Scaling factors tick_scal_fact y s Tick scaling factors endif else begin Vertical bars base_win x window Window range in X scal_fact y s Scaling factors tick_scal_fact x s Tick scaling factors endelse winrange baserange base_win 1 base_win 0 Normal window range barsize barwidth winrange nbars Normal bar width winoffset base_win 0 baroffset barsize Normal first offset bases scal_fact 0 scal_fact 1 baselines Baselines in normal coor normal scal_fact 0 scal_fact 1 values Values in normal coor barstart indgen nbars barsize barspace winrange nbars Coor at left edges tickv winoffset barstart 0 5 barsize Tick coor centered for i 0 nbars 1 do begin Draw the bars width winoffset barstart i barstart i Compute bar width barstart i barsize barstart i barsize length bases i normal i normal i bases i Compute bar length if rotate then begin Horizontal bars x length X axis is length axis y width Y axis is width axis endif else begin Vertical bars x width X axis is width axis y length Y axis is length axis endelse polyfill x y color colors i normal Polyfill with color if outline then plots x y normal Outline using p color endfor tickv tickv tick_scal_fact 0 tick_scal_fact 1 Locations of the ticks if rotate then Label the bars Y axis axis yaxis 0 ystyle 1 yticks nbars 1 ytickv tickv ytickname barnames yticklen 0 0 else Label the bars X axis axis xaxis 0 xstyle 1 xticks nbars 1 xtickv tickv xtickname barnames xticklen 0 0 return end"); a[262] = new Array("./ToBeReviewed/PLOTS/DESSINE/plt.html", "plt.pro", "", " file_comments Draw horizontal graph map with CONTOUR procedure categories Graphics param TAB1 in required The field whose we want to make the horizontal map can be: 1 an array if needed its mean along the z and t direction will be automatically performed 2 a structure respecting all criterions specified by litchamp param PARAM2 in optional default min of tab1 on ocean points Min value we want to consider in the contour s drawing Note: Could also be the type of plot that can be only xy for plt param PARAM3 in optional default max of tab1 on ocean points Max value we want to consider in the contour s drawing Note: if param2 is defined as xy then param3 is used to define the min see param2 param PARAM4 in optional default xy Type of plot can be only xy for plt Note: if param2 is defined as xy then param4 is used to define the max see param3 keyword BOXZOOM type vector Vector indicating the geographic zone on which we want to cut the map If BOXZOOM has : 1 element : The extraction is made on lon1 lon2 lat1 lat2 0 boxzoom 0 2 elements: The extraction is made on lon1 lon2 lat1 lat2 boxzoom 0 boxzoom 1 4 elements: The extraction is made on Boxzoom 0 max gdept gdepw 5 elements: The extraction is made on Boxzoom 0:3 0 Boxzoom 4 6 elements: The extraction is made on Boxzoom Where lon1 lon2 lat1 lat2 are global variables defined at the last domdef keyword REALCONT Allow to draw continents defined in IDL REALCONT can have 2 forms: REALCONT: we draw continents in place of the mask REALCONT 2 we draw continent s contour over the mask this allows to see if the mask correspond at real continents keyword CONTINTERVALLE When CONTOUR is activated it is the value between 2 isolines traced by a trait So it can be different from the one specified by INTERVALLE which in this case does not control colored isolines in color anymore If there is noone specified min we choose a contour min which goes well with the specified interval If this keyword is not specified we trace 20 isolines from the min to the max keyword CONTLABEL type integer It is an integer n When CONTOUR is activated if n is different of 0 choose the label type corresponding to n cases for the traced by a traitisolines To specify the type of label of the colored contour use LABEL keyword CONTMAX default The max of the array passed in the keyword CONTOUR on ocean points When CONTOUR is activated max value we want to consider in the isoline traced by a trait s line keyword CONTMIN default The min of the array passed in the keyword CONTOUR on ocean points When CONTOUR is activated min value we want to consider in the isoline traced by a trait s line keyword CONTNLEVEL default 20 When CONTOUR is activated it is the number of contours traced by a trait for drawing active if CONTLABEL 0 keyword CONTOUR If we want to trace contours of a different field than the one whose we have the colored drawing by example E P in color and QSR in contours It must be a field respecting same characteristics than the argument number one of plt keyword GRIDTYPE U T V W or F to specify possibly the grid on which the field is joined Comment: In this case we should use a structure like field keyword INTERVALLE Value of an interval between to isoline If there is none specified min we choose a min contour which goes well with the specified interval If this keyword is not specified we trace 20 isolines from the min to the max Comment: When CONTOUR is activated INTERVALLE only specify the interval between 2 colored isolines To specify the interval between 2 isolines traced by a trait use CONTINTERVALLE keyword INV Invert the color vector used to color the graph without use the black the white and the used palette keyword LABEL type integer It is an integer n If n different of 0 it choose the label s type corresponding to cases n cf label Comment: When CONTOUR is activated it only specify the label s type for colored isolines For these ones traced by a trait use CONTLABEL keyword MAP default Cylindrical projection We use it when we want to do a projection This keyword can be of two types: MAP P0lat P0lon Rot For the description of these 3 values see the online help of MAP_SET MAP: In this case map is automatically calculated have the value: map 0 lon1 lon2 2 0 Comment: A good way to choose the type of the projection we want to do is to have a look at IDL demo: IDL demo Then choose Mapping and Global Mapping Demo Comment2: By default it is a cylindrical projection which is done with or without the keyword map If we want an other projection MAP must be activated and we have to add the keyword: nom_projection For example for a polar projection centered on the south pole: IDL domdef 180 180 90 45 IDL plt tab stereo map 90 0 0 keyword LABMAP default labmap 1 Corresponds to LABEL keyword of MAP_SET keyword MAXIN to specify the max value we want to plot with a keyword instead of with the input parameter max If max is defined by both parameter and keyword the keyword is retained keyword MININ to specify the min value we want to plot with a keyword instead of with the input parameter min If min is defined by both parameter and keyword the keyword is retained keyword NLEVEL default 20 Number of contour to draw Active if LABEL 0 or is not specified keyword NOFILL To make just isolines with no filling keyword NOTRI To force not to use the triangulation Beware in this case the drawing only works if the grid is undeformed It means that each point of a longitude give one latitude and each point of a latitude give one longitude except if we use the keyword CELL_FILL 2 Comment: if the field contain points values f_nan then we even do a triangulation keyword OVERPLOT To make a plot over an other one Comment: Contrarily to the use of CONTOUR or VECTEUR the use of this keyword does not the caption and or the color bar keyword STRICTFILL Activate this keyword to that the filling of contours be precisely done between the min and the max specified Values inferior superior at the specified min max are not filled Note that max values a considered as missing values so cells containing one or more corners with values above max will have no contours drawn through them keyword STYLE default style 0 Contour s style to adopt to draw isolines See style for more informations keyword VECTEUR type struct It is a structure composed by 2 elements containing the 2 fields U and V of values of the zonal and meridian components of the vector of the fields to draw These fields can be an array or a structure For example: vecteur matriceu:lec unsurface matricev:lec vnsurface Comment: name of elements of vectors are inconsequential vecteur u:lec unsurface v:lec vnsurface is also appropriated keyword _EXTRA Used to pass keywords keyword CONT_NOFILL Activate it not to fill the point mask to let them transparent Comment: Nevertheless we trace mask s contour keyword USETRI To force using triangulation keyword MASKFILL keyword DUPLICATE keyword DECIMATETRI uses common history Sebastien Masson smasson lodyc jussieu fr 7 1999 Sebastien Masson 08 02 2000 checkfield and notri keyword or triangule 1 version Id: plt pro 390 2009 01 28 11:16:06Z smasson todo seb Changer param tab1 keyword REMPLI UNLABSUR UNSUR2 UNVECTSUR quelques trucs dans la routine PRO plt tab1 param2 param3 param4 REALCONT realcont CONTOUR contour INTERVALLE intervalle INV inv GRIDTYPE gridtype BOXZOOM boxzoom CONTINTERVALLE contintervalle LABEL label CONTLABEL contlabel STYLE style CONTMAX contmax CONTMIN contmin NLEVEL nlevel CONTNLEVEL contnlevel VECTEUR vecteur MAP map MININ minin MAXIN maxin NOFILL nofill CONT_NOFILL cont_nofill USETRI usetri NOTRI notri MASKFILL maskfill DUPLICATE duplicate STRICTFILL strictfill OVERPLOT overplot DECIMATETRI decimatetri LABMAP labmap _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh cm_4data IF NOT keyword_set key_forgetold THEN BEGIN updatenew updatekwd ENDIF tempsun systime 1 To key_performance I preparation of the graphic environment and small verifications I1 verification of the grid s type associated to tab1 if keyword_set gridtype then vargrid gridtype if keyword_set vecteur AND NOT keyword_set gridtype then BEGIN vargrid litchamp tab1 grid if vargrid eq then BEGIN vargrid xquestion What is the grid associated to the data to contour T chkwidget vargrid strupcase vargrid endif ENDIF I2 Reading of the field and checkup if keyword_set boxzoom AND n_elements contour ne 4 then BEGIN savedbox 1b saveboxparam boxparam4plt dat END if n_elements param2 NE 0 then type param2 if n_elements param3 NE 0 then min param3 if n_elements param4 NE 0 then max param4 if n_elements minin NE 0 then min minin if n_elements maxin NE 0 then max maxin checktypeminmax plt TYPE type MIN min MAX max _extra ex z2d checkfield tab1 plt TYPE type BOXZOOM boxzoom DIREC direc VECTEUR vecteur _extra ex if n_elements z2d EQ 1 AND z2d 0 EQ 1 then BEGIN IF keyword_set savedbox THEN restoreboxparam boxparam4plt dat return ENDIF IF n_elements usetri EQ 0 THEN BEGIN do we have holes in the triangulation holeintri n_elements triangles_list 3 LT jpi 1 keyword_set key_periodic jpj 1 2 the triangulation must be used to draw the field do we have a triangulation wehavetri triangles_list 0 NE 1 the triangulation must be used to draw the continents if we make a map are we periodic and nx jpi CASE strupcase vargrid OF T :nx nxt W :nx nxt U :nx nxu V :nx nxv F :nx nxf ENDCASE mapperio keyword_set map keyword_set key_periodic nx eq jpi usetri wehavetri wehavetri holeintri mapperio keyword_set key_irregular 2 notri ENDIF I3 reinitialization p x y Comment: We do not reinitialize when we call bck plt in loop to use contour if n_elements contour ne 4 AND NOT keyword_set overplot then reinitplt z invert I4 attribution of the mask and of longitude and latitude arrays IF strupcase vargrid EQ W THEN profond firstzw NE 0 ELSE profond firstzt NE 0 do we need to extract now the triangulation that will be used for contouring the field if keyword_set profond OR usetri EQ 0 AND vargrid EQ T OR vargrid EQ W OR usetri NE 2 AND vargrid NE T AND vargrid NE W THEN BEGIN grille mask glam gphi gdep nx ny nz firstx firsty firstz lastx lasty lastz forplt _extra ex ENDIF ELSE BEGIN grille mask glam gphi gdep nx ny nz firstx firsty firstz lastx lasty lastz TRI trifield forplt _extra ex ENDELSE I5 determination of the mi:min and of the ma:max of z2d in the same way as max: max and min: min for the drawing masknan finite z2d nan total masknan NE n_elements z2d Do we need to do an autoscale autoscale testvar var min EQ testvar var max AND NOT keyword_set intervalle determineminmax z2d mask mi ma glam gphi MININ min MAXIN max nan nan INTERVALLE intervalle usetri usetri _extra ex if n_elements z2d EQ 1 AND z2d 0 EQ 1 THEN GOTO sortie We do an autoscale if needed if autoscale then autoscale min max intervalle II We put the drawing in its place on the window or the page and possible opening of the window or of the page if n_elements contour NE 4 AND NOT keyword_set overplot THEN placedessin plt posfenetre posbar CONTOUR contour VECTEUR vecteur MAP map DIREC direc _extra ex III Covering of the drawing labels style axis III1 Choice of labels if keyword_set intervalle AND NOT keyword_set label then label 1 if keyword_set label eq 0 then cas 0 else cas label label cas min max ncontour level_z2d colnumb NLEVEL nlevel INTERVALLE intervalle strictfill strictfill III2 Choice of style if not keyword_set style then style 0 style style level_z2d linestyle thick if keyword_set inv then colnumb reverse colnumb III3 Definition of axis if NOT keyword_set overplot THEN axe xy _EXTRA ex IV Drawing extrapolation of field on lands and setup of min max values IF keyword_set nan THEN BEGIN IF NOT keyword_set nofill THEN z2d where masknan EQ 0 max ENDIF ELSE masknan 1 IF keyword_set strictfill THEN BEGIN tmp z2d ge max IF total tmp GE 1 THEN BEGIN tmp 1b byte extrapolate tmp tmp 1 x_periodic keyword_set key_periodic nx EQ jpi trifield triangule temporary tmp mask coinmonte coinmontemask coindescend coindescendmask keep_cont 0 indicezoommask lindgen jpi jpj firstx:lastx firsty:lasty ENDIF ENDIF filling the mask values we fill only masknan or we fill mask masknan IF keyword_set nan AND keyword_set cont_nofill THEN z2d remplit z2d nite 1 vargrid NE T AND vargrid NE W mask masknan _extra ex ELSE z2d remplit z2d nite 1 vargrid NE T AND vargrid NE W keyword_set nan 1 keyword_set cont_nofill 1 n_elements maskfill NE 0 mask mask masknan _extra ex IF keyword_set strictfill EQ 0 AND n_elements maskfill EQ 0 then z2d min z2d max if n_elements maskfill NE 0 then BEGIN z2d temporary z2d mask masknan if maskfill NE 0 then z2d temporary z2d maskfill 1 mask masknan ENDIF check mask and triangulation according to the grid type and NaN If we make a drawing at depth we must redefine a triangulation on the zoom because the land sea mask at depth may differ from the one at the surface As this triangulation will be used to draw the land sea mask with the good shape we use tmask to compute it even if the data are not located on the T grid if keyword_set profond OR keyword_set cont_nofill AND usetri GE 1 AND vargrid EQ T OR vargrid EQ W OR usetri EQ 2 AND vargrid NE T AND vargrid NE W then BEGIN trifield triangule tmask firstx:lastx firsty:lasty firstz coinmonte coinmontemask coindescend coindescendmask keep_cont cont_nofill _extra ex indicezoommask lindgen jpi jpj firstx:lastx firsty:lasty ENDIF triangulation for nan mask if keyword_set nan then BEGIN trinan triangule masknan keep_cont coinmonte coinmontenan coindescend coindescendnan indicezoomnan lindgen jpi jpj firstx:lastx firsty:lasty ENDIF IF n_elements twin_corners_up EQ 0 THEN coinmontemask 1 ELSE coinmontemask twin_corners_up IF n_elements twin_corners_dn EQ 0 THEN coindescendmask 1 ELSE coindescendmask twin_corners_dn if vargrid EQ T OR vargrid EQ W then BEGIN glammsk glam gphimsk gphi ENDIF ELSE begin decoupe terre: To draw the coast in a clean way we try to take additionally points to draw the land Like that we do not see gap between T and U V F grid It is what decoupeterre do We also redefine trimsk maskorg mask decoupeterre mask glammsk gphimsk type xy TRI trimsk usetri usetri indicezoom indicezoommask coinmonte coinmontemask coindescend coindescendmask _EXTRA ex ENDELSE IV1 Choice of type of drawing typetrace classique if keyword_set map AND key_onearth then BEGIN Call of mapset when we want to do projections IF n_elements map NE 3 THEN map 0 lon1 lon2 2 MOD 360 0 typetrace projection map_lat map 0 map_lon map 1 map_rot map 2 if chkstru ex TITLE then begin maptitre ex title ex title endif map_set map_lat map_lon map_rot _extra ex position posfenetre iso limit lat1 lon1 lat2 lon2 noborder if n_elements maptitre ne 0 then ex title maptitre if n_elements trifield GE 2 then trifield ciseauxtri trifield glam gphi _EXTRA ex if n_elements trimsk GE 2 then trimsk ciseauxtri trimsk glammsk gphimsk _EXTRA ex if n_elements trinan GE 2 then BEGIN trinan ciseauxtri trinan glam gphi _EXTRA ex if trinan 0 EQ 1 then undefine trinan endif ENDIF ELSE BEGIN To axes of coordinates be considerated if x type EQ 0 AND n_elements contour LE 4 then plot 0 0 nodata xstyle 5 ystyle 5 title subtitle noerase if keyword_set key_periodic then BEGIN In this case triangulation is closed in x and cover all the sphere We have to cut it at the level where we cut the sphere to make the drawing if n_elements trifield GE 2 then trifield ciseauxtri trifield glam gphi _EXTRA ex if n_elements trimsk GE 2 then trimsk ciseauxtri trimsk glammsk gphimsk _EXTRA ex if n_elements trinan GE 2 then trinan ciseauxtri trinan glam gphi _EXTRA ex ENDIF endelse IV2 Contours and coloring if keyword_set duplicate then BEGIN pour marina uniquement ATTENTION C EST TRES MAL CODE lon glam 0 decalage max lon min lon lon shift lon 1 n_elements lon 1 x range 1 x range 1 duplicate 1 decalage for i 1 duplicate 1 do BEGIN z2d z2d z2d gphi gphi gphi mask mask mask gphimsk gphimsk gphimsk glam glam glam i decalage glammsk glammsk glammsk ENDFOR endif save glam gphi trifield file tri dat if keyword_set decimatetri then BEGIN tempsdeux systime 1 To key_performance IF n_elements trimsk EQ 0 THEN trimsk trifield Verts transpose temporary glam temporary gphi temporary z2d Conn replicate 3 1 n_elements trifield 3 trifield Result mesh_decimate temporary verts temporary Conn connout vertices Vertsout percent_vertices decimatetri connout reform connout 4 n_elements connout 4 over trifield temporary connout 1:3 glam reform Vertsout 0 gphi reform Vertsout 1 z2d reform Vertsout 2 undefine Vertsout print temps decimatetri systime 1 tempsdeux ENDIF pltbase z2d glam gphi mask glammsk gphimsk trichamp trifield trimsk trimsk forplt level_z2d colnumb contour contour usetri usetri realcont realcont overplot keyword_set overplot keyword_set map c_linestyle linestyle c_labels 1 indgen n_elements level_z2d MOD 2 c_thick thick nofill nofill cont_nofill cont_nofill nan nan coinmontemask coinmontemask coindescendmask coindescendmask coinmontenan coinmontenan coindescendnan coindescendnan indicezoommask indicezoommask indicezoomnan indicezoomnan maskorg maskorg masknan masknan trinan trinan _extra ex IV3 Recall of plt in loop when contour is activated if n_elements contour eq 4 then BEGIN c est la 2eme fois que je passe ds pltt contour mietma: mi ma unit:varunit inter:intervalle je renvoie le min le max et l unite return endif if keyword_set contour THEN BEGIN pourlegende 1 1 1 1 oldattributs saveatt oldcolnumb colnumb plt contour contmin contmax CONTOUR pourlegende NOERASE USETRI usetri CONT_NOFILL cont_nofill INTERVALLE contintervalle LABEL contlabel STYLE style NLEVEL contnlevel DUPLICATE duplicate STRICTFILL strictfill MASKFILL maskfill _extra ex restoreatt oldattributs colnumb oldcolnumb ENDIF V Small functions V1 Possible add of vectors in double exposure if keyword_set vecteur then BEGIN oldattributs saveatt ajoutvect vecteur vectlegende _extra ex restoreatt oldattributs ENDIF if keyword_set overplot then GOTO fini V2 Trace the line of change of date the equator and the greenwich meridian if NOT keyword_set map AND key_onearth then meridienparallele xy V3 To trace IDL s continents if keyword_set realcont then BEGIN si noease est passe de _extra on s assure qu il est a 1 if chkstru ex NOERASE then begin oldnoerase ex noerase ex noerase 1 ENDIF if chkstru ex coast_thick then mlinethick ex coast_thick ELSE mlinethick 1 if chkstru ex coast_color then mcolor ex coast_color ELSE mcolor 0 IF NOT keyword_set map THEN map_set 0 lon1 lon2 2 MOD 360 0 position posfenetre limit lat1 lon1 lat2 lon2 NOERASE noborder color 0 _extra ex if realcont NE 2 AND NOT keyword_set cont_nofill then BEGIN if chkstru ex cont_color then cntcol ex coast_color ELSE cntcol d n_colors 1 255 map_continents fill_continents color cntcol _extra ex noerase ENDIF map_continents continents color mcolor MLINETHICK mlinethick noerase _extra ex if chkstru ex NOERASE THEN ex noerase oldnoerase ENDIF V4 caption display of these legende mi ma xy CONTOUR pourlegende VECTLEGENDE vectlegende INTERVALLE intervalle DIREC direc _EXTRA ex if n_elements ex NE 0 then BEGIN To keep frame s axes in black if where tag_names ex EQ COLOR 0 NE 1 then ex COLOR coast_color endif case typetrace of classique : plot 0 0 nodata noerase color 0 xstyle 1 ystyle 1 _extra ex projection : BEGIN if chkstru ex NOERASE then begin oldnoerase ex noerase ex noerase 1 endif if chkstru ex SUBTITLE then p subtitle ex SUBTITLE if n_elements maptitre ne 0 then ex title maptitre map_set map_lat map_lon map_rot _extra ex iso limit lat1 lon1 lat2 lon2 NOERASE noborder title p title color 0 map_proj_info numproj current map_proj_info numproj name nomproj if nomproj EQ Mercator OR nomproj EQ Cylindrical OR nomproj EQ LambertConic OR nomproj EQ Gnomic OR nomproj EQ AlbersEqualAreaConic OR nomproj EQ TransverseMercator OR nomproj EQ MillerCylindrical OR nomproj EQ LambertConicEllipsoid then map_grid box_axes 1 latdel 10 londel 10 ELSE map_grid charsize 0 75 label latalign 1 lonalign 1 latdel 10 londel 30 IF n_elements labmap EQ 0 THEN labmap 1 map_grid charsize 0 75 label labmap latalign 1 lonalign 1 latdel 10 londel 30 color 0 _extra ex if chkstru ex NOERASE THEN ex noerase oldnoerase end endcase V5 Colorbar colnumb colnumb 0:ncontour 1 keyword_set strictfill barrecouleur colnumb min max ncontour keyword_set strictfill 2 position posbar _extra ex VI Possible print fini: terminedessin _extra ex sortie: if keyword_set savedbox THEN restoreboxparam boxparam4plt dat if keyword_set key_performance NE 0 THEN print temps plt systime 1 tempsun return end"); a[263] = new Array("./ToBeReviewed/PLOTS/DESSINE/plt1d.html", "plt1d.pro", "", " file_comments Trace 1d graphs: x y z or t but in this case we recall directly pltt categories Graphics param TAB in required The field whose we want to make the hovmoeller map can be 2 kind of thing: 1 An array which can be: 2d 3d or 4d: array xy xyz xyt or xyzt In this case the array will pass in moyenne or grossemoyenne to be averaged and become an array 1d 1d:Nevertheless the type must be specified in order to we know which trace it is about To have a correct caption respecify the extraction zone via BOXZOOM 2 a structure respecting all criterions specified by litchamp The array contained in the structure respecting criterions of case 1 param PARAM2 in required Min value we want to consider in the contour s drawing Note: could also be the type of plot: x y z param PARAM3 in optional default min max of tab on ocean points Max value we want to consider in the contour s drawing Note: if param2 is defined as x y z then param3 is used to define the min see param2 param PARAM4 in optional default max of tab on ocean points Type of plot can be only x y z for plt1d Note: if param2 is defined as xy then param4 is used to define the max see param3 keyword BOXZOOM Vector indicating the geographic zone 3d on which the extraction of the field must be done to do the hovmoeller If BOXZOOM has : 1 element : The extraction is made on lon1 lon2 lat1 lat2 0 boxzoom 0 2 elements: The extraction is made on lon1 lon2 lat1 lat2 boxzoom 0 boxzoom 1 4 elements: The extraction is made on Boxzoom vert1 vert2 5 elements: The extraction is made on Boxzoom 0:3 0 Boxzoom 4 6 elements: The extraction is made on Boxzoom Where lon1 lon2 lat1 lat2 vert1 vert2 are global variables defined at the last domdef keyword COL1D OBSOLETE Color number when we make a trace 1d by default 0 It is better to use the keyword COLOR used by plot keyword ENDPOINTS keyword specifying that we want to make a vertical cut in diagonal Then coordinated of extremities of these ones are defined by the 4 elements of the vector ENDPOINTS: x1 y1 x2 y2 which are coordinates keyword MAXIN Allows to specify the max value we want to consider in the drawing of contour helping by the keyword instead of the argument max If the argument and the keyword are specified in the same time it is the value specified by the keyword which is retained keyword MININ Allows to specify the min value we want to consider in the drawing of contour helping by the keyword instead of the argument min If the argument and the keyword are specified in the same time it is the value specified by the keyword which is retained keyword OV1D Allow the double exposure of an 1d curve to a precedent 1d trace keyword REVERSE_X To invert the x axis so as the drawing keyword REVERSE_Y To invert the y axis so as the drawing keyword SIN Activate this keyword if we want the x axis to be traced in sinus of the latitude when we make a drawing f y keyword STY1D OBSOLETE Number of the style used when we make a 1d drawing We should better use the keyword LINESTYLE which is tho one of the plot Beware this keyword is still useful if we want to d bars instead of curves put sty1d bar keyword TYPEIN allows to specify the type of hovmoeller we want to do xt yt zt t with help of a keyword rather than the argument type If the argument and the keyword are specified in the same time it is the value specified by the keyword which is retained keyword _EXTRA Used to pass keywords history creation 24 6 99 Eric Guilyardi a partir routine pltt de Sebastien Masson 8 7 1999 Sebastien Masson smasson lodyc jussieu fr inspection des travaux finis 8 2 2000 Sebastien Masson: checkfield version Id: plt1d pro 378 2008 08 12 12:35:46Z pinsard PRO plt1d tab param2 param3 param4 BOXZOOM boxzoom SIN sin MININ minin MAXIN maxin TYPEIN typein ENDPOINTS endpoints COL1D col1d STY1D sty1d OV1D ov1d X x Y y Z z TT tt REVERSE_X reverse_x REVERSE_Y reverse_y SWITCHXY switchxy _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh cm_4data IF NOT keyword_set key_forgetold THEN BEGIN updatenew updatekwd ENDIF tempsun systime 1 pour key_performance 1st part: initialization small calculations verification of the type s value if n_elements param2 NE 0 then type param2 if n_elements param3 NE 0 then min param3 if n_elements param4 NE 0 then max param4 if n_elements minin NE 0 then min minin if n_elements maxin NE 0 then max maxin if keyword_set tt then typein t if keyword_set typein then BEGIN if size type type NE 7 AND size type type NE 0 then begin if n_elements min NE 0 then max min min type endif type typein endif checktypeminmax plt1d TYPE type MIN min MAX max ENDPOINTS endpoints XX keyword_set x YY keyword_set y ZZ keyword_set z if type EQ t then BEGIN pltt tab type min max BOXZOOM boxzoom SIN sin TYPEIN typein COL1D col1d STY1D sty1d OV1D ov1d ENDPOINTS endpoints _extra ex return endif I2 reinitialization p x y Comment: We do not reinitialize when we call back plt1d if NOT keyword_set ov1d then reinitplt I1 Reading of the field if keyword_set boxzoom OR keyword_set endpoints THEN BEGIN savedbox 1b saveboxparam boxparam4plt1d dat ENDIF if keyword_set endpoints then begin section tab z1d glam gphi ENDPOINTS endpoints TYPE type BOXZOOM boxzoom DIREC direc nx n_elements glam ny nx if strupcase vargrid EQ W then begin z gdepw firstzw:lastzw nz nzw ENDIF ELSE BEGIN z gdept firstzt:lastzt nz nzt ENDELSE ENDIF ELSE BEGIN z1d checkfield tab plt1d TYPE type BOXZOOM boxzoom direc direc _extra ex grille mask glam gphi gdep nx ny nz type type ENDELSE if n_elements z2d EQ 1 AND z1d 0 EQ 1 then BEGIN IF keyword_set savedbox THEN restoreboxparam boxparam4plt1d dat return endif We build the mask For this the array must be hidden Automatically done at valmask value if we pass in moyenne or grossemoyenne mask fltarr n_elements z1d if n_elements valmask EQ 0 then valmask 1e20 nan total finite z1d nan 1 if keyword_set nan then begin notanum where finite z1d EQ 0 z1d notanum 0 mask where z1d LT valmask 10 1 z1d notanum values f_nan ENDIF ELSE mask where z1d LT valmask 10 1 determination of the min and of the max after the average nan total finite z1d nan 1 determineminmax z1d mask mi ma MININ min MAXIN max nan nan INTERVALLE intervalle _extra ex if n_elements z2d EQ 1 AND z1d 0 EQ 1 THEN return if NOT keyword_set ov1d THEN placedessin autre posfenetre posbar contour contour DIREC direc endpoints endpoints _extra ex 2nd part: Drawing definition of the abscisse and ordinate vectors The triangulation is defined in order to the drawing be done from the left bottom to the right up So the matrix have to be shown like this from which some transpose and reverse case type of y : begin yy z1d IF size gphi 0 EQ 1 then xx gphi ELSE BEGIN IF keyword_set key_irregular THEN BEGIN cln where gphi EQ max gphi 0 xx reform gphi cln MOD nx ENDIF ELSE xx reform gphi 0 ENDELSE if keyword_set sin then xx sin pi 180 xx min0 lat1 max0 lat2 END x :begin yy z1d xx glam 0 min0 lon1 max0 lon2 END z :begin yy reverse gdep 1 xx reverse z1d 1 min0 0 max0 0 case n_elements boxzoom of 0: y range vert1 vert2 1: y range 0 boxzoom 2: y range boxzoom 4: y range vert1 vert2 5: y range 0 boxzoom 4 6: y range boxzoom 4:5 endcase if NOT keyword_set ov1d then y range reverse y range END ENDCASE definition of axes if keyword_set integrationtps then axe type time 0 time jpt 1 SIN sin _extra ex ELSE axe type SIN sin if NOT keyword_set ov1d then axe type SIN sin drawing if type EQ z then begin idx where xx NE valmask if NOT keyword_set ov1d then BEGIN if min EQ mi then x range min abs max min 5 max abs max min 5 ELSE x range min max ENDIF ENDIF ELSE BEGIN idx where yy NE valmask if NOT keyword_set ov1d then BEGIN if min EQ mi then y range min abs max min 5 max abs max min 5 ELSE y range min max ENDIF ENDELSE if NOT keyword_set ov1d then BEGIN legende mi ma type CONTOUR contour DIREC direc ENDPOINTS endpoints _EXTRA ex ENDIF IF keyword_set switchxy THEN BEGIN tmp xx xx yy yy temporary tmp if NOT keyword_set ov1d then BEGIN tmp x x y y temporary tmp ENDIF ENDIF if NOT keyword_set ov1d then BEGIN if keyword_set reverse_x then x range reverse x range if keyword_set reverse_y then y range reverse y range ENDIF xx xx idx yy yy idx if not keyword_set col1d then col1d 0 if keyword_set sty1d then BEGIN If we want to make bars IF strlowcase strtrim sty1d EQ bar then begin y range y range 0 y range 1 y range 0 05 y range 1 bar_plot yy background d n_colors 1 255 baselines replicate y range 0 n_elements yy barnames colors replicate col1d n_elements yy outline if n_elements ex NE 0 then BEGIN To have a black frame if where tag_names ex EQ COLOR 0 NE 1 then ex COLOR 0 ENDIF plot 0 0 noerase nodata _extra ex GOTO fini ENDIF ENDIF if NOT keyword_set ov1d then BEGIN plot xx yy color col1d linestyle sty1d thick 2 title subtitle _extra ex if n_elements ex NE 0 then BEGIN To have a 0 colored frame and trace a line at y 0 if where tag_names ex EQ COLOR 0 NE 1 then ex COLOR 0 if where tag_names ex EQ LINESTYLE 0 NE 1 then ex LINESTYLE 0 if where tag_names ex EQ THICK 0 NE 1 then ex THICK 0 ENDIF plot x range 0 0 noerase nodata xstyle 1 4 keyword_set endpoints AND type EQ x AND lat1 NE lat2 OR type EQ y AND lon1 NE lon2 ystyle 1 _extra ex Add of an axis in the case where we use endpoints if keyword_set endpoints then addaxe endpoints type posfenetre _EXTRA ex Trace a line at x 0 plot 0 0 y range noerase nodata title subtitle _extra ex ENDIF ELSE oplot xx yy color col1d linestyle sty1d thick 2 _extra ex 3rd part: Possible print fini: terminedessin _extra ex if keyword_set savedbox THEN restoreboxparam boxparam4plt1d dat if n_elements key_performance NE 0 then IF key_performance EQ 1 THEN print temps plt1d systime 1 tempsun return end"); a[264] = new Array("./ToBeReviewed/PLOTS/DESSINE/pltbase.html", "pltbase.pro", "", " file_comments Overlayer contour to trace a field which can be mask Elementary brick of plt pltz and pltt categories Graphics param Z2D in required The table to trace param X in required Axis Vector or array of the same size that z2d This is the coordinate of z2d on x param Y in required Axis Vector or array of the same size that z2d This is the coordinate of z2d on y param MASK in required type array It is the array who mask z2d with 0s on points we want to mask and 1s on others If z2d is not masked put this argument equal to 1 param XM in required Axis of the mask Vector or array of the same size that mask This is the coordinate of mask on x param YM in required Axis of the mask Vector or array of the same size that mask This is the coordinate of mask on y param LEVELS in optional type vector Vectors which contain levels needed at the contour If it is not given we take 20 levels between the min and the max param COLORS in optional type vector Vectors which contain colors needed at the contour If it is not given we take 20 levels between the min and the max keyword COLORTRICHAMP The color we want to use to draw the triangulation which is used to make contours of the field keyword COLORTRIMASK The color we want to use to draw the triangulation which is used to make contours of the mask keyword COLOR_C To draw the contour in color instead of in black with filling in color keyword CONT_NOFILL Activate it not to fill the point mask to let them transparent Comment: Nevertheless we trace mask s contour keyword CONT_COLOR default d n_colors 1 white The color of the continent keyword DESSTRICHAMP To draw the triangulation which is used to make field s contours keyword DESSTRIMASK To draw the triangulation which is used to make mask s contours keyword FORPLT To activate if we want that the drawing of coast be realized by tracecote rather than tracemask keyword I_COLORS type vector It is a vector specifying the colors to use to trace contours It is the same thing that c_colors which act on contours keyword MORE default 10 Number to give to avoid style s bugs: Out of range subscript encountered: Execution halted at: PLTBASE 151 If the bug still exist increase the value of more The explanation and the justification of this method do not have scientific bases yet keyword NOFILL To make just isolines with no filling keyword NOCONTOUR To make just colors keyword UNSUR2 To trace one isoline on two keyword UNLABSUR type integer I specify we only label one contour on two keyword CONTOUR To be used since plt pltz or pltt Have a look on these routines keyword _EXTRA Used to pass keywords uses common restrictions In the case of z2d x and y are arrays of same size we have to put them as vectors: z2d x y history Sebastien Masson smasson lodyc jussieu fr 8 2 2000 check if the tri array is not equal to 1 allow contour without using a triangulation version Id: pltbase pro 390 2009 01 28 11:16:06Z smasson todo seb L 172 173 PRO pltbase z2d x y mask xm ym levels colors UNSUR2 unsur2 CONTOUR contour NOCONTOUR nocontour NOFILL nofill TRICHAMP trichamp TRIMSK trimsk REALCONT realcont NAN nan USETRI usetri COLORTRICHAMP colortrichamp COLORTRIMASK colortrimask COLORTRINAN colortrinan COLORPOINTS colorpoints DRAWPOINTS drawpoints TH_TRICHAMP th_trichamp TH_TRIMASK th_trimask DESSTRICHAMP desstrichamp DESSTRIMASK desstrimask DESSTRINAN desstrinan COLOR_C color_c I_COLORS i_colors CONT_COLOR CONT_COLOR CONT_NOFILL cont_nofill UNLABSUR unlabsur COINMONTEMASK coinmontemask COINDESCENDMASK coindescendmask COINMONTENAN coinmontenan COINDESCENDNAN coindescendnan INDICEZOOMMASK indicezoommask INDICEZOOMNAN indicezoomnan MASKORG maskorg MASKNAN masknan TRINAN trinan FORPLT forplt REALSECTION realsection MORE more EXCHANGE_XY exchange_xy _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh IF NOT keyword_set key_forgetold THEN BEGIN updatenew updatekwd ENDIF Explanation concerning contour This keyword is activated when we trace a colored contour different from the one with black trait If it is activated case n_elements contour NE 0 we pass 2 time in pltbase: 1 We trace colors then we leave it is the case: n_elements contour NE 0 AND n_elements contour NE 4 2 We trace contours in traits then continents it is the case: n_elements contour NE 0 AND n_elements contour EQ 4 tempsun systime 1 To key_performance if n_elements mask EQ 0 then mask 1b if n_elements masknan EQ 0 then masknan 1b IF total mask EQ n_elements z2d THEN mask 1b If levels and colors aren t given if n_params EQ 4 then label 0 min z2d mask max z2d mask ncontour levels colors attention bidouille inexplicable pour que tout se passe bien avec les postcript ds pltz if n_elements contour LE 4 AND x type EQ 0 THEN plot 0 0 xstyle 5 ystyle 5 nodata noerase title subtitle Is cell_fill is a part of _extra we desactive it if it is nt equal to 2 IF chkstru ex CELL_FILL THEN BEGIN cell_fill ex CELL_FILL if ex CELL_FILL NE 2 then ex CELL_FILL 0 ENDIF ELSE cell_fill 0 I Filling contours with colors if NOT keyword_set more then more 10 if NOT keyword_set nofill AND NOT keyword_set color_c then begin if n_elements contour NE 4 THEN BEGIN if usetri EQ 2 then BEGIN IF size x n_dimensions EQ 1 THEN x x replicate 1 size z2d 2 IF size y n_dimensions EQ 1 THEN y replicate 1 size z2d 1 y contour z2d fltarr more x fltarr more y fltarr more levels levels c_color colors noerase fill TRIANGULATION trichamp _extra ex ENDIF ELSE BEGIN IF size x n_dimensions EQ 2 THEN x x 0 IF size y n_dimensions EQ 2 THEN y reform y 0 contour z2d x y levels levels c_color colors noerase fill _extra ex ENDELSE ENDIF ENDIF if n_elements contour NE 0 AND n_elements contour NE 4 THEN GOTO fini IF chkstru ex C_ORIENTATION THEN ex extractstru ex C_ORIENTATION IF chkstru ex C_SPACING THEN ex extractstru ex C_SPACING IF chkstru ex C_COLORS THEN ex extractstru ex C_COLORS II Drawing contours with lines if n_elements contour EQ 4 OR n_elements contour EQ 0 THEN BEGIN we put the masked values to NaN IF n_elements mask GT 1 OR n_elements masknan GT 1 AND NOT keyword_set cont_nofill THEN BEGIN IF keyword_set maskorg THEN tonan maskorg masknan ELSE tonan mask masknan tonan where remplit tonan nite 1 mask tonan basique fillval 0 fillxdir keyword_set realsection EQ 0 count IF count NE 0 THEN z2d temporary tonan values f_nan ENDIF We do not pass if we have to make differents contours In the case of unsur2 is activated we reduce levels if NOT keyword_set nocontour then begin IF keyword_set unsur2 THEN levels levels where zeroun n_elements levels eq 1 Is unlabsur activated Does C_LABEL passed via _EXTRA if keyword_set unlabsur THEN IF chkstru ex C_LABELS THEN ex C_LABELS 1 indgen n_elements ex C_LABELS MOD unlabsur 1 Not to fill when cell_fill is imposed IF chkstru ex CELL_FILL THEN ex CELL_FILL 0 CASE 1 OF keyword_set color_c :c_colors colors keyword_set i_colors :c_colors i_colors ELSE: ENDCASE IF usetri EQ 2 THEN BEGIN IF size x n_dimensions EQ 1 THEN x x replicate 1 size z2d 2 IF size y n_dimensions EQ 1 THEN y replicate 1 size z2d 1 y contour z2d fltarr more x fltarr more y fltarr more levels levels overplot 1 keyword_set nofill noerase keyword_set nofill c_colors c_colors TRIANGULATION trichamp _extra ex ENDIF ELSE BEGIN IF size x n_dimensions EQ 2 THEN x x 0 IF size y n_dimensions EQ 2 THEN y reform y 0 contour z2d x y levels levels overplot 1 keyword_set nofill noerase keyword_set nofill c_colors c_colors _extra ex ENDELSE ENDIF III Filling continents with color IF chkstru ex CELL_FILL THEN ex CELL_FILL cell_fill 1 IF chkstru ex LEVELS THEN ex extractstru ex LEVELS IF chkstru ex NODATA THEN ex extractstru ex NODATA IF NOT keyword_set cont_color THEN cont_color d n_colors 1 255 If there is points at NaN We trace points in white at NaN before drawing coasts with a trait if keyword_set trinan AND NOT keyword_set nofill THEN BEGIN IF size x n_dimensions EQ 1 THEN x x replicate 1 size masknan 2 IF size y n_dimensions EQ 1 THEN y replicate 1 size masknan 1 y contour 1b masknan fltarr more x fltarr more y fltarr more levels 0 5 overplot fill c_colors cont_color TRIANGULATION trinan _extra ex IF keyword_set forplt THEN completecointerre COINMONTE coinmontenan COINDESCEND coindescendnan INDICEZOOM indicezoomnan CONT_COLOR cont_color _EXTRA ex ELSE fillcornermask x 0 y 0 COINMONTE coinmontenan COINDESCEND coindescendnan CONT_COLOR cont_color _extra ex ENDIF Filling continents if keyword_set realcont then if realcont EQ 1 then mask 1b if n_elements mask NE 1 then BEGIN If mask 1 we gap it if NOT keyword_set cont_nofill then BEGIN mask filling case 1 of keyword_set realsection :drawsectionbottom mask xm ym CONT_NOFILL cont_nofill CONT_COLOR cont_color _EXTRA ex usetri GE 1:BEGIN if n_elements trimsk eq 0 then trimsk trichamp IF size xm N_DIMENSIONS EQ 1 THEN xm xm replicate 1 size mask 2 IF size ym N_DIMENSIONS EQ 1 THEN ym replicate 1 size mask 1 ym contour 1b mask fltarr more xm fltarr more ym fltarr more LEVELS 0 5 OVERPLOT FILL C_COLORS cont_color TRIANGULATION trimsk _extra ex IF keyword_set forplt THEN completecointerre COINMONTE coinmontemask COINDESCEND coindescendmask INDICEZOOM indicezoommask CONT_COLOR cont_color _EXTRA ex ELSE fillcornermask xm 0 ym 0 COINMONTE coinmontemask COINDESCEND coindescendmask CONT_COLOR cont_color _extra ex END ELSE:BEGIN IF size xm n_dimensions EQ 2 THEN xm xm 0 IF size ym n_dimensions EQ 2 THEN ym reform ym 0 contour 1b mask xm ym LEVELS 0 5 OVERPLOT FILL C_COLORS cont_color _EXTRA ex END ENDCASE ENDIF NOT keyword_set cont_nofill IV Trace coast with line case 1 of keyword_set realsection AND NOT keyword_set cont_nofill : keyword_set realsection AND keyword_set cont_nofill : drawsectionbottom mask xm ym CONT_NOFILL cont_nofill _extra ex keyword_set forplt AND map projection GT 0 OR key_irregular OR keyword_set nan :tracecote _extra ex ELSE:tracemask mask xm ym _extra ex endcase ENDIF n_elements mask NE 1 ENDIF draw the triangulations if keyword_set desstrichamp then dessinetri trichamp x y color colortrichamp thick th_trichamp if keyword_set desstrimask then dessinetri trimsk xm ym color colortrimask thick th_trimask if keyword_set desstrinan then dessinetri trinan x y color colortrinan if keyword_set drawpoints then tracegrille x y color colorpoints fini: IF keyword_set key_performance THEN print temps pltbase systime 1 tempsun return end"); a[265] = new Array("./ToBeReviewed/PLOTS/DESSINE/pltsc.html", "pltsc.pro", "", " file_comments categories param TAB1 param TAB2 param MIN1 param MAX1 param MIN2 param MAX2 param VARNAME2 keyword BOXZOOM Vector indicating the geographic zone on which we want to cut the map If BOXZOOM has : 1 element : The extraction is made on lon1 lon2 lat1 lat2 0 boxzoom 0 2 elements: The extraction is made on lon1 lon2 lat1 lat2 boxzoom 0 boxzoom 1 4 elements: The extraction is made on Boxzoom 0 max gdept gdepw 5 elements: The extraction is made on Boxzoom 0:3 0 Boxzoom 4 6 elements: The extraction is made on Boxzoom keyword COL1D keyword STY1D keyword OV1D keyword _EXTRA Used to pass keywords returns uses restrictions examples history version Id: pltsc pro 327 2007 12 13 16:22:35Z pinsard todo seb PRO pltsc tab1 tab2 min1 max1 min2 max2 varname2 BOXZOOM boxzoom COL1D col1d STY1D sty1d OV1D ov1d _EXTRA ex scatter plot inspired from plt1d compile_opt idl2 strictarrsubs cm_4mesh cm_4data IF NOT keyword_set key_forgetold THEN BEGIN updatenew updatekwd ENDIF Comment: We do not reinitialize when we call back pltsc if NOT keyword_set ov1d then reinitplt reduce data xyzt domain if keyword_set boxzoom then BEGIN Case 1 Of N_Elements Boxzoom Eq 1:bte lon1 lon2 lat1 lat2 0 boxzoom 0 N_Elements Boxzoom Eq 2:bte lon1 lon2 lat1 lat2 boxzoom 0 boxzoom 1 N_Elements Boxzoom Eq 4:bte Boxzoom vert1 vert2 N_Elements Boxzoom Eq 5:bte Boxzoom 0:3 0 Boxzoom 4 N_Elements Boxzoom Eq 6:bte Boxzoom Else: Begin ras report Wrong Definition of Boxzoom return End endcase savedbox 1b saveboxparam boxparam4pltsc dat domdef bte GRIDTYPE vargrid ENDIF extract indexes to plot indexm where tab1 LE valmask 10 tab1 tab1 indexm tab2 tab2 indexm npts size indexm 1 deal with min and max of plot IF finite min1 EQ 0 THEN min1 min tab1 IF finite max1 EQ 0 THEN max1 max tab1 IF finite min2 EQ 0 THEN min2 min tab2 IF finite max2 EQ 0 THEN max2 max tab2 init plot if not overlay IF NOT keyword_set ov1d THEN placedessin yfx posfenetre posbar contour contour _extra ex yy tab1 xx tab2 axis range x range min2 abs max2 min2 5 max2 abs max2 min2 5 y range min1 abs max1 min1 5 max1 abs max1 min1 5 IF NOT keyword_set sty1d THEN sty1d 0 IF NOT keyword_set col1d THEN col1d 0 IF NOT keyword_set ov1d THEN BEGIN legende min1 max1 yfx VARNAME2 varname2 NPTS npts _EXTRA ex plot xx yy background 255 psym sty1d 1 color col1d thick 2 title subtitle _extra ex if n_elements ex NE 0 then BEGIN To have a 0 colored frame and trace a line at y 0 if where tag_names ex EQ COLOR 0 NE 1 then ex COLOR 0 if where tag_names ex EQ LINESTYLE 0 NE 1 then ex LINESTYLE 0 ENDIF plot x range 0 0 noerase nodata xstyle 1 ystyle 1 _extra ex trace a line at x 0 plot 0 0 y range noerase nodata title subtitle _extra ex ENDIF ELSE oplot xx yy color col1d linestyle sty1d thick 2 _extra ex 3rd part: Possible print fini: terminedessin _extra ex if keyword_set savedbox THEN restoreboxparam boxparam4pltsc dat if n_elements key_performance NE 0 then IF key_performance EQ 1 THEN print temps plt1d systime 1 tempsun return end"); a[266] = new Array("./ToBeReviewed/PLOTS/DESSINE/pltt.html", "pltt.pro", "", " file_comments Trace hovmoeller graphs: xt yt zt t categories Graphics param TAB in required The field whose we want to make the hovmoeller map can be 2 kind of thing: 1 An array which can be: 3d or 4d: array xt yt zt t The last component is the time In this case the array will pass in grossemoyenne to be averaged and become an 1d or 2d array 2d: If the array is already 2d it is not modified beware lands must be masked at the value valmask and nevertheless type must be specified to we know of which trace it is about To have a correct caption respecify the extraction zone via BOXZOOM 1d: only for traces of the t type Nevertheless type must be specified to we know of which trace it is about To have a correct caption respecify the extraction zone via BOXZOOM 2 a structure respecting all criterions specified by litchamp The array contained in the structure respecting criterions of case 1 param GIVENTYPE param GIVENMIN valeur minimum que l on veut prendre en compte dans le trace des contours Par defaut on prend le min de tableau sur les pts mer param GIVENMAX valeur maximum que l on veut prendre en compte dans le trace des contours Par defaut on prend le max de tableau sur les pts mer param DATMIN c est la borne inf de l axe temporel c est un longinteger de la forme yyyymmdd ou bien yymmdd param DATMAX c est la borne max de l axe temporel c est un longinteger de la forme yyyymmdd ou bien yymmdd keyword BOXZOOM Vector indicating the geographic zone 3d on which the extraction of the field must be done to do the hovmoeller If BOXZOOM has : 1 element : The extraction is made on lon1 lon2 lat1 lat2 0 boxzoom 0 2 elements: The extraction is made on lon1 lon2 lat1 lat2 boxzoom 0 boxzoom 1 4 elements: The extraction is made on Boxzoom vert1 vert2 5 elements: The extraction is made on Boxzoom 0:3 0 Boxzoom 4 6 elements: The extraction is made on Boxzoom Where lon1 lon2 lat1 lat2 vert1 vert2 are global variables defined at the last domdef keyword CONTINTERVALLE When CONTOUR is activated it is the value between 2 isolines traced by a trait So it can be different from the one specified by INTERVALLE which in this case does not control colored isolines in color anymore If there is noone specified min we choose a contour min which goes well with the specified interval If this keyword is not specified we trace 20 isolines from the min to the max keyword CONTLABEL type integer When CONTOUR is activated if n is different of 0 choose the label type corresponding to n cases for the traced by a traitisolines To specify the type of label of the colored contour use LABEL keyword CONTMAX default we take the max of the array passed in the keyword CONTOUR on ocean points When CONTOUR is activated max value we want to consider in the isoline traced by a trait s line keyword CONTMIN default we take the min of the array passed in the keyword CONTOUR on ocean points When CONTOUR is activated min value we want to consider in the isoline traced by a trait s line keyword CONTNLEVEL default 20 When CONTOUR is activated it is the number of contours traced by a trait for drawing active if CONTLABEL 0 keyword CONTOUR If we want to trace contours of a different field than the one whose we have the colored drawing by example E P in color and QSR in contours It must be a field respecting same characteristics than the argument number one of pltt keyword ENDPOINTS keyword specifying that we want to make a vertical cut in diagonal Then coordinated of extremities of these ones are defined by the 4 elements of the vector ENDPOINTS: x1 y1 x2 y2 which are coordinates keyword EXCHANGE_XY Allows to invert axes keyword FILTER Apply a slippery average of width FILTER keyword INTERVALLE Value of an interval between two isolines If there is none specified min we choose a min contour which goes well with the specified interval If this keyword is not specified we trace 20 isoline from the min to the max Comment: When CONTOUR is activated INTERVALLE only specify the interval between 2 colored isolines To specify the interval between 2 isolines traced by a trait use CONTINTERVALLE keyword INV Invert the color vector used to color the graph without use the black the white and the used palette keyword LABEL type integer If n different of 0 it choose the label s type corresponding to cases n cf label Comment: When CONTOUR is activated it only specify the label s type for colored isolines For these ones traced by a trait use CONTLABEL keyword COL1d OBSOLETE Color number when we make a trace 1d by default 0 It is better to use the keyword COLOR used by plot keyword MAXIN to specify the max value we want to plot with a keyword instead of with the input parameter max If max is defined by both parameter and keyword the keyword is retained keyword MININ to specify the min value we want to plot with a keyword instead of with the input parameter min If min is defined by both parameter and keyword the keyword is retained keyword NLEVEL default 20 Number of contours to draw active if LABEL 0 or is not specified keyword NOFILL To make just isolines with no filling keyword CONTNLEVEL default 20 When CONTOUR is activated it is the number of contours traced by a trait for drawing active if CONTLABEL 0 keyword OV1D Allows to overprint a 1d curve over a precedent 1d drawing keyword OVERPLOT To make a plot over an other one Comment: Contrarily to the use of CONTOUR or VECTEUR the use of this keyword does not the caption and or the color bar keyword STRICTFILL Activate this keyword to that the filling of contours be precisely done between the min and the max specified Values inferior superior at the specified min max are not filled Note that max values a considered as missing values so cells containing one or more corners with values above max will have no contours drawn through them keyword STYLE default style 0 Contour s style to adopt to draw isolines See style for more informations keyword STY1D OBSOLETE Number of the style used when we make a 1d drawing We should better use the keyword LINESTYLE which is tho one of the plot Beware this keyword is still useful if we want to d bars instead of curves put sty1d bar keyword TREND_TYPE Modify field by calling trends keyword TYPEIN allows to specify the type of hovmoeller we want to do xt yt zt t with help of a keyword rather than the argument type If the argument and the keyword are specified in the same time it is the value specified by the keyword which is retained keyword _EXTRA Used to pass keywords uses common history Sebastien Masson smasson lodyc jussieu fr 27 5 98 Jerome Vialard adapting plt to hovmoeller drawing 2 7 98 Sebastien Masson 14 8 98 continents barres 15 1 98 Adaptation for arrays 3 and 4d to the average be done in pltt rather than during the reading Sebastien Masson 14 8 98 7 1999 Eric Guilyardi 29 7 99 FILTER TREND_TYPE REPEAT_C Sebastien Masson 08 02 2000 checkfield and usetri keyword version Id: pltt pro 378 2008 08 12 12:35:46Z pinsard todo seb: definition of parameters L 426 427 L 492 493 PRO pltt tab giventype givenmin givenmax datmin datmax BOXZOOM boxzoom CONTOUR contour ENDPOINTS endpoints INTERVALLE intervalle INV inv CONTINTERVALLE contintervalle LABEL label CONTLABEL contlabel STYLE style CONTMAX contmax CONTMIN contmin NOFILL nofill NLEVEL nlevel CONTNLEVEL contnlevel COL1D col1d STY1D sty1d MININ minin MAXIN maxin OV1D ov1d FILTER filter TREND_TYPE trend_type REPEAT_C repeat_c TYPEIN typein XT XT YT YT ZT zt TT tt STRICTFILL strictfill OVERPLOT overplot EXCHANGE_XY exchange_xy _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh cm_4data cm_4cal IF NOT keyword_set key_forgetold THEN BEGIN updatenew updatekwd ENDIF tempsun systime 1 For key_performance I2 reinitialization p x y Comment: we do not reinitialize when we call back plt in loop to use contour if n_elements contour ne 4 AND NOT keyword_set overplot AND NOT keyword_set ov1d then reinitplt I1 Reading of the field if keyword_set boxzoom OR keyword_set endpoints AND n_elements contour ne 4 THEN BEGIN savedbox 1b saveboxparam boxparam4pltt dat ENDIF if n_elements giventype NE 0 then type giventype if n_elements givenmin NE 0 then min givenmin if n_elements givenmax NE 0 then max givenmax if n_elements minin NE 0 then min minin if n_elements maxin NE 0 then max maxin if keyword_set typein then BEGIN if size type type NE 7 AND size type type NE 0 then begin if n_elements min NE 0 then max min min type endif type typein ENDIF checktypeminmax pltt TYPE type MIN min MAX max XT XT YT YT ZT zt TT tt ENDPOINTS endpoints _extra ex if keyword_set endpoints then begin section tab z2d glam gphi ENDPOINTS endpoints TYPE type BOXZOOM boxzoom DIREC direc nx n_elements glam ny nx if strupcase vargrid EQ W then begin z gdepw firstzw:lastzw nz nzw ENDIF ELSE BEGIN z gdept firstzt:lastzt nz nzt ENDELSE ENDIF ELSE BEGIN z2d checkfield tab pltt TYPE type BOXZOOM boxzoom direc direc _extra ex if n_elements z2d EQ 1 AND z2d 0 EQ 1 then BEGIN IF keyword_set savedbox THEN restoreboxparam boxparam4pltt dat return endif grille mask glam gphi gdep nx ny nz type type ENDELSE Calculation of trend anomaly following TREND_TYPE IF NOT keyword_set trend_type THEN trend_type 0 IF trend_type GT 0 THEN z2d trends z2d trend_type type Filtering of fields in the t case IF type EQ t AND keyword_set filter THEN BEGIN ras report Applying a running mean filter of width string filter format I3 z2d smooth z2d filter z2d 0:filter 2 1 0 z2d size z2d 1 filter 2 1: size z2d 1 1 0 ENDIF Repetition of the temporal series IF NOT keyword_set repeat_c THEN repeat_c 1 temps time 0:jpt 1 IF repeat_c GT 1 THEN BEGIN taille size z2d CASE taille 0 OF 1: z2d reform z2d replicate 1 repeat_c taille 1 repeat_c 2: BEGIN z2d z2d replicate 1 repeat_c z2d reform z2d taille 1 taille 2 repeat_c over END ELSE: ENDCASE temps temps lindgen jpt REPEAT_c 1 1 temps 1 temps 0 temps jpt 1 ENDIF Selection of graphic s type taille size z2d case taille 0 of 2 : typdes 2d 1 : begin z1d z2d typdes 1d if keyword_set OV1D then begin yy z2d if n_elements datmin NE 0 then tempsmin date2jul datmin ELSE tempsmin temps 0 on shift l axe du temps pour des questions de precision sur les dates du calendier julien en long qui sont passes en float ds les axes xx temps tempsmin x range x range tempsmin x tickv x tickv tempsmin We do a false plot to apply these changes plot 0 0 noerase xstyle 5 ystyle 5 title subtitle ytitle xtitle goto trace1d endif end endcase We build the mask For that the table must be masked automatically done at the value valmask if we pass in moyenne or grossemoyenne nan total finite z2d nan z2d not very nice when xgridstyle 2 same if xticklen 0 5 not very nice in the middle so we draw the top right axis by hand using axis if n_elements ex NE 0 then BEGIN pour avoir un cadre de la couleur noire if where tag_names ex EQ COLOR 0 NE 1 then ex COLOR 0 ENDIF plot 0 0 nodata noerase _extra ex xstyle 1 4 keyword_set endpoints AND type EQ xt AND lat1 NE lat2 8 type EQ yt OR type EQ zt ystyle 1 4 keyword_set endpoints AND type EQ yt 8 type EQ xt call axis for the missing axis IF type EQ xt AND NOT keyword_set endpoints THEN BEGIN if n_elements ex NE 0 then if where tag_names ex EQ YTICKNAME 0 NE 1 then ex YTICKNAME replicate n_elements ex YTICKNAME axis yaxis 1 ystyle 1 yticklen 0 ytickname replicate y ticks 1 _extra ex ENDIF IF type EQ yt OR type EQ zt AND NOT keyword_set endpoints THEN BEGIN if n_elements ex NE 0 then if where tag_names ex EQ XTICKNAME 0 NE 1 then ex XTICKNAME replicate n_elements ex XTICKNAME axis xaxis 1 xstyle 1 xticklen 0 xtickname replicate x ticks 1 _extra ex ENDIF ajout d un axe ds le cas ou l on utilise endpoints if keyword_set endpoints then addaxe endpoints type posfenetre _EXTRA ex color bar colnumb colnumb 0:ncontour 1 keyword_set strictfill barrecouleur colnumb min max ncontour keyword_set strictfill 2 position posbar _extra ex endif 1d trace1d: if typdes eq 1d then begin if not keyword_set col1d then col1d 0 if keyword_set sty1d then BEGIN if we want to make bars IF strlowcase strtrim sty1d EQ bar then begin y range y range 0 y range 1 y range 0 05 y range 1 bar_plot yy background d n_colors 1 not very nice when xgridstyle 2 same if xticklen 0 5 not very nice in the middle so we draw the top axis by hand using axis if n_elements ex NE 0 then BEGIN To have a black frame if where tag_names ex EQ COLOR 0 NE 1 then ex COLOR 0 ENDIF plot 0 0 nodata noerase xstyle 1 8 1 keyword_set exchange_xy ystyle 1 8 keyword_set exchange_xy _extra ex call axis for the missing axis if n_elements ex NE 0 then BEGIN force tickname to blank array if where tag_names ex EQ YTICKNAME 0 NE 1 AND keyword_set exchange_xy then ex YTICKNAME replicate n_elements ex YTICKNAME if where tag_names ex EQ XTICKNAME 0 NE 1 AND NOT keyword_set exchange_xy then ex XTICKNAME replicate n_elements ex XTICKNAME ENDIF if keyword_set exchange_xy then axis yaxis 1 ystyle 1 yticklen 0 ytickname replicate y ticks 1 _extra ex ELSE axis xaxis 1 xstyle 1 xticklen 0 xtickname replicate x ticks 1 _extra ex ENDIF ELSE oplot xx yy color col1d linestyle sty1d thick 2 _extra ex endif fini: we reput time axis in IDL julian days and not in julian days count from tempsmin if type EQ xt then BEGIN y range y range tempsmin y tickv y tickv tempsmin ENDIF ELSE BEGIN x range x range tempsmin x tickv x tickv tempsmin ENDELSE We do a false plot to these values are considerated plot 0 0 nodata noerase xstyle 5 ystyle 5 title subtitle ytitle xtitle 3rd part: possible print terminedessin _extra ex if keyword_set savedbox THEN restoreboxparam boxparam4pltt dat if n_elements key_performance NE 0 then IF key_performance EQ 1 THEN print temps pltt systime 1 tempsun return end"); a[267] = new Array("./ToBeReviewed/PLOTS/DESSINE/pltv.html", "pltv.pro", "", " file_comments Draw 2d plots with TV procedure categories find a file graphic param DATA in required The field we want to display can be: 1 an array If the array is not a 2D array its mean along the z and t direction will be automatically performed as it is done in plt 2 a structure respecting all criterions specified by litchamp param MIN in optional default min of DATA on non masked points param MAX in optional default max of DATA on non masked points keyword BOTTOM default 1 The lowest color index of the colors to be used keyword BOXZOOM Vector indicating the geographic zone on which we want to cut the map If BOXZOOM has : 1 element : The extraction is made on lon1 lon2 lat1 lat2 0 boxzoom 0 2 elements: The extraction is made on lon1 lon2 lat1 lat2 boxzoom 0 boxzoom 1 4 elements: The extraction is made on Boxzoom 0 max gdept gdepw 5 elements: The extraction is made on Boxzoom 0:3 0 Boxzoom 4 6 elements: The extraction is made on Boxzoom Where lon1 lon2 lat1 lat2 are global variables defined at the last domdef keyword C_NAN default d n_colors 1 e6 the test to find the masked value is ge abs mask 10 This is necessary to avoid the rounding errors keyword NCOLORS default d n_colors placedessin TV axe legende barrecouleur terminedessin examples IDL tvplus dist 100 history Aug 2006: Sebastien Masson smasson lodyc jussieu fr version Id: pltv pro 378 2008 08 12 12:35:46Z pinsard PRO pltv data min max BOTTOM bottom BOXZOOM boxzoom C_MASK c_mask C_NAN c_nan INV inv MININ minin MAXIN maxin MASKVAL maskval NCOLORS ncolors NOINTERP nointerp _EXTRA ex compile_opt idl2 strictarrsubs cm_general for key_performance tempsun systime 1 for key_performance I2 Reading of the field and checkup IF n_elements minin NE 0 THEN min minin IF n_elements maxin NE 0 THEN max maxin IF size data type NE 8 THEN z2d reform float data ELSE z2d data IF size z2d n_dimensions NE 2 then BEGIN if keyword_set boxzoom then BEGIN savedbox 1b saveboxparam boxparam4pltv dat ENDIF z2d checkfield temporary z2d plt TYPE xy direc direc BOXZOOM boxzoom if n_elements z2d EQ 1 AND z2d 0 EQ 1 then BEGIN IF keyword_set savedbox THEN restoreboxparam boxparam4pltv dat return ENDIF ENDIF dtasize size z2d dimensions def of ncolmax bottom topcol et ncolors ncolmax d n_colors bottom IF NOT keyword_set ncolors then topcol ncolmax 2 ELSE topcol bottom ncolors 1 temporary z2d c_nan c_mask ncolmax 1 ELSE cmask ncolmax 1 z2d maskind cmask ENDIF reverse colors from topcol to bottom instead of bottom to topcol IF keyword_set inv THEN BEGIN m float topcol bottom float bottom topcol p float bottom 2 topcol 2 float bottom topcol z2d m temporary z2d p ENDIF avoid rounding errors z2d round temporary z2d use byte type to save memory z2d byte temporary z2d if NOT keyword_set overplot then reinitplt z invert placedessin pltv posplot posbar dtasize _extra ex 3 Drawing xsize p position 2 p position 0 ysize p position 3 p position 1 IF d name EQ X THEN BEGIN xsize ceil xsize d x_size ysize ceil ysize d y_size z2d congrid z2d xsize ysize ENDIF tv z2d p position 0 p position 1 xsize xsize ysize ysize normal _EXTRA ex caption display of these axe pltv dtasize _EXTRA ex legende truemin truemax plt DIREC direc INTERVALLE float max min topcol bottom _extra ex plot 0 0 noerase nodata xstyle 1 ystyle 1 _extra ex IF keyword_set masked THEN tracemask msk indgen dtasize 0 indgen dtasize 1 color bar IF keyword_set inv THEN colors topcol bindgen ncolors ELSE colors bottom bindgen ncolors barrecouleur colors min max 10 position posbar _extra ex 4 End of drawing terminedessin _extra ex if keyword_set savedbox THEN restoreboxparam boxparam4pltv dat if keyword_set key_performance NE 0 THEN print time pltv systime 1 tempsun return end"); a[268] = new Array("./ToBeReviewed/PLOTS/DESSINE/pltz.html", "pltz.pro", "", " file_comments Trace vertical graphs categories Graphics param TAB The field whose we want to make a vertical cut can be 2 kind of thing: 1 An 2d or 3d array If the field is 2d indicate with the keyword BOXZOOM geographic delineations of the boxzoom If the field is 3d we extract the section on we average possibly before to do the plot 2 a structure respecting all criterions specified by litchamp The array contained in the structure must be 2 or 3d See case 1 param GIVENTYPE param GIVENMIN required valeur minimum que l on veut prendre en compte dans le trace des contours Par defaut on prend le min de tab1 sur les pts mer param GIVENMAX required valeur maximum que l on veut prendre en compte dans le trace des contours Par defaut on prend le max de tab1 sur les pts mer keyword BOXZOOM Vector indicating the geographic zone on which we want to cut the map If BOXZOOM has : 1 element : The extraction is made on lon1 lon2 lat1 lat2 0 boxzoom 0 2 elements: The extraction is made on lon1 lon2 lat1 lat2 boxzoom 0 boxzoom 1 4 elements: The extraction is made on Boxzoom 0 max gdept gdepw 5 elements: The extraction is made on Boxzoom 0:3 0 Boxzoom 4 6 elements: The extraction is made on Boxzoom Where lon1 lon2 lat1 lat2 are global variables defined at the last domdef keyword CONTINTERVALLE When CONTOUR is activated it is the value between 2 isolines traced by a trait So it can be different from the one specified by INTERVALLE which in this case does not control colored isolines in color anymore If there is noone specified min we choose a contour min which goes well with the specified interval If this keyword is not specified we trace 20 isolines from the min to the max keyword CONTLABEL type integer When CONTOUR is activated if n is different of 0 choose the label type corresponding to n cases for the traced by a traitisolines To specify the type of label of the colored contour use LABEL keyword CONTMAX default max of the keyword CONTOUR on ocean points When CONTOUR is activated max value we want to consider in the isoline traced by a trait s line keyword CONTMIN default min of the keyword CONTOUR on ocean points When CONTOUR is activated min value we want to consider in the isoline traced by a trait s line keyword CONTNLEVEL default 20 When CONTOUR is activated it is the number of contours traced by a trait for drawing active if CONTLABEL 0 keyword CONTOUR If we want to trace contours of a different field than the one whose we have the colored drawing by example E P in color and QSR in contours It must be a field respecting same characteristics than the argument number one of plt keyword ENDPOINTS keyword specifying that we want to make a vertical cut in diagonal Then coordinated of extremities of these ones are defined by the 4 elements of the vector ENDPOINTS: x1 y1 x2 y2 which are coordinates keyword INTERVALLE Value of an interval between two isolines If there is none specified min we choose a min contour which goes well with the specified interval If this keyword is not specified we trace 20 isoline from the min to the max Comment: When CONTOUR is activated INTERVALLE only specify the interval between 2 colored isolines To specify the interval between 2 isolines traced by a trait use CONTINTERVALLE keyword INV Invert the color vector used to color the graph without use the black the white and the used palette keyword ZRATIO default 2 3 When the drawing has a zoomed part it is the size ratio between the zoomed part hz zoom height and the whole drawing ht total height keyword LABEL default 0 type integer It choose the label s type corresponding to cases in label Comment: When CONTOUR is activated it only specify the label s type for colored isolines For these ones traced by a trait use CONTLABEL keyword MASKFILL set to 0 to avoid to fill the masked values keyword MAXIN to specify the max value we want to plot with a keyword instead of with the input parameter max If max is defined by both parameter and keyword the keyword is retained keyword MININ to specify the min value we want to plot with a keyword instead of with the input parameter min If min is defined by both parameter and keyword the keyword is retained keyword NLEVEL default 20 Number of contours to draw active if LABEL 0 or is not specified keyword NOFILL To make just isolines with no filling keyword NOMASK activate to supress the use of the land sea mask when plotting the field keyword NO_PARTIALSTEP activate to supress the use of partial steps force key_partialstep 0 within pltz keyword NOTRI To force not to use the triangulation Beware in this case the drawing only works if the grid is undeformed It means that each point of a longitude give one latitude and each point of a latitude give one longitude except if we use the keyword CELL_FILL 2 Comment: if the field contain points values f_nan then we even do a triangulation keyword MASKDTA 2d array defining the mask that must be applied to the data instead of the default mask which is defined according to the grid t u v f mask keyword OVERPLOT To make a plot over an other one Comment: Contrarily to the use of CONTOUR or VECTEUR the use of this keyword does not the caption and or the color bar keyword SIN Activate this keyword if we want the x axis to be traced in sinus of the latitude when we make a drawing f y keyword STRICTFILL Activate this keyword to that the filling of contours be precisely done between the min and the max specified Values inferior superior at the specified min max are not filled Note that max values a considered as missing values so cells containing one or more corners with values above max will have no contours drawn through them keyword STYLE default style 0 Contour s style to adopt to draw isolines See style for more informations keyword WDEPTH To specify that the field is at W depth instead of T depth automatically activated if vargrid eq W keyword XZ Force to make a cut following xz keyword YZ Force to make a cut following yz keyword ZOOM default 200m or max depth if it is inferior at 200m Depth where i can make our maximum zoom uses common history Sebastien Masson smasson lodyc jussieu fr 7 1999 Sebastien Masson 08 02 2000 checkfield and notri keyword version Id: pltz pro 388 2008 12 09 09:36:41Z smasson todo seb definition of paramaters L 215 221 PRO pltz tab giventype givenmin givenmax BOXZOOM boxzoom CONTOUR contour ENDPOINTS endpoints INTERVALLE intervalle INV inv ZRATIO zratio CONTINTERVALLE contintervalle LABEL label CONTLABEL contlabel STYLE style CONTMAX contmax SIN sin TYPEIN typein CONTMIN contmin NLEVEL nlevel CONTNLEVEL contnlevel NOFILL nofill NOMASK nomask NO_PARTIALSTEP no_partialstep NOTRI notri USETRI usetri FILLXDIR fillxdir ZOOM zoom XZ xz YZ yz MININ minin MAXIN maxin STRICTFILL strictfill OVERPLOT overplot WDEPTH wdepth REALSECTION realsection MASKFILL maskfill MASKDTA maskdta _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh cm_4data cm_4ps IF NOT keyword_set key_forgetold THEN BEGIN updatenew updatekwd ENDIF tempsun systime 1 For key_performance 1st part: initialization small calculations Comment: we do not reinitialize when we call back plt in loop to use contour if n_elements contour ne 4 AND NOT keyword_set overplot then reinitplt if n_elements contour ne 4 THEN saveboxparam boxparam4pltz dat key_partialstep keyword_set key_partialstep 1b keyword_set no_partialstep Reading of the field if n_elements giventype NE 0 then type giventype if n_elements givenmin NE 0 then min givenmin if n_elements givenmax NE 0 then max givenmax if n_elements minin NE 0 then min minin if n_elements maxin NE 0 then max maxin if n_elements realsection EQ 0 then realsection 1 IF n_elements usetri EQ 0 THEN BEGIN IF n_elements notri NE 0 THEN usetri 2 notri ELSE usetri 1 ENDIF no need of triangulation IF usetri EQ 1 AND keyword_set realsection THEN usetri 0 did we specify the type if keyword_set typein then BEGIN if size type type NE 7 AND size type type NE 0 then begin if n_elements min NE 0 then max min min type endif type typein ENDIF checktypeminmax pltz TYPE type MIN min MAX max XZ xz YZ yz ENDPOINTS endpoints _extra ex if keyword_set endpoints then begin section tab z2d glam gphi ENDPOINTS endpoints TYPE type BOXZOOM boxzoom DIREC direc WDEPTH wdepth _extra ex if n_elements z2d EQ 1 AND z2d 0 EQ 1 AND n_elements contour ne 4 then BEGIN restoreboxparam boxparam4pltz dat return ENDIF nx n_elements glam ny nx if strupcase vargrid EQ W then begin gdep gdepw firstzw:lastzw nz nzw ENDIF ELSE BEGIN gdep gdept firstzt:lastzt nz nzt ENDELSE mask z2d LE valmask 10 ENDIF ELSE BEGIN z2d checkfield tab pltz TYPE type BOXZOOM boxzoom DIREC direc WDEPTH wdepth _extra ex if n_elements z2d EQ 1 AND z2d 0 EQ 1 AND n_elements contour ne 4 then BEGIN restoreboxparam boxparam4pltz dat return ENDIF IF realsection EQ 1 THEN grille mask glam gphi gdep nx ny nz type type WDEPTH wdepth ELSE grille mask glam gphi gdep nx ny nz WDEPTH wdepth ENDELSE IF size gdep n_dimensions EQ 2 THEN usetri 2 profmax y range 0 profmin y range 1 if not keyword_set zoom then zoom 200 zoom zoom 0 IF zoom LT profmin THEN zoom profmax if zoom GE vert2 then zoom profmax construction of the mask and of the axis axis4pltz type mask glam gphi gdep XXAXIS xxaxis ZZAXIS zzaxis SIN sin ZRATIO zratio ZOOM zoom PROFMAX profmax PROFMIN profmin _extra ex to draw from bottom to top avoid using cell_fill z2d reverse z2d 2 szmsk size mask dimensions IF keyword_set nomask THEN mask replicate 1b szmsk 0 szmsk 1 IF keyword_set maskdta THEN mask byte fitintobox maskdta Determination of the mi:min and of the ma:max of z2d in the same way as max: max and min: min for the drawing nan total finite z2d nan z2d max if n_elements maskfill NE 0 then BEGIN z2d z2d mask masknan if maskfill NE 0 then z2d temporary z2d maskfill 1b mask masknan ENDIF check the mask and the triangulation according to the grid type and nan values find the coordinates of the mask if where mask EQ 0 0 EQ 1 AND NOT keyword_set nan then notri 1 if keyword_set notri then trifield 1 ELSE trifield triangule mask basic if n_elements key_save EQ 0 AND usetri GE 1 AND vargrid EQ T OR vargrid EQ W OR usetri EQ 2 AND vargrid NE T AND vargrid NE W THEN trifield triangule mask basic IF NOT keyword_set endpoints THEN BEGIN if keyword_set nan then trinan triangule masknan basic coinmonte coinmontenan coindescend coindescendnan maskorg mask decoupeterre mask glammsk gphimsk gdepmsk type type WDEPTH wdepth REALSECTION realsection MASKDTA maskdta axis4pltz type mask glammsk gphimsk gdepmsk XXAXIS xmask ZZAXIS zmask SIN sin ZRATIO zratio ZOOM zoom PROFMAX profmax PROFMIN profmin _extra ex szmsk size mask dimensions IF keyword_set nomask THEN mask replicate 1b szmsk 0 szmsk 1 ENDIF ELSE BEGIN xmask xxaxis zmask zzaxis ENDELSE if usetri GE 1 AND vargrid NE T AND vargrid NE W THEN BEGIN IF keyword_set realsection THEN trimsk triangule mask basic ELSE trimsk triangule mask basic coinmonte coinmontemask coindescend coindescendmask ENDIF dessin en lui meme IF n_elements romszinfos EQ 1 THEN BEGIN add one line at bottom to have nicer plot colors go until the ocean bottom IF n_elements romszinfos h NE 1 THEN BEGIN CASE type OF xz :romsh moyenne romszinfos h y yz :romsh moyenne romszinfos h x ENDCASE IF nzt EQ jpk THEN BEGIN z2d z2d z2d jpk 1 zzaxis zzaxis romsh ENDIF ENDIF ENDIF pltbase z2d xxaxis zzaxis mask xmask zmask level_z2d colnumb overplot overplot contour contour trichamp trifield trimsk trimsk c_linestyle linestyle c_labels 1 indgen n_elements level_z2d MOD 2 c_thick thick unsur2 unsur2 NOFILL nofill maskorg maskorg masknan masknan trinan trinan coinmontenan coinmontenan coindescendnan coindescendnan coinmontemask coinmontemask coindescendmask coindescendmask REALSECTION realsection USETRI usetri _extra ex recall of pltz in loop when contour is activated if n_elements contour eq 4 then BEGIN It is the second time I pass in pltt contour mietma: mi ma unit:varunit inter:intervalle I send back the min the max and the unity return endif if keyword_set contour THEN BEGIN pourlegende 1 1 1 1 oldattributs saveatt oldcolnumb colnumb pltz contour contmin contmax CONTOUR pourlegende ZRATIO zratio INTERVALLE contintervalle LABEL contlabel STYLE style noerase NLEVEL contnlevel ZOOM zoom BOXZOOM boxzoom ENDPOINTS endpoints STRICTFILL strictfill REALSECTION realsection MASKFILL maskfill USETRI usetri _extra ex restoreatt oldattributs colnumb oldcolnumb ENDIF 3rd part: drawing of the frame caption colorbar if keyword_set overplot then BEGIN y range zoom profmin We get back on physic coordinates plot 0 0 nodata noerase title subtitle xstyle 5 ystyle 5 GOTO fini endif Caption display of them legende mi ma type CONTOUR pourlegende INTERVALLE intervalle DIREC direc endpoints endpoints _EXTRA ex if type eq yz then xaxe lataxe else xaxe lonaxe if keyword_set sin OR NOT key_onearth then xaxe Frame applied by default plot xxaxis 0 xxaxis n_elements xxaxis 1 zratio zratio noerase xstyle 1 4 keyword_set endpoints AND type EQ xz AND lat1 NE lat2 OR type EQ yz AND lon1 NE lon2 xtickformat xaxe _extra ex Add of an axis in the case of we use endpoints if keyword_set endpoints then addaxe endpoints type posfenetre _EXTRA ex Y axis in 1 or 2 part if n_elements ex NE 0 then BEGIN To do not put title anymore if where tag_names ex EQ TITLE 0 NE 1 then ex TITLE To do not put subtitle anymore if where tag_names ex EQ SUBTITLE 0 NE 1 then ex SUBTITLE To have just one ytitle if where tag_names ex EQ YTITLE 0 NE 1 then BEGIN ytitle ex YTITLE ex YTITLE endif ENDIF htotal posfenetre 3 posfenetre 1 hzoom 1 zratio htotal if zoom LT profmax then plot 0 0 nodata noerase ystyle 1 yrange profmax zoom 0 001 position posfenetre 0 0 0 hzoom _extra ex title subtitle ytitle y range zoom profmin We get back in physic coordinates plot 0 0 nodata noerase ystyle 1 _extra ex title subtitle ytitle position posfenetre 0 htotal hzoom 0 0 to write the ytitle if d name EQ PS then xs max page_size min mi 1 key_portrait mi key_portrait d x_px_cm ELSE xs d x_size if n_elements ytitle NE 0 then y title ytitle charsize chkstru ex ycharsize extract if charsize EQ 1 then charsize p charsize IF chkstru ex charsize THEN ex charsize charsize if chkstru ex ytitle extract NE then decalage string format e10 3 profmax decalage float strmid decalage strpos decalage e 1 posy posfenetre 1 1 htotal 2 posx posfenetre 0 decalage 3 d x_ch_size charsize xs xyouts posx posy y title normal orientation 90 color 0 ALIGNMENT 5 charsize charsize _extra ex colorbar colnumb colnumb 0:ncontour 1 keyword_set strictfill barrecouleur colnumb min max ncontour keyword_set strictfill 2 position posbar _extra ex 4th part: possible print fini: terminedessin _extra ex sortie: restoreboxparam boxparam4pltz dat if keyword_set key_performance NE 0 THEN print temps pltz systime 1 tempsun return end"); a[269] = new Array("./ToBeReviewed/PLOTS/DESSINE/sbar_plot.html", "sbar_plot.pro", "", " file_comments Same thing that bar_plot but compatible with the whole environment common included categories Graphics keyword COLORS type vector A vector the same size as VALUES containing the color index to be used for each bar If not specified the colors are selected based on spacing the color indices as widely as possible within the available colors specified by D N_COLORS keyword COLORS type integer I gives color of all colorbars contrarily to colors which is a vector giving the color of each colorbar keyword NOREINITPLT We active it if we do not want environment variables p x y z to be reinitialized by the procedure reinitplt keyword _EXTRA Used to pass keyword uses common restrictions If NOREINITPLT is not activated all environment variables p x y z are reinitialized by the procedure reinitplt examples IDL sbar_plot indgen 10 small 2 2 2 rempli IDL sbar_plot indgen 10 small 2 2 3 noerase IDL ps history Sebastien Masson smasson lodyc jussieu fr 10 10 1999 version Id: sbar_plot pro 370 2008 08 07 07:59:15Z pinsard PRO sbar_plot values COLORS colors NOREINITPLT noreinitplt _EXTRA ex compile_opt idl2 strictarrsubs common 1 I reinitialize the graphic environment variables x y and p : if NOT keyword_set NOREINITPLT then reinitplt _extra ex 2 I place the drawing on the screen like on the postscript IF chkstru ex overplot EQ 0 THEN placedessin autre _extra ex 3 Drawing if n_elements COLORS NE 0 then BEGIN if n_elements COLORS EQ n_elements Values then col colors ELSE col replicate colors 0 n_elements Values ENDIF ELSE col congrid indgen d n_colors 256 n_elements Values bar_plot Values background p background colors col xstyle 1 ystyle 1 _extra ex 4 End of drawing terminedessin _extra ex return end"); a[270] = new Array("./ToBeReviewed/PLOTS/DESSINE/scontour.html", "scontour.pro", "", " file_comments Same thing that contour but compatible with the whole environment common included categories Graphics keyword NOREINITPLT We active it if we do not want environment variables p x y z to be reinitilalized by the procedure reinitplt keyword _EXTRA Used to pass keywords uses common examples IDL z dist 100 IDL scontour z nlevels 10 small 1 2 1 xstyle 1 ystyle 1 IDL ps history Sebastien Masson smasson lodyc jussieu fr 10 10 1999 version Id: scontour pro 370 2008 08 07 07:59:15Z pinsard PRO scontour x y z NOREINITPLT noreinitplt _EXTRA ex compile_opt idl2 strictarrsubs common 1 I reinitialize the graphic environment variables x y and p : if NOT keyword_set NOREINITPLT then reinitplt _extra ex 2 i put the drawing on the screen like on the postscript if ex contains norease and c_orientation keywords we force ex noerase 0 IF chkstru ex overplot EQ 0 THEN placedessin autre _extra ex fiddle when noerase is used with c_orientation call contour with nodata to get the graphic environment then force noerase 0 and overplot 1 IF size ex type EQ 8 THEN BEGIN check if noerase is used with c_orientation alltags strlowcase tag_names ex dummy where alltags EQ noerase count1 dummy where alltags EQ c_orientation count2 IF count1 count2 NE 0 THEN BEGIN case n_params OF 1:contour x nodata _EXTRA ex 2:contour x y nodata _EXTRA ex 3:contour x y z nodata _EXTRA ex endcase ex noerase 0 ex get_extra overplot _extra ex noerase_orientation 1 ENDIF ENDIF 3 je fais mon joli dessin case n_params OF 1:contour x xstyle 1 ystyle 1 _EXTRA ex 2:contour x y xstyle 1 ystyle 1 _EXTRA ex 3:contour x y z xstyle 1 ystyle 1 _EXTRA ex ENDCASE fiddle when noerase is used with c_orientation draw the contour axis IF keyword_set noerase_orientation THEN BEGIN ex noerase 1 ex overplot 0 case n_params OF 1:contour x xstyle 1 ystyle 1 nodata _EXTRA ex 2:contour x y xstyle 1 ystyle 1 nodata _EXTRA ex 3:contour x y z xstyle 1 ystyle 1 nodata _EXTRA ex ENDCASE ENDIF 4 End of drawing terminedessin _extra ex return end"); a[271] = new Array("./ToBeReviewed/PLOTS/DESSINE/splot.html", "splot.pro", "", " file_comments Same thing than plot but compatible with the whole environment common included categories Graphics keyword NOREINITPLT We active it if we do not want environment variables p x y z to be reinitilalized by the procedure reinitplt keyword _EXTRA Used to pass keywords uses common restrictions If NOREINITPLT is not activated all environment variables p x y z are reinitialized by the procedure reinitplt examples IDL splot indgen 10 ystyle 1 small 1 2 1 portrait IDL splot indgen 10 ystyle 1 small 1 2 2 noerase IDL ps history Sebastien Masson smasson lodyc jussieu fr 18 10 1999 version Id: splot pro 370 2008 08 07 07:59:15Z pinsard PRO splot x y NOREINITPLT noreinitplt _EXTRA ex compile_opt idl2 strictarrsubs common 1 I reinitialize the graphic environment variables x y and p : if NOT keyword_set NOREINITPLT then reinitplt _extra ex 2 i put the drawing on the screen like on the postscript placedessin autre _extra ex 3 Drawing if n_elements y EQ 0 then plot x xstyle 1 ystyle 1 _EXTRA ex ELSE plot x y xstyle 1 ystyle 1 _EXTRA ex 4 End of drawing terminedessin _extra ex return end"); a[272] = new Array("./ToBeReviewed/PLOTS/DESSINE/tvplus.html", "tvplus.pro", "", " file_comments Enhanced version of TVSCL categories quick exploration of 2D arrays param Z2D in required 2D array to visualize param CELLSIZE in optional This is the size in pixel of the square representing 1 array element By default this size is computed automatically in order that the size of the plotting window do not exceed the screen size If the user specify a large value of cellsize that forces tvplus to create a window larger than the screen a scrolling window will be displayed instead of a regular window Unfortunately the nice functionalities of tvplus are not coded for scrolling window case keyword BOTTOM default 1 The lowest color index of the colors to be used keyword C_NAN default d n_colors 1 e6 the test to find the masked value is ge abs mask 10 This is necessary to avoid the rounding errors keyword MIN Scalar used to specify the min value to be drawn keyword MAX Scalar used to specify the max value to be drawn keyword NCOLORS default d n_colors TV PLOT colorbar restrictions use your mouse to scan the array values left button : mouse position and associated array value middle button: use it twice to define a zoom box right button : quit the nice functionalities of tvplus are not coded for scrolling window case examples IDL tvplus dist 100 history Sebastien Masson smasson lodyc jussieu fr 18 12 98 Aug 2005: quick cleaning english version Id: tvplus pro 371 2008 08 07 09:32:02Z pinsard PRO tvplus z2d cellsize BOTTOM bottom C_MASK c_mask C_NAN c_nan WINDOW window MIN min MAX max MASK mask OFFSET offset NOUSEINFOS NOUSEINFOS NCOLORS ncolors NOINTERP nointerp _EXTRA ex compile_opt idl2 strictarrsubs IF n_elements z2d EQ 0 THEN return arr reform float z2d check the size of the input array if size arr 0 NE 2 then begin ras report Input array must have only 2 dimensions and not strtrim size arr n_dimensions 1 return endif def of ncolmax bottom topcol and ncolors ncolmax d n_colors arr truemin min ENDIF ELSE truemin min arr if n_elements max NE 0 then BEGIN arr arr floor x cellsize floor y cellsize floor x cellsize floor y cellsize floor x2 cellsize floor y2 cellsize size arr 2 cellsize 1 x x x2 x x sort x y y y2 y y sort y IF keyword_set OFFSET THEN offset x 0 y 0 offset ELSE offset x 0 y 0 tvplus z2d x 0 :x 1 y 0 :y 1 WINDOW window MIN min MAX max MASK mask C_MASK c_mask C_NAN c_nan NOUSEINFOS OFFSET OFFSET NCOLORS ncolors NOINTERP nointerp BOTTOM bottom _EXTRA ex return END ELSE: endcase ENDWHILE x xenvsauve y yenvsauve p penvsauve x range 1 0 nx cellsize 5 offset 0 y range 1 0 ny cellsize 5 offset 1 return end"); a[273] = new Array("./ToBeReviewed/PLOTS/DIVERS/addaxe.html", "addaxe.pro", "", " file_comments Add an axis when we do an oblique section in pltz pltt or plt1d categories Graphics param ENDPOINTS in required Coordinate of extremities of the section param TYPE in required type string A string of two characters specifying the type of plot we do param POSFENETRE in required type vector The vector p position corresponding to the frame position of the drawing part of the plot uses common history Sebastien Masson smasson lodyc jussieu fr version Id: addaxe pro 378 2008 08 12 12:35:46Z pinsard PRO addaxe endpoints type posfenetre _EXTRA ex compile_opt idl2 strictarrsubs common IF strpos type x NE 1 THEN BEGIN IF endpoints 1 EQ endpoints 3 THEN return IF key_onearth THEN BEGIN formeaxe0 lonaxe formeaxe1 lataxe titreaxe latitude ENDIF ELSE BEGIN formeaxe0 formeaxe1 titreaxe j index ENDELSE range endpoints 1 endpoints 3 if endpoints 2 LT endpoints 0 THEN range reverse range ENDIF ELSE BEGIN IF endpoints 0 EQ endpoints 2 THEN return IF key_onearth THEN BEGIN formeaxe0 lataxe formeaxe1 lonaxe titreaxe longitude ENDIF ELSE BEGIN formeaxe0 formeaxe1 titreaxe i index ENDELSE range endpoints 0 endpoints 2 if endpoints 3 LT endpoints 1 THEN range reverse range ENDELSE if type EQ yt then BEGIN axis yaxis 0 ytickformat formeaxe0 color 0 ystyle 1 _EXTRA ex axis yaxis 1 ytickformat formeaxe1 color 0 ystyle 1 ytitle titreaxe yrange range _EXTRA ex ENDIF ELSE BEGIN axis xaxis 0 xtickformat formeaxe0 color 0 xstyle 1 _EXTRA ex axis xaxis 1 xtickformat formeaxe1 color 0 xstyle 1 xtitle titreaxe xrange range _EXTRA ex ENDELSE return end"); a[274] = new Array("./ToBeReviewed/PLOTS/DIVERS/autoscale.html", "autoscale.pro", "", " file_comments We give a min and a max and the procedure send back the good contour interval and labels s value categories Graphics param MIN in required type float above what value we want to trace a contour param MAX in required type float below what value we want to trace a contour param CI out type real the contour interval Use it in CONTOUR with the keyword LEVEL restrictions CI is a multiple of the unity in unity log of 10 It force the number of contours to be even history G Roullet aout 99 gr lodyc jussieu fr version Id: autoscale pro 325 2007 12 06 10:04:53Z pinsard PRO autoscale min max ci compile_opt idl2 strictarrsubs Estimation of a first CI notice the presence of the floor Inferior round This CI is a multiple of the unity in unity log of 10 ci max min 20 ci 10 floor alog10 ci n 0 ci0 ci coef 2 2 5 5 10 We test differents CI contour intervals i e 1 2 2 5 5 and 10 until the number of contour is inferior to 30 WHILE ceil max min ci GE 30 DO BEGIN ci ci0 coef n n n 1 ENDWHILE min floor min ci 2 ci 2 max ceil max ci 2 ci 2 nlevels round max min ci We force the number of contour to be even IF nlevels MOD 2 EQ 1 THEN BEGIN nlevels nlevels 1 max max ci END END"); a[275] = new Array("./ToBeReviewed/PLOTS/DIVERS/axis4pltz.html", "axis4pltz.pro", "", " file_comments compute the mask and the axis for a vertical section param MASK in required 3d mask param GLAM in required 2d longitude param GPHI in required 2d latitude param Z in required 1d depth keyword XXAXIS to get the xaxis we need to use in pltbase keyword ZZAXIS to get the yaxis we need to use in pltbase keyword SIN Activate this keyword if we want the x axis to be traced in sinus of the latitude when we make a drawing f y keyword ZRATIO default 2 3 When the drawing has a zoomed part it is the size ratio between the zoomed part hz zoom height and the whole drawing ht total height keyword _EXTRA Used to pass keywords Others: see pltz history Sebastien Masson smasson lodyc jussieu fr June 24 2002 version Id: axis4pltz pro 378 2008 08 12 12:35:46Z pinsard PRO axis4pltz type mask glam gphi z XXAXIS xxaxis ZZAXIS zzaxis SIN sin ZRATIO zratio ZOOM zoom PROFMAX profmax PROFMIN profmin _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh IF NOT keyword_set key_forgetold THEN BEGIN updatekwd ENDIF define the mask used for this section if mask 0 NE 1 AND size mask 0 NE 2 then begin if type EQ xz then mask total mask 2 1 ELSE mask total mask 1 1 endif define xxaxis and yyaxis the axis used for this section nx size glam 1 CASE size gphi 0 OF 1:ny size gphi 1 2:ny size gphi 2 ENDCASE CASE size z 0 OF 1:nz size z 1 2:nz size z 2 ENDCASE if type eq yz then BEGIN IF size gphi 0 EQ 1 then xxaxis gphi ELSE BEGIN IF keyword_set key_irregular THEN BEGIN cln where gphi EQ max gphi 0 xxaxis reform gphi cln MOD nx ENDIF ELSE xxaxis reform gphi 0 ENDELSE if keyword_set sin then xxaxis sin pi 180 xxaxis ENDIF ELSE BEGIN xxaxis glam 0 ENDELSE zzaxis z We project the z axis in 0 1 if not keyword_set zratio then zratio 2 3 if zoom ge profmax then zratio 1 if zoom LT profmax then begin mp projsegment profmin zoom 0 zratio mp small where zzaxis LE zoom IF small 0 NE 1 THEN zzaxis small mp 0 zzaxis small mp 1 mp projsegment zoom profmax zratio 1 mp big where zzaxis GE zoom IF big 0 NE 1 THEN zzaxis big mp 0 zzaxis big mp 1 ENDIF ELSE BEGIN mp projsegment profmin profmax 0 1 mp zzaxis mp 0 zzaxis mp 1 ENDELSE to draw from bottom to top avoid using cell_fill CASE size zzaxis n_dimensions OF 1:zzaxis reverse zzaxis 2:zzaxis reverse zzaxis 2 ENDCASE if mask 0 NE 1 then mask reverse mask 2 return end"); a[276] = new Array("./ToBeReviewed/PLOTS/DIVERS/barrecouleur.html", "barrecouleur.pro", "", " file_comments Overlayer of colorbar categories Utilities param colnumb param clbinf param clbsup param clbdiv keyword NOCOLORBAR keyword CB_TITLE keyword NOFILL keyword COLOR_C keyword MIN Scalar used to specify the min value to be drawn keyword MAX Scalar used to specify the max value to be drawn keyword DIVISIONS keyword CB_SUBTITLE keyword POST keyword _EXTRA Used to pass keywords restrictions pass all arguments we want thanks to _EXTRA history Sebastien Masson smasson lodyc jussieu fr 23 12 98 version Id: barrecouleur pro 358 2008 04 28 09:41:14Z pinsard todo seb: mettre les keyword et les param PRO barrecouleur colnumb clbinf clbsup clbdiv NOCOLORBAR nocolorbar CB_TITLE cb_title NOFILL nofill COLOR_c color_c MIN min MAX max DIVISIONS divisions CB_SUBTITLE cb_subtitle POST post _EXTRA ex compile_opt idl2 strictarrsubs cm_general IF NOT keyword_set key_forgetold THEN BEGIN updatekwd ENDIF if keyword_set min then clbinf min if keyword_set max then clbsup min if keyword_set divisions THEN clbdiv divisions nocolorbar keyword_set nocolorbar keyword_set nofill keyword_set color_c def_myuniquetmpdir IF lmgr demo EQ 1 THEN BEGIN if we are in demo mode we cannot save the parameters in a temporary file cm_demomode_used colorbarparam colnumb:colnumb clbinf:clbinf clbsup:clbsup clbdiv:clbdiv ENDIF ELSE BEGIN save colnumb clbinf clbsup clbdiv file myuniquetmpdir 4colorbar dat ENDELSE if keyword_set nocolorbar then return ancienx x ancieny y ancienp p reinitplt x style 1 y style 1 colorbar cb_color 0 cb_charsize ancienp charsize pscolor keyword_set post division clbdiv min clbinf max clbsup cb_title cb_title discret colnumb _extra ex x ancienx y ancieny p ancienp return end"); a[277] = new Array("./ToBeReviewed/PLOTS/DIVERS/checkfield.html", "checkfield.pro", "", " file_comments categories param TYPE in required type string A string of two characters specifying the type of plot we do param N1 in required type integer Number of elements in the first dimension param N2 in required type integer Number of elements in the second dimension param NAME in optional type string It gives the name of the file to be opened If NAME does not contain the separating character of directories under unix for example the file will be looked for in the current directory returns restrictions examples history version Id: checkfield pro 378 2008 08 12 12:35:46Z pinsard FUNCTION err_1d type n1 name n2 compile_opt idl2 strictarrsubs return report Error in type type plot with a 1D input array: the number of elements of the input vector strtrim n1 1 is not equal to name strtrim n2 1 simple END file_comments categories param TYPE in required type string A string of two characters specifying the type of plot we do param SZ in optional default defined by grille param NX in optional default defined by grille param NY in optional default defined by grille param NZ returns restrictions examples history version Id: checkfield pro 378 2008 08 12 12:35:46Z pinsard FUNCTION err_2d type sz nx ny nz compile_opt idl2 strictarrsubs cm_4mesh cm_4cal return report Error in type type plot with a 2D input array: the array dimensions tostr sz 1:2 are incompatible with the domain dimensions jpi nx jpj ny jpk nz jpt strtrim jpi 1 strtrim nx 1 strtrim jpj 1 strtrim ny 1 strtrim jpk 1 strtrim nz 1 strtrim jpt 1 simple END file_comments categories param TYPE in required type string A string of two characters specifying the type of plot we do param SZ in optional default defined by grille param NX in optional default defined by grille param NY in optional default defined by grille param NZ returns restrictions examples history version Id: checkfield pro 378 2008 08 12 12:35:46Z pinsard FUNCTION err_3d type sz nx ny nz compile_opt idl2 strictarrsubs cm_4mesh cm_4cal return report Error in type type plot with a 3D input array: the array dimensions tostr sz 1:3 are incompatible with the domain dimensions jpi nx jpj ny jpk nz jpt strtrim jpi 1 strtrim nx 1 strtrim jpj 1 strtrim ny 1 strtrim jpk 1 strtrim nz 1 strtrim jpt 1 simple END file_comments In input of plt pltz pltt and plt1d it check that the field give a size compatible with the domain and if needed average to give us a 2d array if we make a plot of the type: xy xz xt yz yt zt or a 1d array if we make a plot of the type: x y z t categories Graphics param FIELD in required type field It respect litchamp s criterions param PROCEDURE in required keyword TYPE keyword NOQUESTION keyword BOXZOOM type vector Vector indicating the geographic zone on which we want to cut the map If BOXZOOM has : 1 element : The extraction is made on lon1 lon2 lat1 lat2 0 boxzoom 0 2 elements: The extraction is made on lon1 lon2 lat1 lat2 boxzoom 0 boxzoom 1 4 elements: The extraction is made on Boxzoom 0 max gdept gdepw 5 elements: The extraction is made on Boxzoom 0:3 0 Boxzoom 4 6 elements: The extraction is made on Boxzoom Where lon1 lon2 lat1 lat2 are global variables defined at the last domdef keyword WDEPTH to specify that the field is at W depth instead of T depth automatically activated if vargrid eq W keyword VECTEUR type vector It is a structure composed by 2 elements containing the 2 fields U and V of values of the zonal and meridian component of the vector of the fields to draw These fields can be an array or a structure For example: vecteur matriceu:lec unsurface matricev:lec vnsurface Comment: name of elements of vectors are inconsequential vecteur u:lec unsurface v:lec vnsurface is also appropriated keyword _EXTRA Used to pass keywords keyword DIREC uses common history Sebastien Masson smasson lodyc jussieu fr 08 02 2000 version Id: checkfield pro 378 2008 08 12 12:35:46Z pinsard todo seb: mettre les param FUNCTION checkfield field procedure TYPE type BOXZOOM boxzoom DIREC direc NOQUESTION noquestion VECTEUR vecteur WDEPTH wdepth _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh cm_4cal cm_4data IF NOT keyword_set key_forgetold THEN BEGIN updatenew updatekwd ENDIF I1 Reading of the field if n_elements field EQ 0 then return report field undefined arr litchamp field if vargrid eq W then wdepth 1 first check IF n_elements arr EQ 1 THEN BEGIN if arr EQ 1 then return report Error: input array 1 Maybe the reading did not perform well simple ELSE return report Error: input array is a scalar simple ENDIF nan total finite arr nan firstzw 1 lastzw lastzw 1 firstzt 1 lastzt lastzt 1 jpk 1 nzt lastzt firstzt 1 ENDELSE updateold ENDIF make the automatic definition of type for pltz if type is not specified IF type EQ z AND procedure EQ pltz THEN if lon2 lon1 gt lat2 lat1 then type xz else type yz make the automatic definition of type for pltt if type is not specified IF type EQ unkownpltt AND procedure EQ pltt THEN if lon2 lon1 gt lat2 lat1 then type xt else type yt verification of the input array size and the value of the type grille 1 1 1 1 nx ny nz firstx firsty firstz lastx lasty lastz WDEPTH wdepth basic checks CASE 1 OF nx EQ 1: IF strpos type x NE 1 THEN return report Error: impossible to make a type type plot with nx 1 simple ny EQ 1: IF strpos type y NE 1 THEN return report Error: impossible to make a type type plot with ny 1 simple nz EQ 1: IF strpos type z NE 1 THEN return report Error: impossible to make a type type plot with nz 1 simple jpt EQ 1: IF strpos type t NE 1 THEN return report Error: impossible to make a type type plot with jpt 1 simple ELSE: ENDCASE is the size of the array compatible with the domain arr fitintobox temporary arr nx ny nz firstx firsty firstz lastx lasty lastz sz size arr case sz 0 of 0:return arr 1:BEGIN nele n_elements arr case type of t :if jpt NE nele THEN return err_1d type nele jpt jpt x :IF nx NE nele THEN return err_1d type nele nx nx y :IF ny NE nele THEN return err_1d type nele ny ny z :IF nz NE nele THEN return err_1d type nele nz nx ELSE:return report Error: Impossible to make a type plot with a 1D array simple ENDCASE END 2:BEGIN case type of x :BEGIN case 1 of sz 1 EQ nx AND sz 2 EQ ny:direc y xy array sz 1 EQ nx AND ny EQ 1 AND sz 2 EQ nz:direc z x y z array sz 1 EQ nx AND sz 2 EQ jpt:direc t xt array ELSE:return err_2d type sz nx ny nz endcase end y :BEGIN case 1 of sz 1 EQ nx AND sz 2 EQ ny:direc x xy array nx EQ 1 AND sz 1 EQ ny AND sz 2 EQ nz:direc z x yz array sz 1 EQ ny AND sz 2 EQ jpt:direc t yt array ELSE:return err_2d type sz nx ny nz endcase END z :BEGIN case 1 of sz 1 EQ nx AND ny EQ 1 AND sz 2 EQ nz:direc x x y z array nx EQ 1 AND sz 1 EQ ny AND sz 2 EQ nz:direc y x yz array sz 1 EQ nz AND sz 2 EQ jpt:direc t zt array ELSE:return err_2d type sz nx ny nz endcase END t :BEGIN case 1 OF sz 1 EQ nx AND sz 2 EQ jpt:direc x xt array nx EQ 1 AND sz 1 EQ ny AND sz 2 EQ jpt:direc y x yt array nx EQ 1 AND ny EQ 1 AND sz 1 EQ nz AND sz 2 EQ jpt:direc z x y zt array ELSE:return err_2d type sz nx ny nz ENDCASE END xy :IF sz 1 NE nx OR sz 2 ne ny THEN return err_2d type sz nx ny nz xy array xz :IF sz 1 NE nx OR sz 2 ne nz THEN return err_2d type sz nx ny nz xz array yz :IF sz 1 NE ny OR sz 2 NE nz THEN return err_2d type sz nx ny nz yz array xt :IF sz 1 NE nx OR sz 2 NE jpt THEN return err_2d type sz nx ny nz xt array yt :IF sz 1 NE ny OR sz 2 NE jpt THEN return err_2d type sz nx ny nz yt array zt :IF sz 1 NE nz OR sz 2 NE jpt THEN return err_2d type sz nx ny nz zt array ENDCASE END 3:BEGIN case type of x :BEGIN case 1 of sz 1 EQ nx AND sz 2 EQ ny AND sz 3 EQ nz:direc yz xyz array sz 1 EQ nx AND ny EQ 1 AND sz 2 EQ nz AND sz 3 EQ jpt:direc zt x y zt array sz 1 EQ nx AND sz 2 EQ ny AND sz 3 EQ jpt:direc yt xyt array ELSE:return err_3d type sz nx ny nz endcase END y :BEGIN case 1 of sz 1 EQ nx AND sz 2 EQ ny AND sz 3 EQ nz:direc xz xyz array nx EQ 1 AND sz 1 EQ ny AND sz 2 EQ nz AND sz 3 EQ jpt:direc zt x yzt array sz 1 EQ nx AND sz 2 EQ ny AND sz 3 EQ jpt:direc xt xyt array ELSE:return err_3d type sz nx ny nz endcase END z :BEGIN case 1 of sz 1 EQ nx AND sz 2 EQ ny AND sz 3 EQ nz:direc xy xyz array nx EQ 1 AND sz 1 EQ ny AND sz 2 EQ nz AND sz 3 EQ jpt:direc yt x yzt array sz 1 EQ nx AND ny EQ 1 AND sz 2 EQ nz AND sz 3 EQ jpt:direc xt x y zt array ELSE:return err_3d type sz nx ny nz endcase END t :BEGIN case 1 of sz 1 EQ nx AND sz 2 EQ ny AND sz 3 EQ jpt:direc xy xyt array nx EQ 1 AND sz 1 EQ ny AND sz 2 EQ nz AND sz 3 EQ jpt:direc yz x yzt array sz 1 EQ nx AND ny EQ 1 AND sz 2 EQ nz AND sz 3 EQ jpt:direc xz x y zt array ELSE:return err_3d type sz nx ny nz endcase END xy :BEGIN case 1 OF sz 1 EQ nx AND sz 2 EQ ny AND sz 3 EQ nz:direc z xyz array sz 1 EQ nx AND sz 2 EQ ny AND sz 3 EQ jpt:direc t xyt array ELSE:return err_3d type sz nx ny nz endcase END xz :BEGIN case 1 of sz 1 EQ nx AND sz 2 EQ ny AND sz 3 EQ nz:direc y xyz array sz 1 EQ nx AND ny EQ 1 AND sz 2 EQ nz AND sz 3 EQ jpt:direc t x y zt ELSE:return err_3d type sz nx ny nz endcase END yz :BEGIN case 1 of sz 1 EQ nx AND sz 2 EQ ny AND sz 3 EQ nz:direc x xyz array nx EQ 1 AND sz 1 EQ ny AND sz 2 EQ nz AND sz 3 EQ jpt:direc t x yzt ELSE:return err_3d type sz nx ny nz endcase END xt :BEGIN case 1 of sz 1 EQ nx AND sz 2 EQ ny AND sz 3 EQ jpt:direc y xyt array sz 1 EQ nx AND ny EQ 1 AND sz 2 EQ nz AND sz 3 EQ jpt:direc z x y zt array ELSE:return err_3d type sz nx ny nz endcase END yt :BEGIN case 1 of sz 1 EQ nx AND sz 2 EQ ny AND sz 3 EQ jpt:direc x xyt array nx EQ 1 AND sz 1 EQ ny AND sz 2 EQ nz AND sz 3 EQ jpt:direc z x yzt array ELSE:return err_3d type sz nx ny nz endcase END zt :BEGIN case 1 of sz 1 EQ nx AND ny EQ 1 AND sz 2 EQ nz AND sz 3 EQ jpt:direc x x y zt array nx EQ 1 AND sz 1 EQ ny AND sz 2 EQ nz AND sz 3 EQ jpt:direc y x yzt array ELSE:return err_3d type sz nx ny nz ENDCASE END ENDCASE END 4:BEGIN CASE type OF x :direc yzt y :direc xzt z :direc xyt t :direc xyz xy :direc zt xz :direc yt yz :direc xt xt :direc yz yt :direc xz zt :direc xy ENDCASE END ENDCASE IF keyword_set direc THEN BEGIN IF strpos direc t NE 1 OR strpos type t NE 1 THEN arr grossemoyenne temporary arr direc boxzoom localbox NAN nan NODOMDEF WDEPTH wdepth _extra ex ELSE arr moyenne temporary arr direc boxzoom localbox NAN nan NODOMDEF WDEPTH wdepth _extra ex ENDIF RETURN arr END"); a[278] = new Array("./ToBeReviewed/PLOTS/DIVERS/checktypeminmax.html", "checktypeminmax.pro", "", " file_comments categories param PROCEDURE keyword TYPE keyword MIN keyword MAX keyword XY keyword XZ keyword YZ keyword XT keyword YT keyword ZT keyword TT keyword XX keyword YY keyword ZZ keyword XINDEX keyword YINDEX keyword ENDPOINTS keyword _EXTRA Used to pass keywords returns uses common restrictions examples history Sebastien Masson smasson lodyc jussieu fr version Id: checktypeminmax pro 370 2008 08 07 07:59:15Z pinsard todo seb PRO checktypeminmax procedure TYPE type MIN min MAX max XY xy XZ xz YZ yz XT XT YT YT ZT zt TT tt XX xx YY yy ZZ zz XINDEX xindex YINDEX yindex ENDPOINTS endpoints _EXTRA ex compile_opt idl2 strictarrsubs common case size type type of 0: 7: ELSE:BEGIN vraimin type case size min type of 0:BEGIN min vraimin type 0 END 7:BEGIN type min min vraimin end ELSE:BEGIN case size max type of 0:BEGIN max min min vraimin type 0 END 7:BEGIN type max max min min vraimin end ELSE:BEGIN rien report Probleme dans la definition des arguments en entree de procedure chkwidget return end endcase end endcase end endcase if keyword_set xy then type xy if keyword_set xz then type xz if keyword_set yz then type yz if keyword_set xt then type xt if keyword_set yt then type yt if keyword_set zt then type zt if keyword_set tt then type t if keyword_set xx then type x if keyword_set yy then type y if keyword_set zz then type z if keyword_set type then begin if type EQ plt then type if type EQ pltz then type if type EQ pltt then type if type EQ plt1d then type endif determination du type de plot que l on veut faire if NOT keyword_set type then BEGIN case procedure of plt :type xy pltz :BEGIN if keyword_set endpoints then BEGIN lon1 min endpoints 0 endpoints 2 max lon2 lat1 min endpoints 1 endpoints 3 max lat2 if lon2 lon1 gt lat2 lat1 then type xz else type yz ENDIF ELSE type z END pltt :BEGIN if keyword_set endpoints then BEGIN lon1 min endpoints 0 endpoints 2 max lon2 lat1 min endpoints 1 endpoints 3 max lat2 lat2 max endpoints 1 endpoints 3 if lon2 lon1 gt lat2 lat1 then type xt else type yt ENDIF ELSE type unkownpltt END plt1d :BEGIN if keyword_set endpoints then BEGIN lon1 min endpoints 0 endpoints 2 max lon2 lat1 min endpoints 1 endpoints 3 max lat2 if lon2 lon1 gt lat2 lat1 then type x else type y ENDIF ELSE BEGIN type WHILE type NE x AND type NE y AND type NE z AND type NE t DO BEGIN type xquestion What kind of plot do you want to do x y z ou t chkwidget type strlowcase type endwhile ENDELSE END endcase ENDIF WHILE type NE xy AND type NE xz AND type NE yz AND type NE xt AND type NE yt AND type NE zt AND type NE t AND type NE x AND type NE y AND type NE z AND type NE unkownpltt DO BEGIN type xquestion What kind of plot do you want to do xy xz yz xt yt zt t x y z chkwidget type strlowcase type ENDWHILE return end"); a[279] = new Array("./ToBeReviewed/PLOTS/DIVERS/determineminmax.html", "determineminmax.pro", "", " file_comments Determine the min and the max of a mask array categories Plotting param TAB in required The array whose we determine the min and the max param MASK in required The mask array keyword MININ type scalar If it is not defined it takes the value of VRAIMIN keyword MAXIN type scalar If it is not defined it takes the value of VRAIMAX keyword ZEROMIDDLE Force the middle of the colorbar to be equal to 0 force max max abs min max and min max keyword _EXTRA Used to pass keywords keyword USETRI To force using triangulation param VRAIMIN out The min of the array param VRAIMAX out The max of the array uses common restrictions Look if the field is constant on the sea history Sebastien Masson smasson lodyc jussieu fr 11 12 98 version Id: determineminmax pro 378 2008 08 12 12:35:46Z pinsard todo seb: manque les param glam et gphi PRO determineminmax tab mask vraimin vraimax glam gphi MAXIN maxin MININ minin INTERVALLE intervalle USETRI usetri ZEROMIDDLE zeromiddle _EXTRA ex compile_opt idl2 strictarrsubs common Type of the vertical grid: if vargrid EQ W then nz nzw ELSE nz nzt liste des points mer if size mask 0 EQ 3 then mer mask 0 ELSE mer mask If key_irregular eq 1 we mask also points which are not in the geographic domain defined by lon1 lon2 lat1 lat2 if keyword_set key_irregular AND n_elements glam NE 0 AND n_elements gphi NE 0 then begin dom where glam LT lon1 OR glam GT lon2 OR gphi LT lat1 OR gphi GT lat2 if dom 0 NE 1 then mer dom 0 endif mer where mer eq 1 if mer 0 eq 1 then begin ras report Il n y a que de la terre sur le dessin vraimax 0 vraimin 0 maxin vraimax 1 minin vraimin 1 usetri 0 return endif ma and mi : max and min on ocean points vraimax max tab mer min vraimin _extra ex sameminmax testvar var minin EQ testvar var maxin if n_elements maxin EQ 0 OR sameminmax then maxin vraimax if n_elements minin EQ 0 OR sameminmax then BEGIN if keyword_set intervalle then minin floor vraimin intervalle intervalle ELSE minin vraimin endif if vraimin eq vraimax then BEGIN IF size vraimin type EQ 1 THEN vraimin fix vraimin question Warning: constant filed same value everywhere : strtrim vraimin 2 Shall we make the plot answer report question default_no question if answer then begin maxin vraimax 1 minin vraimin 1 endif ELSE tab 1 ENDIF IF keyword_set zeromiddle THEN BEGIN maxin max abs minin maxin minin maxin ENDIF return end"); a[280] = new Array("./ToBeReviewed/PLOTS/DIVERS/givewindowsize.html", "givewindowsize.pro", "", " file_comments categories returns uses restrictions examples history version Id: givewindowsize pro 325 2007 12 06 10:04:53Z pinsard todo seb FUNCTION givewindowsize compile_opt idl2 strictarrsubs cm_4ps IF NOT keyword_set key_forgetold THEN BEGIN updatenew ENDIF dimensions get_screen_size RESOLUTION resolution coef floor 1 resolution 0 if NOT keyword_set windowsize_scale then BEGIN windowsize_scale 1 IF NOT keyword_set key_forgetold THEN BEGIN updateold ENDIF ENDIF coef windowsize_scale coef mipgsz min page_size max mapgsz xsize coef mipgsz key_portrait mapgsz 1 key_portrait ysize coef mipgsz 1 key_portrait mapgsz key_portrait return xsize ysize end"); a[281] = new Array("./ToBeReviewed/PLOTS/DIVERS/meridienparallele.html", "meridienparallele.pro", "", " file_comments Trace some meridians or parallel categories Graphics param COUPE The type of drawing we treat uses common history Sebastien Masson smasson lodyc jussieu fr 11 12 98 version Id: meridienparallele pro 370 2008 08 07 07:59:15Z pinsard PRO meridienparallele coupe compile_opt idl2 strictarrsubs common case coupe of xy :BEGIN if lon1 lt 180 and lon2 gt 180 then plot 180 180 lat1 lat2 noerase color 0 if lon1 lt 0 and lon2 gt 0 then plot 0 0 lat1 lat2 noerase color 0 if lon1 lt 360 and lon2 gt 360 then plot 360 360 lat1 lat2 noerase color 0 if lat1 lt 0 and lat2 gt 0 then plot lon1 lon2 0 0 noerase color 0 END endcase return end"); a[282] = new Array("./ToBeReviewed/PLOTS/DIVERS/placecolor.html", "placecolor.pro", "", " file_comments allows to trace the independently from a graph By default trace a color bar of the same type than the one present in plt and pltz If max min and divisions are not stipulated then max sup min inf and divisions div categories Graphics param POS Vector composed by 4 elements giving coordinates of the left bottom corner and of the right up one in cm in which we want to do the color bar keyword _EXTRA Used to pass keywords uses common restrictions Only usable for Postscripts effectuated with plein2dessin history Sebastien Masson smasson lodyc jussieu fr 7 5 98 version Id: placecolor pro 378 2008 08 12 12:35:46Z pinsard todo reference to plein2dessin in restriction not understable : plein2dessin does nt exist PRO placecolor pos _EXTRA ex compile_opt idl2 strictarrsubs cm_4ps IF NOT keyword_set key_forgetold THEN BEGIN updatenew ENDIF xsave x ysave y psave p reinitplt z invert pos 1 pos mipgsz min page_size max mapgsz if key_portrait eq 1 then begin pos 0 pos 0 mipgsz pos 1 pos 1 mapgsz pos 2 pos 2 mipgsz pos 3 pos 3 mapgsz endif else begin pos 0 pos 0 mapgsz pos 1 pos 1 mipgsz pos 2 pos 2 mapgsz pos 3 pos 3 mipgsz ENDELSE def_myuniquetmpdir IF lmgr demo EQ 1 THEN BEGIN if we are in demo mode we cannot save the parameters in a temporary file cm_demomode_used colnumb colorbarparam colnumb clbinf colorbarparam clbinf clbsup colorbarparam clbsup clbdiv colorbarparam clbdiv ENDIF ELSE BEGIN file myuniquetmpdir 4colorbar dat IF file_test file THEN BEGIN restore file if size ex type EQ 8 then BEGIN if where tag_names ex EQ MIN 0 NE 1 then clbinf ex MIN if where tag_names ex EQ MAX 0 NE 1 then clbsup ex MAX if where tag_names ex EQ DIVISIONS 0 NE 1 then clbdiv ex DIVISIONS ENDIF COLORBAR COLOR 0 DIVISIONS clbdiv DISCRET colnumb cb_color 0 POSITION pos MAX clbsup MIN clbinf cb_charsize p charsize _extra ex ENDIF ENDELSE x xsave y ysave p psave return end"); a[283] = new Array("./ToBeReviewed/PLOTS/DIVERS/placedessin.html", "placedessin.pro", "", " file_comments Putting into place of the drawing opening of the window or of the PS categories Utilities param TYPEDESSIN type string It specify what procedure is called by placedessin : plt pltz or pltt param POSFENETRE out type vector containing captions and the graph in normalized coordinates Comment: To position the drawing we have to do p position posfenetre after the call of the caliber param POSBAR out type vector Like POSFENETRE but for the color bar Same comment to position the color bar p position posbar param dtasize in optional type 2 elements vector used by pltv to specify the size of the array that will be plotted and therefore the default yxaspect to be used keyword LANDSCAPE Force the page or the window on the screen to be in lengthened position keyword LCT type integer It designate the number of the palette of color we want to use for the plot keyword MAP We use it when we want to do a projection This keyword can be of two types: MAP P0lat P0lon Rot For the description of these 3 values see the online help of MAP_SET MAP: In this case map is automatically calculated have the value: map 0 lon1 lon2 2 0 Comment 1: A good way to choose the type of the projection we want to do is to have a look at IDL demo: IDL demo Then choose Mapping and Global Mapping Demo Comment 2: By default it is a cylindrical projection which is effectuated with or without the keyword map If we want an other projection MAP must be activated and we have to add the keyword: nom_projection For example for a polar projection centered on the south pole: IDL domdef 180 180 90 45 IDL plt tab stereo map 90 0 0 keyword NOCOLORBAR We active it if we do not want the colorbar keyword NOFILL We active it if we only want contours in black and white with a white background keyword NOERASE We active it to make a drawing without creating a new frame keyword SMALL Vector composed of 3 or 4 elements applied to make a drawing on a small portion of a page or screen It delimit the zone where the drawing will be done If there is 4 elements then is constituted of coordinates expressed in cm located from the up and left corner of the page or the window in portrait like in landscape of the bottom and left corner and of the up and right corner of the drawing zone If there is 3 elements we divide the page or the screen in small 0 columns and in small 1 lines the drawing is made in the box numbered small 2 The numerotation starting up and left by the number 1 and then following the writing direction By default we make the largest drawing we can do conserving the aspect ratio except when REMPLI is activated keyword PORTRAIT Force the page or the window to be in standing position keyword POST Make a postscript Only works if we made one drawing on the page If we make several drawing use ps keyword REMPLI Force the drawing to fill the whole space defined by small keyword WINDOW Number of the window on which we want to do the graph Allow to open several windows By default we open IDL0 keyword CB_TITLE The colorbar s title keyword CONTOUR If we want to trace contours of a different field than the one whose we have the colored drawing by example E P in color and QSR in contours It must be a field respecting same characteristics than the argument number one of plt keyword ENDPOINTS keyword specifying that we want to make a vertical cut in diagonal Then coordinated of extremities of these ones are defined by the 4 elements of the vector ENDPOINTS: x1 y1 x2 y2 which are coordinates keyword VECTEUR type vector It is a structure composed by 2 elements containing the 2 fields U and V of values of the zonal and meridian component of the vector of the fields to draw These fields can be an array or a structure For example: vecteur matriceu:lec unsurface matricev:lec vnsurface Comment: name of elements of vectors are inconsequential vecteur u:lec unsurface v:lec vnsurface is also appropriated keyword DIREC t x y z xys xz yz xyz xt yt zt xyt xzt yzt xyzt Direction on which do averages keyword _EXTRA Used to pass keywords keyword COLOR_C To draw the contour in color instead of in black with filling in color uses common history Sebastien Masson smasson lodyc jussieu fr 26 4 1999 version Id: placedessin pro 378 2008 08 12 12:35:46Z pinsard PRO placedessin typedessin posfenetre posbar dtasize BARMARGES barmarges NOCOLORBAR nocolorbar NOFILL nofill COLOR_c color_c CONTOUR contour VECTEUR vecteur PORTRAIT portrait LANDSCAPE landscape SMALL small MARGES marges MAP map REMPLI REMPLI POST post WINDOW window ENDPOINTS endpoints TYPE type BASICMARGES basicmarges NOERASE noerase LCT lct DIREC direc CB_TITLE cb_title _EXTRA ex compile_opt idl2 strictarrsubs cm_4ps cm_4mesh IF NOT keyword_set key_forgetold THEN BEGIN updatekwd ENDIF 1 Determination of the size of margins unity number of lines or columns to the left to the right up and down BEWARE in margebar the last element is the right up corner instead of the up margin if n_elements typedessin EQ 0 then typedessin autre if keyword_set basicmarges then begin marge 1 6 2 4 3 if keyword_set marges THEN marge marge marges margebar 1 marge 0 1 marge 1 1 marge 2 8 marge 2 6 if keyword_set barmarges then margebar margebar barmarges ENDIF ELSE BEGIN nocolorbar keyword_set nocolorbar keyword_set nofill keyword_set color_c case typedessin of plt :marge 1 6 2 4 3 pltv :marge 1 6 2 4 3 pltt :marge 1 6 4 type EQ xt 2 4 4 pltz :marge 1 6 2 4 3 else:marge 1 6 2 4 3 ENDCASE if keyword_set marges THEN marge marge marges if NOT keyword_set barmarges then barmarges replicate 0 4 barmarges 3 barmarges 3 margebar 1 marge 0 1 marge 1 1 2 4 barmarges marge marge 0 0 4 0 keyword_set cb_title IF keyword_set direc THEN marge marge 0 0 2 0 strlowcase direc NE t marge marge 0 0 2 0 keyword_set contour marge marge 0 0 2 0 keyword_set vecteur if n_elements lon1 NE 0 and n_elements lon2 NE 0 and n_elements lat1 NE 0 and n_elements lat2 NE 0 then begin if keyword_set type then marge marge 0 3 type EQ yt AND lon1 NE lon2 0 2 type NE yt AND lat1 NE lat2 keyword_set endpoints ELSE marge marge 0 0 0 2 lat1 NE lat2 keyword_set endpoints endif marge marge 0 0 2 margebar 3 0 1 keyword_set nocolorbar ENDELSE Portrait or landscape IF NOT keyword_set noerase THEN BEGIN CASE 1 OF n_elements portrait NE 0:key_portrait portrait n_elements landscape NE 0:key_portrait 1 landscape ELSE: ENDCASE ENDIF What type of aspect ratio it will be crushed if YXASPECT exist case typedessin of plt :yaspect 1 lat2 lat1 lon2 lon1 pltt :yaspect 1 pltz :yaspect 5 pltv :yaspect float dtasize 1 float dtasize 0 ELSE:yaspect 1 ENDCASE 2 calculation of p position see calibre pro IF NOT keyword_set small then small 1 1 1 if keyword_set map then rempli 1 calibre yaspect marge margebar small posfenetre posbar REMPLI rempli _extra ex p position posfenetre 3 opening of the graphic window or of the postscript case 1 of case of the first drawing on a postscript keyword_set post AND d name ne PS :openps _extra ex case of the first drawing on a screen keyword_set post EQ 0 AND keyword_set noerase EQ 0 AND d name ne PS AND d name ne Z :BEGIN if not keyword_set window then window 0 For the using of ps oups and vzoom if lmgr demo EQ 0 then BEGIN Are we in the demo mode if journal NE 0 then journal We close the journal if it is open homedir isadirectory io homedir title Bad definition of homedir def_myuniquetmpdir journal myuniquetmpdir idlsave pro We open a new one help recall_commands output listecommande We recuperate the last command listecommande strmid strcompress listecommande 1 2 journal listecommande We write it in the journal ENDIF windsize givewindowsize window window xsize windsize 0 ysize windsize 1 retain 2 _extra ex When we used colors which are coded on 24bit we can not stipulate the background color of a window thanks to p background so we have to to this: if d n_colors gt 256 then begin device decomposed 1 p background ffffff x plot 0 0 nodata xstyle 4 ystyle 4 device decomposed 0 endif END ELSE: endcase if n_elements lct NE 0 then lct lct _extra ex return end"); a[284] = new Array("./ToBeReviewed/PLOTS/DIVERS/projsegment.html", "projsegment.pro", "", " file_comments project linearly a segment a vector whose boundaries are a b on a vector whose boundaries are c d categories Calculation param VECTEUR type vector A vector whose the first element must be the smallest one and the last must be the biggest one param BORNES New boundaries of the vector keyword MP Activate this keyword to the function send back this a vector of 2 elements which are the m and p of the linear projection y mx p used to pass from the a b segment to the c d segment returns A vector whose new boundaries are specified by BORNES examples IDL a indgen 9 IDL print a 0 1 2 3 4 5 6 7 8 IDL print projsegment a 0 80 0 10 20 30 40 50 60 70 80 IDL print projsegment a 0 80 0 10 20 30 40 50 60 70 80 IDL print projsegment a 80 0 80 70 60 50 40 30 20 10 0 history Sebastien Masson smasson lodyc jussieu fr 24 6 1999 version Id: projsegment pro 327 2007 12 13 16:22:35Z pinsard FUNCTION projsegment vecteur bornes MP mp compile_opt idl2 strictarrsubs a1 float vecteur 0 b1 float vecteur n_elements vecteur 1 a2 float bornes 0 b2 float bornes 1 if a1 EQ b1 then return 1 m b2 a2 b1 a1 p a2 m a1 if keyword_set mp then return m p ELSE return m vecteur p end"); a[285] = new Array("./ToBeReviewed/PLOTS/DIVERS/restoreatt.html", "restoreatt.pro", "", " file_comments Allows to reattribute global variables associated with a field when we give a structure created by saveatt by example categories Utilities param STRUCT in required a structure like the one who read litchamp uses common restrictions Change the value if global variables attribute of a field: vargrid varname varunit vardate varexp valmask and time history Sebastien Masson smasson lodyc jussieu fr 15 6 1999 version Id: restoreatt pro 378 2008 08 12 12:35:46Z pinsard PRO restoreatt struct compile_opt idl2 strictarrsubs common nomelements tag_names struct for i 0 n_tags struct 1 do begin case strlowcase strmid nomelements i 0 1 of g :vargrid strupcase struct i n :varname struct i u :varunit struct i e :varexp struct i m :valmask struct i d :BEGIN if size struct i type EQ 7 THEN BEGIN vardate struct i ENDIF ELSE BEGIN vardate time series time struct i ENDELSE end ELSE:BEGIN ras report Le nom nomelements i ne correspont a aucun element reconnu de la structure C cf IDL xhelp litchamp end endcase endfor return end"); a[286] = new Array("./ToBeReviewed/PLOTS/DIVERS/rotation.html", "rotation.pro", "", " file_comments Rotate two vectors by a specified amount param X in required original data point pairs param Y in required original data point pairs param DEG in required degrees to rotate param NX out rotated point pairs param NY out rotated point pairs history Jeff Bennett U of Colorado version Id: rotation pro 325 2007 12 06 10:04:53Z pinsard PRO rotation X Y DEG NX NY compile_opt idl2 strictarrsubs ang deg dtor convert to polar coordinates for rotation r sqrt x x y y theta r 0 get angle in for loop so that zero radii will be left as zero angle for i 0 n_elements r 1 do if r i ne 0 then theta i atan y i x i range from pi to pi add rotation angle theta theta ang convert back to rectangular coordinates now rotated nx r cos theta ny r sin theta return end"); a[287] = new Array("./ToBeReviewed/PLOTS/DIVERS/saveatt.html", "saveatt.pro", "", " file_comments Allows to put in a structure attributes which can be associated with a variable categories Utilities returns A structure of the form: n:varname g:vargrid d:vardate e:varexp u:varunit m:valmask l:niveau uses common history Sebastien Masson smasson lodyc jussieu fr 15 6 1999 version Id: saveatt pro 378 2008 08 12 12:35:46Z pinsard FUNCTION saveatt compile_opt idl2 strictarrsubs common return n:varname g:vargrid d:vardate e:varexp u:varunit m:valmask end"); a[288] = new Array("./ToBeReviewed/PLOTS/DIVERS/terminedessin.html", "terminedessin.pro", "", " file_comments End the drawing if needed when it is a postscript categories Utilities Graphics keyword POST Make a postscript Only works if we made one drawing on the page If we make several drawing use ps keyword SMALL type vector Vector composed of 3 or 4 elements applied to make a drawing on a small portion of a page or screen It delimit the zone where the drawing will be done If there is 4 elements then is constituted of coordinates expressed in cm located from the up and left corner of the page or the window in portrait like in landscape of the bottom and left corner and of the up and right corner of the drawing zone If there is 3 elements we divide the page or the screen in small 0 columns and in small 1 lines and the drawing is made in the box numbered small 2 The numerotation starting up and left by the number 1 and then following the writing direction By default we make the largest drawing we can do conserving the aspect ration except when REMPLI is activated keyword _EXTRA Used to pass keywords uses common history Sebastien Masson smasson lodyc jussieu fr 3 6 1999 version Id: terminedessin pro 378 2008 08 12 12:35:46Z pinsard PRO terminedessin POST post SMALL small _EXTRA ex compile_opt idl2 strictarrsubs cm_4ps IF NOT keyword_set key_forgetold THEN BEGIN updatenew updatekwd ENDIF if keyword_set post then BEGIN if keyword_set small then if total small NE page_margins 2 page_margins 0 total page_size page_margins 1 page_margins 3 then return closeps printps endif return end"); a[289] = new Array("./ToBeReviewed/PLOTS/LABEL/label.html", "label.pro", "", " file_comments Allows to choose the type of the label we want to use at the time of a contour categories Graphics param CAS in required Number of the type of the label we want to trace param MIN in required Smallest value for the drawing of the contour param MAX in required Biggest value for the drawing of the contour keyword INTERVALLE default 20 Value of an interval between two isolines By default it is calculated to draw 20 isolines In all cases this keyword must be returned have a nice caption If levels do not contain regular intervals put it at 1 keyword NLEVEL default 20 Number of contour to be drawn Active if LABEL 0 or is not specified param NCONTOUR out Number of contour to be drawn param LEVEL_Z2D out Vector containing values of contours we draw param COLNUMB out Vector containing the number of colors which will serve to fill contours uses common history Sebastien Masson smasson lodyc jussieu fr 7 5 98 version Id: label pro 369 2008 08 06 15:52:18Z pinsard PRO label cas min max ncontour level_z2d colnumb NLEVEL nlevel INTERVALLE intervalle STRICTFILL strictfill compile_opt idl2 strictarrsubs common if d name EQ PS OR d name EQ Z then BEGIN old_dname d name thisOS VERSION OS_FAMILY thisOS STRMID thisOS 0 3 thisOS STRUPCASE thisOS CASE thisOS of MAC : SET_PLOT thisOS WIN : SET_PLOT thisOS ELSE: SET_PLOT X ENDCASE p BACKGROUND d n_colors 1 ncontour level_z2d min max min findgen Ncontour Ncontour colnumb ncoul findgen Ncontour Ncontour ncoul 2 ncontour intervalle level_z2d 1 level_z2d 0 end 1: begin a certain number of label from the min to the nearest possible to the max with a constant step by interval ncontour fix max min intervalle ncontour 1 ncontour level_z2d min intervalle findgen Ncontour colnumb ncoul findgen Ncontour Ncontour ncoul 2 ncontour max level_z2d Ncontour 1 intervalle end label to do same sss than dessier 2: begin lct 63 file palette tbl level_z2d 20 25 30 31 32 33 33 5 34 25 findgen 16 ncontour 23 colnumb findgen 23 1 masx 37 75 intervalle 1 return end 3: begin Readinf of intervals palette in the file GMT label_gmt min max intervalle ncoul ncontour level_z2d colnumb end else: begin ras report Le numero de label demande n existe pas end ENDCASE if keyword_set strictfill then begin ncontour ncontour 1 level_z2d level_z2d max colnumb colnumb ncoul 1 endif return end"); a[290] = new Array("./ToBeReviewed/PLOTS/LABEL/label_date.html", "label_date.pro", "", " file_comments This function labels axes with dates and times categories Plotting param AXIS in param INDEX in param X in keyword DATE_FORMAT a format string which may contain the following: M for month 3 characters abbr N for month 2 digits abbr D for day of month Y for 4 digits year Z for last two digits of year For time: H for Hours 2 digits I for Minutes 2 digits S for Seconds 2 digits is Other characters are passed directly thru For example M D Y prints DEC 11 1993 M 2Y yields DEC 93 D M yields 11 DEC D N Y yields 11 12 1993 M C Y yields DEC on the top line 1993 on the bottom C is the new line graphic command keyword MONTHS The names of the months a twelve element string array If omitted use Jan Feb Dec keyword OFFSET An optional starting offset of the plot Unfortunately single precision floating point is not accurate enough to properly represent Julian times This offset which may be double precision contains an offset that is added to all x values before conversion to Julian date and time uses restrictions Only one date axis may be simultaneously active examples For example to plot from Jan 1 1993 to July 12 1994: IDL Start_date julday 1 1 1993 IDL End_date julday 7 12 1994 IDL Simple mm dd IDL Dummy LABEL_DATE DATE_FORMAT N D IDL Time axis IDL x findgen end_date 1 start_date start_date IDL Plot with X axis style set to exact IDL PLOT x sqrt x XTICKFORMAT LABEL_DATE XSTYLE 1 Example with times: For example to plot from 3PM Jan 1 1993 to 5AM Jan 3 1993: IDL Also starting offset IDL Start_date Julday 1 1 1993 IDL Starting_time less offset IDL Start_time 3 12 24 IDL End_time Julday 1 3 1993 Start_date 5 24 IDL Ending date time offset note that the order of operations is IDL important to avoid loss of precision IDL MMM NN HH:MM format IDL Dummy LABEL_DATE DATE_FORMAT D M C H: I offset Start_date IDL Time axis IDL x findgen 20 End_time Start_time 19 start_time IDL PLOT x sqrt x XTICKFORMAT LABEL_DATE XSTYLE 1 history DMS RSI April 1993 Written DMS RSI March 1997 Added Time format Copyright c 1993 1998 Research Systems Inc All rights reserved Unauthorized reproduction prohibited version Id: label_date pro 371 2008 08 07 09:32:02Z pinsard FUNCTION label_date axis index x DATE_FORMAT format MONTHS months OFFSET offs _EXTRA ex compile_opt idl2 strictarrsubs COMMON label_date_com fmt month_chr offset if keyword_set format then begin Save format string if n_elements offs ne 0 then offset double offs else offset 0 0d0 if keyword_set months then month_chr months else month_chr Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec fmt format return 0 endif if n_elements month_chr ne 12 or n_elements fmt le 0 or n_elements offset eq 0 then message Not initialized x1 x offset caldat long x1 month day year _EXTRA ex Get the calendar date from julian frac x1 long x1 time of day from 0 to 1 n strlen fmt out for i 0 n 1 do begin Each format character c strmid fmt i 1 The character if c eq then begin i i 1 c strmid fmt i 1 The function case c of format character M : out out month_chr month 1 N : out out string format i2 2 month D : out out string format i2 2 day Y : out out string format i4 year Z : out out string format i2 2 year mod 100 H : out out string format i2 2 floor 24 frac I : out out string format i2 2 floor 1440 frac mod 60 S : out out string format i2 2 86400L frac mod 60 : out out else : message Illegal character in date format string: fmt endcase endif else out out c endfor return out end"); a[291] = new Array("./ToBeReviewed/PLOTS/LABEL/label_gmt.html", "label_gmt.pro", "", " file_comments Apply GMT palette into IDL color intervals system categories param MIN in required A real number specifying above what value we want to trace a contour param MAX in required A real number specifying below what value we want to trace a contour param INTERVALLE param NCOUL param NCONTOUR out Number of contour to be drawn param LEVEL_Z2D in required Vector containing values of isolignes to be traced param COUL restrictions examples history version Id: label_gmt pro 369 2008 08 06 15:52:18Z pinsard PRO label_gmt min max intervalle ncoul ncontour level_z2d coul compile_opt idl2 strictarrsubs common com_eg IF pal_type NE 2dom THEN BEGIN color defined in lec_pal_gmt pro ncontour ncont_gmt level_z2d levels_gmt coul coul_gmt max max_gmt intervalle 1 ENDIF ELSE BEGIN grey_shade palette case 1 in label IF finite min EQ 0 THEN read Grey shade needs a min max : min max ncontour fix max min intervalle level_z2d min intervalle findgen ncontour max level_z2d ncontour 1 intervalle ras report Number of contour intervals plotting min max string ncontour string min string max color index IF idx_pal EQ 0 THEN BEGIN build palette red lonarr 99 red 255 red 50:98 long 100 float grey_shade 100 255 IF field origin EQ diff THEN BEGIN difference plot : lighter below first negative interval red 51:98 long 100 float grey_shade_2 100 255 red 1:48 long 100 float grey_shade 100 255 red 50 255 ENDIF first color black last white red 0 red red 99 255 gray scale green red blue red tvlct red green blue ENDIF mid_index max where level_z2d LE fldatt mid coul findgen ncontour 49 mid_index 2 ENDELSE END"); a[292] = new Array("./ToBeReviewed/PLOTS/LABEL/lataxe.html", "lataxe.pro", "", " file_comments function called by XYZ TICKFORMAT see the help to see how to use it to label axes in latitude categories Graphics param AXIS It is the axis number: 0 for X axis 1 for Y axis 2 for Z axis param INDEX It is the tick mark index which starts at 0 param VALUE It is the default tick mark value a floating point number returns A string used automatically to label history Sebastien Masson smasson lodyc jussieu fr 14 10 1999 format of labels version Id: lataxe pro 369 2008 08 06 15:52:18Z pinsard FUNCTION lataxe axis index value We put back value in the segment 0 180 compile_opt idl2 strictarrsubs lat value mod 360 if lat lt 0 then lat lat 360 if lat gt 180 then lat lat 180 format of labels: case 1 of lat EQ round lat :fmt i4 10 lat EQ round 10 lat :fmt f6 1 ELSE:fmt f7 2 endcase we write the label if lat le 90 and lat ne 0 then nom string lat format fmt N if lat gt 90 then nom string 180 lat format fmt S if lat eq 0 then nom string lat format fmt return nom end"); a[293] = new Array("./ToBeReviewed/PLOTS/LABEL/lonaxe.html", "lonaxe.pro", "", " file_comments function called by XYZ TICKFORMAT see the help to see how to use it to label axes in longitude categories Graphics param AXIS It is the axis number: 0 for X axis 1 for Y axis 2 for Z axis param INDEX It is the tick mark index which starts at 0 param VALUE It is the default tick mark value a floating point number returns A string used automatically to label history Sebastien Masson smasson lodyc jussieu fr 14 10 1999 format of labels version Id: lonaxe pro 369 2008 08 06 15:52:18Z pinsard FUNCTION lonaxe axis index value We put back value in the segment 0 360 compile_opt idl2 strictarrsubs lon value mod 360 if lon lt 0 then lon lon 360 format of labels: case 1 of lon EQ round lon :fmt i4 10 lon EQ round 10 lon :fmt f6 1 ELSE:fmt f7 2 endcase we write the label if lon lt 180 then nom string lon format fmt E if lon gt 180 then nom string 360 lon format fmt W if lon eq 180 then nom string lon format fmt return nom end"); a[294] = new Array("./ToBeReviewed/PLOTS/VECTEUR/ajoutvect.html", "ajoutvect.pro", "", " file_comments Overprint vectors in a field traced by plt categories Graphics param VECTEUR in required type vector It is a structure with 2 elements containing we 2 matrices U and V of values of the zonal and meridian component of the field of vectors to be traced For ex: vecteur matriceu:lec unsurface matricev:lec vnsurface rq:the name of elements of vector does not have any importance vecteur u:lec unsurface v:lec vnsurface goes well too keyword UNVECTSUR type scalar or array It is a scalar n or an array with 2 elements n1 n2 In the first case we will trace a vector on n following x and y In the second case we will trace a vector on n1 following x and a vector n2 following n2 Comments: To trace all vectors following y and one vector on two following x put unvectsur 2 1 keyword VECTMIN in required Minimum norme of vectors to be traced keyword VECTMAX in required Maximum norme of vectors to be traced keyword _EXTRA Used to pass keywords uses common history Sebastien Masson smasson lodyc jussieu fr 10 3 1999 11 6 1999 compatibilite avec NAN et la lecture des structures version Id: ajoutvect pro 370 2008 08 07 07:59:15Z pinsard PRO ajoutvect vecteur vectlegende UNVECTSUR unvectsur VECTMIN vectmin VECTMAX vectmax _EXTRA ex compile_opt idl2 strictarrsubs common tempsun systime 1 For key_performance u litchamp vecteur 0 u checkfield u plt TYPE xy NOQUESTION v litchamp vecteur 1 v checkfield v plt TYPE xy NOQUESTION We recuperate possible informations on fields grilleu litchamp vecteur 0 grid if grilleu EQ then grilleu U grillev litchamp vecteur 1 grid if grillev EQ then grillev V IF grilleu EQ V AND grillev EQ U THEN inverse 1 IF grilleu EQ grillev THEN interpolle 0 ELSE interpolle 1 if keyword_set inverse then begin rien u u v v rien endif We find common points between u and v if interpolle then begin indicexu lindgen jpi firstxu:firstxu nxu 1 indicexv lindgen jpi firstxv:firstxv nxv 1 indicex inter indicexu indicexv indiceyu lindgen jpj firstyu:firstyu nyu 1 indiceyv lindgen jpj firstyv:firstyv nyv 1 indicey inter indiceyu indiceyv nx n_elements indicex ny n_elements indicey indice2d lindgen jpi jpj indice2d indice2d indicex 0 :indicex 0 nx 1 indicey 0 :indicey 0 ny 1 extraction of u and v on the appropriated domain case 1 of size u 0 NE 2 OR size v 0 NE 2: return size u 1 EQ nxu AND size u 2 EQ nyu AND size v 1 EQ nxv AND size v 2 EQ nyv:BEGIN if nxu NE nx then if indicex 0 EQ firstxu then u u 0:nx 1 ELSE u u 1: nx IF nxv NE nx THEN if indicex 0 EQ firstxv then v v 0:nx 1 ELSE v v 1: nx IF nyu NE ny THEN if indicey 0 EQ firstyu then u u 0:ny 1 ELSE u u 1: ny IF nyv NE ny THEN if indicey 0 EQ firstyv then v v 0:ny 1 ELSE v v 1: ny END size u 1 EQ jpi AND size u 2 EQ jpj AND size v 1 EQ jpi AND size v 2 EQ jpj:BEGIN u u indice2d v v indice2d END ELSE:BEGIN ras report problemes d adequation entre la taille du domaine et la taille des matrices necessaires a tracer des vecteurs return end endcase We reshape u and v to make sure that none dimension has been erased if ny EQ 1 then begin u reform u nx ny v reform v nx ny endif construction of u and v at points T a u 0 u u shift u 1 0 2 if NOT keyword_set key_periodic OR nx NE jpi then u 0 a a v 0 v v shift v 0 1 2 if NOT keyword_set key_periodic OR nx NE jpi then v 0 a attribution of the mask and of longitude and latitude arrays We recuperate the complete grid to establish a big mask extensive in the four directions to cover points for which a land point has been considerated do a small drawing vargrid T msku umask indice2d jpi jpj firstzt mskv vmask indice2d jpi jpj firstzt glam glamt indice2d gphi gphit indice2d if ny EQ 1 then begin msku reform msku nx ny mskv reform mskv nx ny glam reform glam nx ny gphi reform gphi nx ny endif We mask u and v the long of coasts the place where we can not calculate the average extension of the mask u u msku shift msku 1 0 v v mskv shift mskv 0 1 ENDIF ELSE BEGIN u u tmask firstxt:lastxt firstyt:lastyt firstzt v v tmask firstxt:lastxt firstyt:lastyt firstzt indice2d lindgen jpi jpj indice2d indice2d firstxt:lastxt firstyt:lastyt nx nxt ny nyt endelse tabnorme sqrt u 2 v 2 nan where finite u nan EQ 1 if nan 0 NE 1 then u nan 1e5 nan where finite v nan EQ 1 if nan 0 NE 1 then v nan 1e5 if keyword_set vectmin then BEGIN toosmall where tabnorme lt vectmin if toosmall 0 NE 1 then begin u toosmall 1e5 v toosmall 1e5 ENDIF endif if keyword_set vectmax then BEGIN toobig where tabnorme gt vectmax if toobig 0 NE 1 then begin u toobig 1e5 v toobig 1e5 ENDIF ENDIF Put back of a big value on all points for which we can do the calculation if interpolle then t2 msku shift msku 1 0 mskv shift mskv 0 1 ELSE t2 tmask firstxt:lastxt firstyt:lastyt firstzt if NOT keyword_set key_periodic OR nx NE jpi then t2 0 0 t2 0 0 terre where t2 eq 0 if terre 0 ne 1 then begin u terre 1e5 v terre 1e5 ENDIF trace only one vector one two if keyword_set unvectsur then BEGIN indx is a vector containing number of columns to be selected indy is a vector containing number of lines to be selected if n_elements unvectsur EQ 1 then begin indx where lindgen nx MOD unvectsur 0 eq 0 indy where lindgen ny MOD unvectsur 0 eq 0 ENDIF ELSE BEGIN indx where lindgen nx MOD unvectsur 0 eq 0 indy where lindgen ny MOD unvectsur 1 eq 0 ENDELSE From indx and indy we will construct an array which will give indexes of intersections points of columns specified by indx indicereduit indx replicate 1 n_elements indy nx replicate 1 n_elements indx indy We reduce arrays which will be passed to vecteur u u indicereduit v v indicereduit tabnorme tabnorme indicereduit t2 t2 indicereduit endif if keyword_set inverse then begin rien u u v v rien endif Drawing of vectors vecteur u v tabnorme indice2d indicereduit missing 1e5 _extra ex We complete the caption if terre 0 ne 1 then mini min tabnorme where t2 eq 1 max maxi nan ELSE mini min tabnorme max maxi nan if litchamp vecteur 0 u NE then vectlegende minmax: mini maxi unite:litchamp vecteur 0 u ELSE vectlegende minmax: mini maxi unite:varunit sortie: if keyword_set key_performance NE 0 THEN print temps ajoutvect systime 1 tempsun return end"); a[295] = new Array("./ToBeReviewed/PLOTS/VECTEUR/vecteur.html", "vecteur.pro", "", " file_comments categories param angle returns restrictions examples history version Id: vecteur pro 370 2008 08 07 07:59:15Z pinsard FUNCTION cv_cm2normal angle Give the length in normal coordinates of a trait oriented of an angle by rapport at the x axis and which must do 1 cm on the drawing Angle can be an array compile_opt idl2 strictarrsubs common What is the length in normal coordinates of a trait which will do 1 cm on the paper an which is parallel to x mipgsz min page_size max mapgsz sizexfeuille mipgsz key_portrait mapgsz 1 key_portrait sizeyfeuille mapgsz key_portrait mipgsz 1 key_portrait cm_en_normal 1 sizexfeuille If the aspect ratio of the window is not equal to 1 the length in normalized coordinates of a trait of 1 cm vary following the polar angle of this trait aspect sizexfeuille sizeyfeuille cm_en_normal cm_en_normal sqrt 1 aspect 2 1 sin angle 2 return cm_en_normal END file_comments categories param u param v param w restrictions examples history version Id: vecteur pro 370 2008 08 07 07:59:15Z pinsard PRO normalise u v w normalize the vector compile_opt idl2 strictarrsubs IF n_elements w NE 0 THEN BEGIN norme sqrt u 2 v 2 w 2 ind where norme NE 0 u ind u ind norme ind v ind v ind norme ind w ind w ind norme ind ENDIF ELSE BEGIN norme sqrt u 2 v 2 ind where norme NE 0 u ind u ind norme ind v ind v ind norme ind ENDELSE END file_comments Trace vectors even if they are on a deformed grid on any projection In this way all vectors have a comparable norme on the drawing to be clear a vector which measure 1 cm measure it no matter the projection and is position on the sphere categories Graphics param composanteu in required It is the u component of the vector to be traced This 2d array has the same dimension that reduitindice2d see further param composantev in required It is the v component of the vector to be traced This 2d array has the same dimension that reduitindice2d see further param normevecteur param indice2d in required It in an index allowing to to pass from an jpi or jpj array to the zoom on which we do the drawing param reduitindice2d in required It is an index allowing to pass from an array defined by indice2d to the array for which we really have vectors to be traced to be clear it is for example when we trace only one vector on two keyword CMREF default between 5 and 1 5 cm The length in cm that must measure the arrow normed normeref By default it is adjusted to other drawing and included between 5 and 1 5 cm keyword MISSING The value of a missing value Do not use this keyword Fixed at 1e5 by ajoutvect pro keyword NORMEREF The norme of the reference arrow keyword VECTCOLOR default 0 The color of the arrow Black by default color 0 keyword VECTTHICK default 1 The thick of the arrow keyword VECTREFPOS Vector composed of 2 elements specifying the position on DATA coordinates from the beginning of the reference vector By default at the right bottom of the drawing keyword VECTREFFORMAT The format to be used to specify the norme of the reference vector keyword NOVECTREF To delete the display of the reference vector keyword _EXTRA Used to pass keywords uses common history Creation : 13 02 98 G Roullet grlod lodyc jussieu fr Modification : 14 01 99 realise la transformation spheriquecartesien G Roullet 12 03 99 verification de la routine G Roullet 8 11 1999: G Roullet et Sebastien Masson smasson lodyc jussieu fr adaptation pour les zoom reverification traitement separe de la direction et de la norme des vecteurs mots cles NORMEREF et CMREF version Id: vecteur pro 370 2008 08 07 07:59:15Z pinsard PRO vecteur composanteu composantev normevecteur indice2d reduitindice2d CMREF cmref MISSING missing NORMEREF normeref VECTCOLOR vectcolor VECTTHICK vectthick VECTREFPOS vectrefpos VECTREFFORMAT vectrefformat NOVECTREF novectref _EXTRA extra compile_opt idl2 strictarrsubs common tempsun systime 1 For key_performance taille size composanteu nx taille 1 ny taille 2 if n_elements reduitindice2d EQ 0 then reduitindice2d lindgen nx ny zu composanteu zv composantev norme normevecteur taille size indice2d nxgd taille 1 nygd taille 2 msk replicate 1 nx ny if keyword_set missing then terre where abs zu GE missing 10 ELSE terre 1 if terre 0 NE 1 then BEGIN msk terre 0 zu terre 0 zv terre 0 norme terre 0 ENDIF Stage 1: Given that the directions and the sense that the vector has on the sphere we have to try to determinate this direction and the sense that the vector will have on the screen once it will have been projected In theory: on the sphere a vector in a given point has for direction the tangent at the circle passing by the center of the Earth and by the vector So find the direction once the projection is done it is find the tangent to the curve representing the projection of the circle on the 2d plan at the point representing the projection of the starting point of the sphere on the 2d plan In practice we do no know the definition of the curve given by the projection of a circle so find its tangente in a point What we do: In a 3d cartesian reference a We find coordinates of the point T starting of the arrow situed on the sphere b To each point T we determine local directions defined by the grid on this point and on which coordinates u v of the vector refer to These local directions are defined by gradients of glam and gphi Once we have obtain these directions we consider them like orthogonal and by norming them we build an orthonormal reference nu nv on which coordinates u v of the vector refer to In the starting 3d cartesian reference the vector is defined by: V u nu v nv where V nu and nv are 3d vectors and u and v are scalars c To approximate the tangente to the circle by the chord defined by the beginning and the ending of the arrow we will normalize V and then divide it by 100 d This allows us to determine coordinates of extremities of the chord in the 3d cartesian reference We pass them in spherical coordinates in order to recuperate latitude and longitude position of these points on the sphere e We pass coordinates of these points in normalized coordinates then in polar coordinates in order to find the angle and the direction they determine on the drawing Stage 1 a coordinates of the point T beginning of the arrow in spherical coordinates glam glamt indice2d reduitindice2d gphi gphit indice2d reduitindice2d Coordinates of the point T beginning of the arrow in the cartesian reference For the sphere we use a sphere with a radius of 1 radius replicate 1 nx ny coord_sphe transpose glam gphi radius r cv_coord from_sphere coord_sphe to_rect degrees x0 reform r 0 nx ny y0 reform r 1 nx ny z0 reform r 2 nx ny Stage 1 b Construction of a vector nu resp nv vectr normed carried by the axis of points u i j and u i 1 j resp v i j and v i j 1 which define for each point on the sphere local directions associated with u and v These vectors define a local orthonormal reference These vectors are built in a cartesian reference cv_coord We have choose a unity radius of the Earth unit definition of nu radius replicate 1 nxgd nygd IF finite glamu 0 gphiu 0 NE 0 THEN coord_sphe transpose glamu indice2d gphiu indice2d radius ELSE coord_sphe transpose glamf indice2d gphit indice2d radius r cv_coord from_sphere coord_sphe to_rect degrees coordinates of points of the grid u in cartesian ux reform r 0 nxgd nygd uy reform r 1 nxgd nygd uz reform r 2 nxgd nygd calculation of nu nux ux shift ux 1 0 nuy uy shift uy 1 0 nuz uz shift uz 1 0 conditions at extremities if NOT keyword_set key_periodic OR nxgd NE jpi then begin nux 0 nux 1 nuy 0 nuy 1 nuz 0 nuz 1 ENDIF reduction of the grid nux nux reduitindice2d nuy nuy reduitindice2d nuz nuz reduitindice2d definition of nv IF finite glamv 0 gphiv 0 NE 0 THEN coord_sphe transpose glamv indice2d gphiv indice2d radius ELSE coord_sphe transpose glamt indice2d gphif indice2d radius r cv_coord from_sphere coord_sphe to_rect degrees coordinates of points of the grid in cartesian vx reform r 0 nxgd nygd vy reform r 1 nxgd nygd vz reform r 2 nxgd nygd calcul of nv nvx vx shift vx 0 1 nvy vy shift vy 0 1 nvz vz shift vz 0 1 conditions at extremities nvx 0 nvx 1 nvy 0 nvy 1 nvz 0 nvz 1 reduction of the grid nvx nvx reduitindice2d nvy nvy reduitindice2d nvz nvz reduitindice2d normalization normalise nux nuy nuz normalise nvx nvy nvz Stage 1 c coordinates of the vector V in the cartesian reference direcx zu nux zv nvx direcy zu nuy zv nvy direcz zu nuz zv nvz normalization of the vector V normalise direcx direcy direcz on divide by 100 direcx direcx 100 direcy direcy 100 direcz direcz 100 Stage 1 d coordinates of the point of the arrow in the cartesian reference x1 x0 direcx y1 y0 direcy z1 z0 direcz coordinates of the point of the arrow in spherical coordinates coord_rect transpose x1 y1 z1 r cv_coord from_rect coord_rect to_sphere degrees glam1 reform r 0 nx ny gphi1 reform r 1 nx ny modification of glams Everything take place at the level of the line of changing of date BEWARE do not cut arrow which goes out of the window test: If it goes out of the frame but thanks to 360 it come in we modify it ind where glam1 LT x range 0 AND glam1 360 LE x range 1 if ind 0 NE 1 then glam1 ind glam1 ind 360 ind where glam1 GT x range 1 AND glam1 360 GE x range 0 if ind 0 NE 1 then glam1 ind glam1 ind 360 ind where glam LT x range 0 AND glam 360 LE x range 1 if ind 0 NE 1 then glam ind glam ind 360 ind where glam GT x range 1 AND glam 360 GE x range 0 if ind 0 NE 1 then glam ind glam ind 360 Stage 1 e r convert_coord glam gphi data to_normal x0 r 0 normal coordinates of the beginning of the array y0 r 1 r convert_coord glam1 gphi1 data to_normal x1 r 0 normal coordinates of the ending of the array Before scaling y1 r 1 tests to avoid that arrows be drawing out of the domain out where x0 LT p position 0 OR x0 GT p position 2 OR y0 LT p position 1 OR y0 GT p position 3 if out 0 NE 1 THEN x0 out values f_nan Following projections there may are points at NaN when we pass in normal coordinates We delete these points nan finite x0 y0 x1 y1 number where nan EQ 1 x0 x0 number x1 x1 number y0 y0 number y1 y1 number msk msk number norme norme number We define the vector direction in the normalize reference dirx x1 x0 diry y1 y0 We pass in polar coordinates to recuperate the angle which wasb the goal of all the first stage dirpol cv_coord from_rect transpose dirx diry to_polar dirpol msk dirpol 0 Stage 2 Now we take care of the norme Automatic putting at the scale if NOT keyword_set cmref then BEGIN mipgsz min page_size max mapgsz sizexfeuille mipgsz key_portrait mapgsz 1 key_portrait sizexfeuille 10 sizexfeuille cmref 5 floor sizexfeuille 10 15 cmref cmref 10 ENDIF if NOT keyword_set normeref then BEGIN value max norme puissance10 10 floor alog10 value normeref puissance10 floor value puissance10 endif cm 1 normeref cmref We modify the array norme to an element having the value cm be represented by a trait of lenght 1 cm on the paper Norme contain the norme of vectors we want to draw norme 1 1 cm norme cv_cm2normal dirpol Stage 3 Now that we have the angle and the norme we recuperate coordinates in rectangular and we draw arrows r cv_coord from_polar transpose dirpol norme to_rect composantex r 0 composantey r 1 x1 x0 composantex y1 y0 composantey Drawing if NOT KEYWORD_SET vectcolor then vectcolor 0 points where msk EQ 1 IF points 0 NE 1 THEN arrow x0 points y0 points x1 points y1 points norm hsize 2 COLOR vectcolor THICK vectthick Draw an arrow at the right bottom of the drawing as a caption if NOT keyword_set novectref then BEGIN dx cmref cv_cm2normal 0 Length of the vector of reference in normalized coordinates if keyword_set vectrefformat then normelegende strtrim string normeref format vectrefformat 1 ELSE normelegende strtrim normeref 1 if keyword_set vectrefpos then begin r convert_coord vectrefpos data to_normal x0 r 0 y0 r 1 ENDIF ELSE BEGIN x0 x window 1 dx r convert_coord d x_ch_size d y_ch_size device to_normal dy 3 r 1 p charsize y0 y window 0 dy ENDELSE arrow x0 y0 x0 dx y0 norm hsize 2 color 0 xyouts x0 y0 normelegende norm align 1 charsize p charsize color 0 endif if keyword_set key_performance NE 0 THEN print temps vecteur systime 1 tempsun return END "); a[296] = new Array("./ToBeReviewed/PLOTS/VECTEUR/velovect.html", "velovect.pro", "", " file_comments Produce a two dimensional velocity field plot A directed arrow is drawn at each point showing the direction and magnitude of the field categories Plotting two dimensional param U in required The X component of the two dimensional field U must be a two dimensional array param V in required The Y component of the two dimensional field Y must have the same dimensions as X The vector at point i j has a magnitude of: U i j 2 V i j 2 0 5 and a direction of: ATAN2 V i j U i j param X in optional type vector Optional abscissa values X must be a vector with a length equal to the first dimension of U and V param Y in optional type vector Optional ordinate values Y must be a vector with a length equal to the first dimension of U and V keyword COLOR The color index used for the plot keyword DOTS Set this keyword to 1 to place a dot at each missing point Set this keyword to 0 or omit it to draw nothing for missing points Has effect only if MISSING is specified keyword LENGTH default 1 0 Length factor The default of 1 0 makes the longest U V vector the length of a cell keyword MISSING Missing data value Vectors with a LENGTH greater than MISSING are ignored keyword OVERPLOT Set this keyword to make VELOVECT overplot That is the current graphics screen is not erased no axes are drawn and the previously established scaling remains in effect keyword CLIP keyword NOCLIP keyword _EXTRA Used to pass keywords restrictions Plotting on the selected device is performed System variables concerning plotting are changed Note: All other keywords are passed directly to the PLOT procedure and may be used to set option such as TITLE POSITION NOERASE etc history DMS RSI Oct 1983 For Sun DMS RSI April 1989 Added TITLE Oct 1990 Added POSITION NOERASE COLOR Feb 91 RES August 1993 Vince Patrick Adv Visualization Lab U of Maryland fixed errors in math August 1993 DMS Added _EXTRA keyword inheritance January 1994 KDB Fixed integer math which produced 0 and caused divide by zero errors December 1994 MWR Added _EXTRA inheritance for PLOTS and OPLOT June 1995 MWR Removed _EXTRA inheritance for PLOTS and changed OPLOT to PLOTS September 1996 GGS Changed denominator of x_step and y_step vars February 1998 DLD Add support for CLIP and NO_CLIP keywords June 1998 DLD Add support for OVERPLOT keyword Copyright c 1983 1998 Research Systems Inc All rights reserved Unauthorized reproduction prohibited version Id: velovect pro 327 2007 12 13 16:22:35Z pinsard PRO velovect u v x y MISSING missing LENGTH length DOTS dots COLOR color CLIP clip NOCLIP noclip OVERPLOT overplot _EXTRA extra compile_opt idl2 strictarrsubs on_error 2 Return to caller if an error occurs s size u t size v if s 0 ne 2 then begin baduv: message U and V parameters must be 2D and same size endif if total abs s 0:2 t 0:2 ne 0 then goto baduv if n_params 0 lt 3 then x findgen s 1 else if n_elements x ne s 1 then begin badxy: message X and Y arrays have incorrect size endif if n_params 1 lt 4 then y findgen s 2 else if n_elements y ne s 2 then goto badxy if n_elements missing le 0 then missing 1 0e30 if n_elements length le 0 then length 1 0 mag sqrt u 2 v 2 magnitude Subscripts of good elements nbad 0 of missing points if n_elements missing gt 0 then begin good where mag lt missing if keyword_set dots then bad where mag ge missing nbad endif else begin good lindgen n_elements mag endelse ugood u good vgood v good x0 min x get scaling x1 max x y0 min y y1 max y x_step x1 x0 s 1 1 0 Convert to float Integer math y_step y1 y0 s 2 1 0 could result in divide by 0 maxmag max max abs ugood x_step max abs vgood y_step sina length ugood maxmag cosa length vgood maxmag if n_elements title le 0 then title plot to get axes if n_elements color eq 0 then color p color if n_elements noclip eq 0 then noclip 1 x_b0 x0 x_step x_b1 x1 x_step y_b0 y0 y_step y_b1 y1 y_step if not keyword_set overplot then begin if n_elements position eq 0 then begin plot x_b0 x_b1 y_b1 y_b0 nodata xst yst color color _EXTRA extra endif else begin plot x_b0 x_b1 y_b1 y_b0 nodata xst yst color color _EXTRA extra endelse endif if n_elements clip eq 0 then clip x crange 0 y crange 0 x crange 1 y crange 1 r 3 len of arrow head angle 22 5 dtor Angle of arrowhead st r sin angle sin 22 5 degs length of head ct r cos angle for i 0 n_elements good 1 do begin Each point x0 x good i mod s 1 get coords of start end dx sina i x1 x0 dx y0 y good i s 1 dy cosa i y1 y0 dy xd x_step yd y_step plots x0 x1 x1 ct dx xd st dy yd xd x1 x1 ct dx xd st dy yd xd y0 y1 y1 ct dy yd st dx xd yd y1 y1 ct dy yd st dx xd yd color color clip clip noclip noclip _EXTRA extra endfor if nbad gt 0 then Dots for missing PLOTS x bad mod s 1 y bad s 1 psym 3 color color clip clip noclip noclip _EXTRA extra end"); a[297] = new Array("./ToBeReviewed/PLOTS/axe.html", "axe.pro", "", " file_comments Manage axes for the different drawings created by plt pltz and pltt categories Graphics param COUPE type string It designate the type of cut to which the axes we create must report For example: xy xt param TEMPSMIN in required In the case where we do cut containing the time dimension we have to specify the beginning of the time s axis in julian days param TEMPSMAX in required In the case where we do cut containing the time dimension we have to specify the end of the time s axis in julian days keyword SIN activated when we trace in sinus of the latitude keyword SEPDATE type string It separate the different constituents of the date By default it is a return to the line when we do a yt zt or a t In the other cases it is a blank keyword DIGITSYEAR 2 to use Z format 2 digits to code years instead of Y format 4 digits See label_date for more information on Z and Y keyword _EXTRA Used to pass keywords uses common restrictions It modify x and y history Sebastien Masson smasson lodyc jussieu fr 11 12 98 Eric Guilyardi types x y z amelioration de l axe temporel version Id: axe pro 369 2008 08 06 15:52:18Z pinsard PRO axe coupe tempsmin tempsmax REVERSE_X reverse_x REVERSE_Y reverse_y SIN sin SEPDATE sepdate DIGITSYEAR digitsyear _EXTRA ex compile_opt idl2 strictarrsubs common tempsun systime 1 pour key_performance Management of ticks of the time axis in the case of TEMPSMIN and TEMPSMAX are defined divday 0 if n_params EQ 3 then BEGIN if keyword_set sepdate then sep sepdate ELSE if coupe EQ yt OR coupe EQ zt OR coupe EQ t then sep C ELSE sep caldat tempsmin mmin dmin ymin hmin mnmin smin _EXTRA ex caldat tempsmax mmax dmax ymax hmax mnmax smax _EXTRA ex format used for the year 2 or 4 5 digits IF NOT keyword_set digitsyear THEN digitsyear 4 IF digitsyear EQ 2 THEN fmtyr Z ELSE fmtyr Y CASE 1 OF yearly base ymin NE 0 AND tempsmax GT julday mmin dmin ymin 3 hmin mnmin smin :BEGIN more than 3 years CASE 1 OF ymax ymin 1 GT 5000: BEGIN freq 500 tminor 5 datfmt fmtyr end ymax ymin 1 GT 2000: BEGIN freq 200 tminor 4 datfmt fmtyr end ymax ymin 1 GT 1000: BEGIN freq 100 tminor 5 datfmt fmtyr end ymax ymin 1 GT 500: BEGIN freq 50 tminor 5 datfmt fmtyr end ymax ymin 1 GT 200: BEGIN freq 20 tminor 4 datfmt fmtyr end ymax ymin 1 GT 100: BEGIN freq 10 tminor 5 datfmt fmtyr end ymax ymin 1 GT 50: BEGIN freq 5 tminor 5 datfmt M sep fmtyr end ymax ymin 1 GT 20: BEGIN freq 4 tminor 4 datfmt M sep fmtyr end ymax ymin 1 GT 10: BEGIN freq 2 tminor 4 datfmt M sep fmtyr end ELSE: BEGIN freq 1 tminor 4 datfmt M sep fmtyr end ENDCASE nticks ceil ymax ymin freq 2 yminf floor ymin freq freq ticknom lonarr nticks for y 0 nticks 1 do ticknom y julday 1 1 yminf y freq _EXTRA ex ticknom ticknom where ticknom GE tempsmin AND ticknom LE tempsmax nticks END monthly base tempsmax GT julday mmin 3 dmin ymin hmin mnmin smin :BEGIN more than 3 months CASE 1 OF tempsmax GT julday mmin 30 dmin ymin hmin mnmin smin :BEGIN more than 30 months ticks every 3 months freq 3 tminor 3 END tempsmax GT julday mmin 16 dmin ymin hmin mnmin smin :BEGIN more than 16 months ticks every 2 months freq 2 tminor 2 END else:BEGIN monthly ticks freq 1 tminor 6 END ENDCASE nticks ceil mmax 12 ymax ymin mmin freq 2 mminf 1 floor mmin freq freq ticknom lonarr nticks for m 0 nticks 1 do ticknom m julday mminf freq m 1 ymin _EXTRA ex datfmt M sep fmtyr ticknom ticknom where ticknom GE tempsmin AND ticknom LE tempsmax nticks END daily base tempsmax GT julday mmin dmin 3 ymin hmin mnmin smin :BEGIN more than 3 days CASE 1 OF tempsmax GT julday mmin dmin 60 ymin hmin mnmin smin :BEGIN more than 60 days ticks every 7 days freq 7 tminor 2 END tempsmax GT julday mmin dmin 30 ymin hmin mnmin smin :BEGIN more than 30 days ticks every 5 days freq 5 tminor 5 END tempsmax GT julday mmin dmin 16 ymin hmin mnmin smin :BEGIN more than 16 days ticks every 2 days freq 2 tminor 2 END ELSE:BEGIN daily ticks freq 1 tminor 2 END ENDCASE nticks ceil tempsmax tempsmin freq 2 dminf 1 floor dmin freq freq ticknom lonarr nticks for d 0 nticks 1 do ticknom d julday mmin dminf freq d ymin _EXTRA ex datfmt D sep M ticknom ticknom where ticknom GE tempsmin AND ticknom LE tempsmax nticks END hourly base tempsmax GT julday mmin dmin ymin hmin 3 mnmin smin :BEGIN more than 3 hours CASE 1 OF tempsmax GT julday mmin dmin ymin hmin 48 mnmin smin :BEGIN more than 48 hours ticks every 6 hours freq 6 tminor 3 datfmt D sep H:00 END tempsmax GT julday mmin dmin ymin hmin 30 mnmin smin :BEGIN more than 30 hours ticks every 4 hours freq 4 tminor 2 datfmt D sep H:00 END tempsmax GT julday mmin dmin ymin hmin 16 mnmin smin :BEGIN more than 16 hours ticks every 2 hours freq 2 tminor 2 datfmt H:00 END ELSE:BEGIN ticks every hour freq 1 tminor 2 datfmt H:00 END ENDCASE nticks ceil hmax 24 dmax dmin hmin freq 2 hminf floor hmin freq freq ticknom dblarr nticks for h 0 nticks 1 do ticknom h julday mmin dmin ymin hminf freq h 0 0 _EXTRA ex ticknom ticknom where ticknom GE tempsmin AND ticknom LE tempsmax nticks END minute base tempsmax GT julday mmin dmin ymin hmin mnmin 3 smin :BEGIN more than 3 minutes CASE 1 OF tempsmax GT julday mmin dmin ymin hmin mnmin 120 smin :BEGIN more than 120 minutes ticks every 10 minutes freq 10 tminor 2 END tempsmax GT julday mmin dmin ymin hmin mnmin 60 smin :BEGIN more than 60 minutes ticks every 6 minutes freq 6 tminor 3 END tempsmax GT julday mmin dmin ymin hmin mnmin 30 smin :BEGIN more than 30 minutes ticks every 4 minutes freq 4 tminor 2 END tempsmax GT julday mmin dmin ymin hmin mnmin 15 smin :BEGIN more than 15 minutes ticks every 2 minutes freq 2 tminor 2 END ELSE:BEGIN ticks every minutes freq 1 tminor 2 END ENDCASE nticks ceil mnmax 60 hmax hmin mnmin freq 2 mnminf floor mnmin freq freq ticknom dblarr nticks for mn 0 nticks 1 do ticknom mn julday mmin dmin ymin hmin mnminf freq mn 0 _EXTRA ex ticknom ticknom where ticknom GE tempsmin AND ticknom LE tempsmax nticks datfmt H: I END second base ELSE:BEGIN less than 3 minutes CASE 1 OF tempsmax GT julday mmin dmin ymin hmin mnmin smin 120 :BEGIN more than 120 seconds ticks every 20 seconds freq 20 tminor 2 datfmt H: I: S END tempsmax GT julday mmin dmin ymin hmin mnmin smin 60 :BEGIN more than 60 seconds ticks every 15 seconds freq 15 tminor 3 datfmt H: I: S END tempsmax GT julday mmin dmin ymin hmin mnmin smin 30 :BEGIN more than 30 seconds ticks every 10 seconds freq 10 tminor 2 datfmt H: I: S END tempsmax GT julday mmin dmin ymin hmin mnmin smin 15 :BEGIN more than 15 seconds ticks every 4 seconds freq 4 tminor 4 datfmt H: I: S END tempsmax GT julday mmin dmin ymin hmin mnmin smin 7 :BEGIN more than 7 seconds ticks every 2 seconds freq 2 tminor 2 datfmt H: I: S END ELSE:BEGIN ticks every minutes freq 1 tminor 2 datfmt H: I: S END ENDCASE nticks ceil smax 60 mnmax mnmin smin freq 2 sminf floor smin freq freq ticknom dblarr nticks for s 0 nticks 1 do ticknom s julday mmin dmin ymin hmin mnmin sminf freq s _EXTRA ex ticknom ticknom where ticknom GE tempsmin AND ticknom LE tempsmax nticks END ENDCASE dummy label_date 0 0 0 DATE_FORMAT datfmt _EXTRA ex if chkstru ex DATE_FORMAT then ex DATE_FORMAT ENDIF Definition of axes parameters case by case case coupe of pltv :BEGIN dtasize tempsmin x range 0 5 dtasize 0 0 5 y range 0 5 dtasize 1 0 5 if keyword_set reverse_x then x range reverse x range if keyword_set reverse_y then y range reverse y range x title nx y title ny END xy :BEGIN if keyword_set reverse_x then x range lon2 lon1 ELSE x range lon1 lon2 if keyword_set reverse_y then y range lat2 lat1 ELSE y range lat1 lat2 IF key_onearth THEN x tickformat lonaxe IF key_onearth THEN y tickformat lataxe END yz :BEGIN if keyword_set reverse_x then x range lat2 lat1 ELSE x range lat1 lat2 if keyword_set reverse_y then y range 0 1 ELSE y range 1 0 if keyword_set sin then BEGIN number of ticks by default plot 0 0 noerase nodata xtick_get xaxe We increase this number to it be around 10 ticks n_elements xaxe 1 ticks ticks 1 2 4 8 ticks ticks sort abs ticks 10 0 We recuperate the x axis for this new number of ticks plot 0 0 xticks ticks noerase nodata xtick_get xaxe x ticks ticks x tickv sin pi 180 xaxe tickname strarr ticks 1 for i 0 ticks do tickname i lataxe 0 0 xaxe i x tickname tickname x range sin pi 180 x range endif end xz :BEGIN if keyword_set reverse_x then x range lon2 lon1 ELSE x range lon1 lon2 if keyword_set reverse_y then y range 0 1 ELSE y range 1 0 end xt : begin if keyword_set reverse_x then x range lon2 lon1 ELSE x range lon1 lon2 if keyword_set reverse_y then y range tempsmax tempsmin tempsmin ELSE y range tempsmin tempsmax tempsmin IF key_onearth THEN x tickformat lonaxe result LABEL_DATE DATE_FORMAT M sep fmtyr y tickformat LABEL_DATE y tickname LABEL_DATE 1 0 ticknom _EXTRA ex y ticklen 1 y gridstyle 2 y ticks nticks 1 y tickv ticknom tempsmin y minor tminor IF divday GT 0 THEN y title Time from strtrim dmin 1 def_month 1m strtrim mmin 1 strtrim ymin 1 end yt : begin if keyword_set reverse_x then x range tempsmax tempsmin tempsmin ELSE x range tempsmin tempsmax tempsmin if keyword_set reverse_y then y range lat2 lat1 ELSE y range lat1 lat2 IF key_onearth THEN y tickformat lataxe x tickname LABEL_DATE 0 0 ticknom _EXTRA ex x ticklen 1 x gridstyle 2 x ticks nticks 1 x tickv ticknom tempsmin x minor tminor IF divday GT 0 THEN y title Time from strtrim dmin 1 def_month 1m strtrim mmin 1 strtrim ymin 1 end zt : begin if keyword_set reverse_x then x range tempsmax tempsmin tempsmin ELSE x range tempsmin tempsmax tempsmin if vargrid EQ W then gdep gdepw 0:nzw 1 ELSE gdep gdept 0:nzt 1 x tickname LABEL_DATE 0 0 ticknom _EXTRA ex x ticklen 1 x gridstyle 2 x ticks nticks 1 x tickv ticknom tempsmin x minor tminor IF divday GT 0 THEN y title Time from strtrim dmin 1 def_month 1m strtrim mmin 1 strtrim ymin 1 end t : BEGIN if keyword_set reverse_x then x range tempsmax tempsmin tempsmin ELSE x range tempsmin tempsmax tempsmin x tickname LABEL_DATE 0 0 ticknom _EXTRA ex x ticklen 1 x gridstyle 2 x ticks nticks 1 x tickv ticknom tempsmin x minor tminor IF divday GT 0 THEN y title Time from strtrim dmin 1 def_month 1m strtrim mmin 1 strtrim ymin 1 end x : begin x range lon1 lon2 IF key_onearth THEN x tickformat lonaxe END y : begin if keyword_set sin then BEGIN Number of ticks by default plot 0 0 nodata noerase xstyle 5 ystyle 5 xtick_get xaxe We increase this number to it be around 10 ticks n_elements xaxe 1 ticks ticks 1 2 4 8 ticks ticks sort abs ticks 10 0 We recuperate the x axis for this new number of ticks plot 0 0 xticks ticks nodata noerase xstyle 5 ystyle 5 xtick_get xaxe x ticks ticks x tickv sin pi 180 xaxe tickname strarr ticks 1 for i 0 ticks do tickname i lataxe 0 0 xaxe i x tickname tickname x range sin pi 180 x range ENDIF ELSE x range lat1 lat2 IF key_onearth THEN x tickformat lataxe END z : begin if vargrid EQ W then gdep gdepw 0:nzw 1 ELSE gdep gdept 0:nzt 1 if keyword_set reverse_y then y range gdep 0 gdep n_elements gdep 1 ELSE y range gdep n_elements gdep 1 gdep 0 END endcase if keyword_set key_performance THEN print temps axe systime 1 tempsun return end"); a[298] = new Array("./ToBeReviewed/PLOTS/legende.html", "legende.pro", "", " file_comments Provide caption categories Graphics param MI in required The min of the drawing param MA in required The max of the plot param COUPE type string Character containing two letters giving the type of the cut for example: xz keyword CONTOUR If we want to trace contours of a different field than the one whose we have the colored drawing by example E P in color and QSR in contours It must be a field respecting same characteristics than the argument number one of plt keyword ENDPOINTS Used when we do vertical cuts in diagonal keyword _EXTRA Used to pass keywords uses common restrictions The use of the global variable language allows to change the language and the caption easily history Sebastien Masson smasson lodyc jussieu fr 14 8 98 Eric Guilyardi ericg lodyc jussieu fr GB version 11 6 99 version Id: legende pro 378 2008 08 12 12:35:46Z pinsard PRO legende mi ma coupe CONTOUR contour ENDPOINTS endpoints DIREC direc VECTLEGENDE vectlegende INTERVALLE intervalle TYPE_YZ type_yz VARNAME2 varname2 NPTS npts _EXTRA ex compile_opt idl2 strictarrsubs common tempsun systime 1 pour key_performance grille 1 1 1 gdep nx ny nz English legends fmt_mm f12 2 fmt_bt f7 1 colorf contourf Contour plot vecteurf Vector norm expf datef fieldf depthf endpointsf Diag Section zonalf IF key_onearth THEN latintf latitudes in ELSE latintf j index in timintf time in onf depthf2 Depth m Meridf Zonal Mean IF key_onearth THEN lonintf longitudes in ELSE lonintf i in hovxt XT plot diaghovxt Diag XT plot depintf depths in timef Time hovyt YT plot diaghovyt Diag YT plot hovzt ZT plot hovt IF key_onearth THEN lontitle Longitude ELSE lontitle i index IF key_onearth THEN lattitle Latitude ELSE lattitle j index IF keyword_set TYPE_YZ THEN BEGIN vertz type_yz legniv type_yz ENDIF ELSE BEGIN vertz depthf2 legniv m ENDELSE Start legende definition and possible complement of p subtitle if n_elements varunit ne 0 then unite varunit else unite p subtitle colorf unite : Min strtrim string format fmt_mm mi 2 Max strtrim string format fmt_mm ma 2 if keyword_set intervalle then BEGIN if intervalle NE 1 then p subtitle p subtitle Int strtrim string format fmt_mm intervalle 2 endif if size contour type EQ 8 then BEGIN it is a structure unite contour 1 p subtitle p subtitle C contourf unite : Min strtrim string format fmt_mm contour 0 0 2 Max strtrim string format fmt_mm contour 0 1 2 if contour inter NE 1 then p subtitle p subtitle Int strtrim string format fmt_mm contour inter 2 ENDIF if size vectlegende type EQ 8 then begin unite vectlegende 1 p subtitle p subtitle C vecteurf unite : Min strtrim string format fmt_mm vectlegende 0 0 2 Max strtrim string format fmt_mm vectlegende 0 1 2 endif Shapping of subdomain s dimensions la1 strtrim string format fmt_bt lat1 2 la2 strtrim string format fmt_bt lat2 2 lo1 strtrim string format fmt_bt lon1 2 lo2 strtrim string format fmt_bt lon2 2 pr1 strtrim string format fmt_bt vert1 2 pr2 strtrim string format fmt_bt vert2 2 Management of the date if n_elements vardate EQ 0 then vardate if NOT keyword_set direc then direc if strpos direc t NE 1 then begin svardate strtrim vairdate time 0 1 strtrim vairdate time jpt 1 1 ENDIF ELSE svardate vardate case on the caes where the caption is applied case coupe of xy :begin if strupcase vargrid EQ W then firstz firstzw ELSE firstz firstzt if strpos direc z EQ 1 AND firstz NE 0 then BEGIN prof strtrim round gdep 0 1 p title expf varexp datef svardate fieldf varname depthf prof legniv ENDIF ELSE p title expf varexp datef svardate fieldf varname x title lontitle y title lattitle end xz :begin IF keyword_set npts THEN n strtrim npts 1 ELSE n strtrim ny 1 IF long n LE 3 THEN zonalf Section if keyword_set endpoints AND lat1 NE lat2 then p title endpointsf varexp datef svardate fieldf varname ELSE p title zonalf varexp datef svardate fieldf varname x title lontitle if keyword_set endpoints AND lat1 EQ lat2 then BEGIN IF key_onearth THEN x title x title at strtrim lataxe 0 0 lat1 1 ELSE x title x title at j index strtrim lat1 1 ENDIF y title vertz end yz :begin IF keyword_set npts THEN n strtrim npts 1 ELSE n strtrim nx 1 IF long n LE 3 THEN meridf if keyword_set endpoints AND lon1 NE lon2 then p title endpointsf varexp datef svardate fieldf varname ELSE p title meridf varexp datef svardate fieldf varname y title vertz x title lattitle if keyword_set endpoints AND lon1 EQ lon2 then BEGIN IF key_onearth THEN x title x title at strtrim lonaxe 0 0 lon1 1 ELSE x title x title at i index strtrim lon1 1 ENDIF end xt :begin IF keyword_set npts THEN n strtrim npts 1 if keyword_set endpoints AND lat1 NE lat2 then p title diaghovxt varexp fieldf varname ELSE p title hovxt varexp fieldf varname IF time size time 0 1 time 0 GE 10 THEN y title timef x title lontitle if keyword_set endpoints AND lat1 EQ lat2 then BEGIN IF key_onearth THEN x title x title at strtrim lataxe 0 0 lat1 1 ELSE x title x title at j index strtrim lat1 1 ENDIF end yt :begin IF keyword_set npts THEN n strtrim npts 1 if keyword_set endpoints AND lon1 NE lon2 then p title diaghovyt varexp fieldf varname ELSE p title hovyt varexp fieldf varname IF time size time 0 1 time 0 GE 10 THEN x title timef y title lattitle if keyword_set endpoints AND lon1 EQ lon2 then BEGIN IF key_onearth THEN x title x title at strtrim lonaxe 0 0 lon1 1 ELSE x title x title at i index strtrim lon1 1 ENDIF end zt :begin IF keyword_set npts THEN n strtrim npts 1 ELSE n strtrim nx ny 1 p title hovzt varexp fieldf varname y title vertz IF time size time 0 1 time 0 GE 10 THEN x title timef end t :begin IF keyword_set npts THEN n strtrim npts 1 ELSE BEGIN if keyword_set integration3d then n strtrim nx ny nz 1 ELSE n strtrim nx ny 1 ENDELSE p title hovt varexp fieldf varname y title varname IF time size time 0 1 time 0 GE 10 THEN x title timef end x :begin IF keyword_set npts THEN n strtrim npts 1 ELSE n strtrim ny nz 1 if keyword_set endpoints AND lat1 NE lat2 then p title endpointsf varexp datef svardate fieldf varname ELSE p title varexp datef svardate fieldf varname x title lontitle if keyword_set endpoints AND lat1 EQ lat2 then BEGIN IF key_onearth THEN x title x title at strtrim lataxe 0 0 lat1 1 ELSE x title x title at j index strtrim lat1 1 ENDIF y title varname end y :begin IF keyword_set npts THEN n strtrim npts 1 ELSE n strtrim nx nz 1 if keyword_set endpoints AND lon1 NE lon2 then p title endpointsf varexp datef svardate fieldf varname ELSE p title varexp datef svardate fieldf varname x title lattitle if keyword_set endpoints AND lon1 EQ lon2 then BEGIN IF key_onearth THEN x title x title at strtrim lonaxe 0 0 lon1 1 ELSE x title x title at i index strtrim lon1 1 ENDIF y title varname end z :begin IF keyword_set npts THEN n strtrim npts 1 ELSE n strtrim nx ny 1 p title varexp datef svardate fieldf varname y title vertz x title varname end yfx : BEGIN IF keyword_set npts THEN n strtrim npts 1 ELSE n strtrim nx ny nz 1 p title varexp datef svardate varunit x title varname2 y title varname END else: ENDCASE if keyword_set direc then BEGIN if strpos direc x NE 1 then p subtitle lonintf lo1 lo2 onf strtrim nx 1 points C p subtitle if strpos direc y NE 1 then BEGIN if strpos p subtitle EQ 1 then p subtitle latintf la1 la2 onf strtrim ny 1 points C p subtitle ELSE p subtitle latintf la1 la2 onf strtrim ny 1 points p subtitle ENDIF if strpos direc z NE 1 AND nz NE 1 OR coupe NE xy then BEGIN if strpos p subtitle EQ 1 then p subtitle depintf pr1 pr2 onf strtrim nz 1 points C p subtitle ELSE p subtitle depintf pr1 pr2 onf strtrim nz 1 points p subtitle ENDIF ENDIF if keyword_set endpoints AND coupe NE yt AND lat1 NE lat2 then p title p title C C if keyword_set key_performance THEN print temps legende systime 1 tempsun return end"); a[299] = new Array("./ToBeReviewed/PLOTS/plotsym.html", "plotsym.pro", "", " file_comments function to make plotting symbols much easier categories Graphics keyword CIRCLE circle symbol keyword TRIANGLE triangle symbol keyword DIAMOND diamond symbol keyword BOX box symbol keyword LINE line symbol keyword SCALE scales the symbol keyword ANGLE angle the symbol should be rotated keyword _EXTRA Used to pass keywords to USERSYM These are thick color and fill history Written by: Ronn Kling Ronn Kling Consulting 7038 Westmoreland Dr Warrenton VA 20187 klingrl juno com copyright 1999 all rights reserved version Id: plotsym pro 325 2007 12 06 10:04:53Z pinsard FUNCTION plotsym CIRCLE circle TRIANGLE triangle DIAMOND diamond ANGLE angle BOX box LINE line SCALE scale _EXTRA extra compile_opt idl2 strictarrsubs if not keyword_set scale then scale 1 0 if not keyword_set angle then angle 0 0 if keyword_set circle then begin theta findgen 30 29 360 endif else if keyword_set triangle then begin theta 30 90 210 30 endif else if keyword_set diamond then begin theta 0 90 180 270 0 endif else if keyword_set box then begin theta 315 45 135 225 315 endif else if keyword_set line then begin theta 180 0 endif theta theta angle x cos theta dtor scale y sin theta dtor scale usersym x y _extra extra return 8 end"); a[300] = new Array("./ToBeReviewed/PLOTS/reinitplt.html", "reinitplt.pro", "", " file_comments This procedure will reinitialize all or a selection of the system plot variables categories Utilities keyword X clear the appropriate variable keyword Y clear the appropriate variable keyword Z clear the appropriate variable keyword P clear the appropriate variable keyword ALL Clear all this is equivalent to x y z p keyword INVERT Invert the logic Clear all unselected variables Therefore reinitplt all invert does nothing uses common restrictions The system plot variables are changed history Written by: Trevor Harris Physics Dept University of Adelaide July 1990 Sebastien Masson 7 5 98 version Id: reinitplt pro 369 2008 08 06 15:52:18Z pinsard PRO reinitplt ALL all X x Y y Z z P p INVERT invert compile_opt idl2 strictarrsubs clearx 0 cleary 0 clearz 0 clearp 0 if keyword_set x then clearx 1 if keyword_set y then cleary 1 if keyword_set z then clearz 1 if keyword_set p then clearp 1 if keyword_set all or not keyword_set x and not keyword_set y and not keyword_set z and not keyword_set p then begin clearx 1 cleary 1 clearz 1 clearp 1 endif if keyword_set invert then begin clearx not clearx cleary not cleary clearz not clearz clearp not clearp endif if clearx then begin x charsize 0 x GRIDSTYLE 0 X MARGIN 10 3 X MINOR 0 X OMARGIN 0 0 x region 0 X RANGE 0 x STYLE 5 x tick 1 x TICKFORMAT x TICKLEN 0 x tickname x ticks 0 X TICKV 0 X TICKV 1 x title x TYPE 0 endif if cleary then begin y charsize 0 y GRIDSTYLE 0 Y MARGIN 10 3 Y MINOR 0 Y OMARGIN 0 0 y region 0 Y RANGE 0 y STYLE 5 y tick 1 y TICKFORMAT y TICKLEN 0 y tickname y ticks 0 Y TICKV 0 Y TICKV 1 y title y TYPE 0 endif if clearz then begin z charsize 0 z GRIDSTYLE 0 Z MARGIN 10 3 Z MINOR 0 Z OMARGIN 0 0 z region 0 Z RANGE 0 z STYLE 1 z tick 1 z TICKFORMAT z TICKLEN 0 z tickname z ticks 0 Z TICKV 0 Z TICKV 1 z title z TYPE 0 endif if clearp then begin p BACKGROUND d n_colors 1 255 p CHARSIZE 1 p CHARTHICK 0 p LINESTYLE 0 p MULTI replicate 0 5 p NOERASE 0 p POSITION 0 p region 0 p title p subtitle p ticklen 0 02 p thick 0 1 p color 0 endif return end "); a[301] = new Array("./ToBeReviewed/PLOTS/style.html", "style.pro", "", " hidden PRO thresholdstyle limit ltlstyle gtlstyle level_z2d linestyle thick compile_opt idl2 strictarrsubs dummy where level_z2d lt limit n IF n GT 0 THEN BEGIN IF limit EQ level_z2d n n_elements level_z2d 1 n linestyle replicate ltlstyle n 0 replicate gtlstyle 1 n_elements level_z2d 1 n ENDIF ELSE BEGIN thick 0 linestyle replicate ltlstyle n replicate gtlstyle 1 n_elements level_z2d n ENDELSE ENDIF ELSE BEGIN IF limit EQ level_z2d n THEN BEGIN thick 2 replicate 1 1 n_elements level_z2d 1 linestyle 0 replicate gtlstyle 1 n_elements level_z2d 1 ENDIF ELSE BEGIN thick 1 linestyle gtlstyle ENDELSE ENDELSE return end file_comments Choose the linestyle to trace iso contour Will define the keywords c_linestyle and c_thick categories Graphics param LABSTYLE in required Two kind of labelstyle are accepted: 1 A number referring to the existing choices: 0 : Two thin continuous lines one bold continuous line 1 : before the middle of levels: thin dash Then thin continuous line and bold for the middle 2 : Same as case 1 but threshold value is defined by the user by answering a question 3 : Solid Bold solid thin dash Dot thin solid thin Solid Bold 4 : Solid very thin except for contour O that is solid bold 2 for the labelstyle based on a threshold value with a style before and after the threshold value and a bold solid line for the value itself a more general definition can be given with a scalar string with the following structure: xxNN NNyy with xx and yy correspondind to one the following choices with the corresponding meaning so Solid do Dotted da Dashed dd Dash Dot ld Long Dashes and NN NN any kind of number that will define the threshold value for example do 6 6so will do dotted line until 6 6 and solid line after param LEVEL_Z2D in required Vector containing values of isolignes to be traced param LINESTYLE out Used interbally by plt z t to define c_linestyle when calling pltbase Vector used to define the isocontour s style param THICK out Used interbally by plt z t to define c_thick when calling pltbase Vector used to define the isocontour s thickness history Sebastien Masson smasson lodyc jussieu fr Oct 2007 revisiting version Id: style pro 378 2008 08 12 12:35:46Z pinsard PRO style labstyle level_z2d linestyle thick compile_opt idl2 strictarrsubs Just to remember there is the codes for c_linestyle 0 Solid 1 Dotted 2 Dashed 3 Dash Dot 4 Dash Dot Dot Dot 5 Long Dashes IF size labstyle type EQ 7 THEN BEGIN CASE strlowcase strmid labstyle 0 2 OF so :ltlstyle 0 do :ltlstyle 1 da :ltlstyle 2 dd :ltlstyle 3 ld :ltlstyle 5 ENDCASE CASE strlowcase strmid labstyle 1 2 reverse_offset OF so :gtlstyle 0 do :gtlstyle 1 da :gtlstyle 2 dd :gtlstyle 3 ld :gtlstyle 5 ENDCASE limit float strmid labstyle 2 strlen labstyle 4 thresholdstyle limit ltlstyle gtlstyle level_z2d linestyle thick ENDIF ELSE BEGIN CASE labstyle OF 0: BEGIN Two thin continuous lines one bold continuous line thick 1 1 2 linestyle 0 END 1: BEGIN Before the middle of levels: thin dash Then thin continuous line If the middle of the drawing is drawn it is in bold continuous line odd n_elements level_z2d 2 fix n_elements level_z2d 2 zero replicate 0 fix n_elements level_z2d 2 one replicate 1 fix n_elements level_z2d 2 two replicate 2 fix n_elements level_z2d 2 IF odd THEN BEGIN thick one 2 one linestyle two 0 zero ENDIF ELSE BEGIN thick 0 linestyle two zero ENDELSE END 2: BEGIN Before the threshold defined by answering to a question : thin dash Then thin continuous trait If the sill is drawn it is in boldface continuous trait limit xquestion What is the threshold value between dashed and continues line 0 limit float limit thresholdstyle limit 2 0 level_z2d linestyle thick END Solid Bold solid thin dash Dot thin solid thin Solid Bold 3: begin n n_elements level_z2d limit level_z2d 1 n 2 thick intarr n thick indgen n 4 4 1 thick indgen n 4 4 1 1 thick indgen n 4 4 2 2 thick indgen n 4 4 3 1 linestyle intarr n linestyle indgen n 4 4 3 linestyle indgen n 4 4 1 0 linestyle indgen n 4 4 2 0 linestyle indgen n 4 4 3 0 end 4: begin Boldface continuous trait limit 1 e 6 thick replicate 5 n_elements level_z2d linestyle 0 rien where abs level_z2d max abs level_z2d LT limit if rien 0 NE 1 then thick rien 0 3 end else: begin ras report Bab value of the style can be from 0 to 4 or a scalar string stop end endcase ENDELSE return end"); a[302] = new Array("./ToBeReviewed/PLOTS/symbols.html", "symbols.pro", "", " file_comments Create custom plotting symbols param NSYM in required type integer Code of sympbols : 1 open circle 2 filled circle 3 arrow pointing right 4 arrow pointing left 5 arrow pointing up 6 arrow pointing down 7 arrow pointing up and left 45 degrees 8 arrow pointing down and left 9 arrow pointing down and right 10 arrow pointing up and right 11 through 18 are bold versions of 3 through 10 19 horizontal line 20 box 21 diamond 22 triangle 30 filled box 31 filled diamond 32 filled triangle param SCALE in required size of symbols keyword COLOR color of symbols restrictions The desired symbol is stored in the user buffer and will be plotted if P PSYM 8 history Jeff Bennett U of Colorado 198 version Id: symbols pro 378 2008 08 12 12:35:46Z pinsard PRO symbols nsym scale COLOR col compile_opt idl2 strictarrsubs on_error 2 fill 0 case 1 of nsym le 2 : begin circles for large scales increase number of points for res if scale ge 4 then a findgen 25 else a findgen 13 a a 3 14159 6 0 12 or 24 pi 6 xarr cos a yarr sin a if nsym eq 2 then fill 1 end nsym ge 3 nsym le 18 : begin arrow heads xarr fltarr 5 yarr xarr xarr 1 10 xarr 2 6 yarr 2 2 nsyms greater than 10 should be filled arrows if nsym gt 10 then begin xarr 3 6 xarr 4 10 yarr 3 2 fill 1 endif else begin xarr 3 10 xarr 4 6 yarr 4 2 endelse case 1 of nsym eq 3 : dummy 0b nsym eq 4 : xarr 1 xarr nsym eq 11 nsym eq 12 : begin xarr extrac xarr 0 11 yarr extrac yarr 0 11 yarr 6 0 5 xarr 7 6 yarr 7 0 5 xarr 8 6 yarr 8 0 5 yarr 9 0 5 if nsym eq 12 then begin rotation xarr yarr 180 nx ny xarr nx yarr ny endif end nsym eq 5 nsym eq 13 : begin temp xarr xarr yarr yarr temp end nsym eq 6 nsym eq 14 : begin temp 1 xarr xarr yarr yarr temp end nsym ge 7 nsym le 10 nsym ge 15 nsym le 18 : begin case 1 of nsym eq 7 nsym eq 15 : deg 45 nsym eq 8 nsym eq 16 : deg 135 nsym eq 9 nsym eq 17 : deg 225 nsym eq 10 nsym eq 18 : deg 315 endcase rotation xarr yarr deg nx ny xarr nx yarr ny end end nsym ge 7 endcase end nsym between 3 and 18 nsym eq 20 nsym eq 21 nsym eq 30 nsym eq 31 : begin xarr fltarr 5 3 yarr xarr xarr 1 3 xarr 2 3 yarr 2 3 yarr 3 3 if nsym eq 21 nsym eq 31 then begin rotation xarr yarr 45 nx ny nx 0 70 nx shrink the x direction xarr nx yarr ny endif if nsym ge 30 then fill 1 end nsym 20 21 30 31 nsym eq 22 nsym eq 32 : begin side length 6 0 at centroid yarr fltarr 4 6 4 xarr fltarr 4 6 2 xarr 1 6 2 xarr 2 0 yarr 2 6 sqrt 3 2 6 4 if nsym eq 32 then fill 1 end else: begin xarr fltarr 2 1 yarr xarr 0 xarr 1 1 end endcase xarr xarr scale yarr yarr scale set symbol buffer if keyword_set col then usersym xarr yarr fill fill color col else usersym xarr yarr fill fill return end"); a[303] = new Array("./ToBeReviewed/POSTSCRIPT/calibre.html", "calibre.pro", "", " file_comments From a ration aspect and values in line of character of different margins it calculate POSFENETRE and POSBAR which serve to place the drawing and the color bar thanks to p position on a leaf or a screen output whose the window has the same proportion categories Graphics param rapportyx in required Scale ratio between the length of the y axis and the x one For example for an xy map: rapportyx lat2 lat1 lon2 lon1 param marge in required type vector Vector made of 4 elements containing the size of the left right up and bottom margin having to surround the graph All is measured in lines of characters param margebar in required type vector Vector made of 4 elements containing the size of the left right and bottom margin and BEWARE the last element is this time the position of the right up corner having to surround the color bar All is measured in lines of characters param smalldraw in required type vector 2 possibilities: It is vector made of 4 elements giving in portrait or landscape the position of the frame in which the drawing must go in This position is given by coordinates of the 2 corners of the frame: in the left bottom and the right up It is always for a postscript or a screen output express in cm the origin being the left bottom corner It is a vector made of 3 elements giving the number of column to be done in the drawing the number of line and the number of the case the number have to fill see matlab For example to do 6 drawings in 3 columns and 2 lines and fill the 4th case small 2 3 4 param posfenetre type vector It is a vector made of 4 elements containing the position of the frame containing captions the graph in normalized coordinates Comment: to position the drawing we have to do p position POSFENETRE after the call of calibre param posbar type vector See POSFENTERE but for the color bar Same comment to position the color bar p position POSBAR keyword REMPLI Force the drawing to fill the biggest possible place defined by SMALLDRAW without respect the y x ratio keyword YXASPECT Force the y x ratio to take the value RAPPORTYX YXASPECT This keyword can be used in 2 cases: 1 YXASPECT 1 : force RAPPORTYX to be respected otherwise calibre take the initiative to change it a little in the case of the aspect ratio of SMALL is too different of the one of SMALLDRAW 2 YXASPECT n : multiply by n the aspect ratio given by default For example in plt RAPPORTYX is calculated to the reference be orthonormal to have a reference where the y axis is 2 time bigger than the x one YXASPECT 2 keyword PORTRAIT Force the page or the window to be in standing position keyword LANDSCAPE Force the page or the window on the screen to be in lengthened position keyword _EXTRA Used to pass keywords uses common history Sebastien Masson smasson lodyc jussieu fr 11 12 98 version Id: calibre pro 378 2008 08 12 12:35:46Z pinsard PRO calibre rapportyx marge margebar smalldraw posfenetre posbar REMPLI rempli YXASPECT yxaspect PORTRAIT portrait LANDSCAPE lanscape _EXTRA ex compile_opt idl2 strictarrsubs cm_4ps IF NOT keyword_set key_forgetold THEN BEGIN updatenew updatekwd ENDIF tempsun systime 1 For key_performance if keyword_set portrait then key_portrait 1 if keyword_set landscape then key_portrait 0 if keyword_set yxaspect then begin rapportyx rapportyx yxaspect test2 0 endif else begin yxaspect 1 test2 1 ENDELSE mipgsz min page_size max mapgsz choice of Landscape or Portrait if n_elements key_portrait eq 0 then begin if rapportyx ge 1 then key_portrait 1 if rapportyx lt 1 then key_portrait 0 endif If smalldraw is count like in matlab if n_elements smalldraw EQ 3 then BEGIN IF smalldraw 2 LT 1 OR smalldraw 2 GT smalldraw 0 smalldraw 1 THEN BEGIN dummy report wrong definition of the small keyword we stop stop ENDIF if n_elements page_margins EQ 0 then page_margins 1 1 1 1 smalldraw long smalldraw nbrecol smalldraw 0 nbrelig smalldraw 1 numero smalldraw 2 1 numlig numero nbrecol numcol numero numlig nbrecol bas mipgsz key_portrait mapgsz 1 key_portrait cote mapgsz key_portrait mipgsz 1 key_portrait poscol page_margins 0 findgen nbrecol 1 1 bas page_margins 0 page_margins 1 nbrecol poslig cote page_margins 3 findgen nbrelig 1 1 cote page_margins 2 page_margins 3 nbrelig smalldraw poscol numcol poslig numlig 1 poscol numcol 1 poslig numlig endif determination of the size of characters p charsize nombre_de_mots_ds_titre 60 p charsize 1 smalldraw 2 smalldraw 0 d x_px_cm nombre_de_mots_ds_titre d y_ch_size if p charsize gt 1 then p charsize 1 transfert of margin in cm cm 1 d x_px_cm marge 1 marge d y_ch_size p charsize cm margebar 1 margebar d y_ch_size p charsize cm definition of the part of the leaf where we draw if key_portrait eq 0 then begin big smalldraw 2 smalldraw 0 small smalldraw 3 smalldraw 1 endif else begin small smalldraw 2 smalldraw 0 big smalldraw 3 smalldraw 1 endelse if key_portrait eq 0 then rapportmax 1 small marge 3 marge 1 big marge 2 marge 0 else rapportmax 1 small marge 2 marge 0 big marge 3 marge 1 If YXASPECT is not specified we modify the value of RAPPORTYX to it match better with the leaf s proportions if rapportyx le rapportmax then begin if test2 then begin rap 1 rapportmax rapportyx if rap ge 5 and rap lt 6 then rapportyx rapportyx 1 5 if rap ge 6 and rap lt 7 then rapportyx rapportyx 2 if rap ge 7 and rap lt 8 then rapportyx rapportyx 2 5 if rap ge 8 then rapportyx rapportyx 3 endif endif else begin if test2 then begin rap 1 rapportmax rapportyx if rap lt 1 5 and rap ge 1 6 then rapportyx rapportyx 1 5 if rap lt 1 6 and rap ge 1 7 then rapportyx rapportyx 2 if rap lt 1 7 and rap ge 1 8 then rapportyx rapportyx 2 5 if rap lt 1 8 then rapportyx rapportyx 3 endif endelse in the case where we do a Landscape: if key_portrait eq 0 then begin if keyword_set rempli then begin xs big ys small endif else begin if rapportyx le rapportmax then begin xs big ys 1 big marge 0 marge 1 rapportyx marge 2 marge 3 if ys gt small then begin xs 1 small marge 2 marge 3 rapportyx marge 0 marge 1 ys small endif endif else begin xs 1 small marge 2 marge 3 rapportyx marge 0 marge 1 ys small if xs gt big then begin xs big ys 1 big marge 0 marge 1 rapportyx marge 2 marge 3 endif endelse endelse xoff 1 small ys 2 smalldraw 1 yoff 1 big xs 2 xs mapgsz smalldraw 2 a 1 mapgsz yoff mapgsz b 1 xoff mipgsz c a 1 xs mapgsz d b 1 ys mipgsz endif In the case where we do a portrait: else begin if keyword_set rempli then begin xs small ys big endif else begin if rapportyx le rapportmax then begin xs small ys 1 small marge 0 marge 1 rapportyx marge 2 marge 3 if ys gt big then begin xs 1 big marge 2 marge 3 rapportyx marge 0 marge 1 ys big endif endif else begin xs 1 big marge 2 marge 3 rapportyx marge 0 marge 1 ys big if xs gt small then begin xs small ys 1 small marge 0 marge 1 rapportyx marge 2 marge 3 endif endelse endelse xoff 1 small xs 2 smalldraw 0 yoff 1 big ys 2 smalldraw 1 a 1 xoff mipgsz b 1 yoff mapgsz c a 1 xs mipgsz d b 1 ys mapgsz xset xoff yset yoff endelse bas mapgsz 1 key_portrait mipgsz key_portrait cote mipgsz 1 key_portrait mapgsz key_portrait posfenetre a b c d marge 0 bas marge 2 cote marge 1 bas marge 3 cote posbar a b c d margebar 0 bas margebar 2 cote margebar 1 bas ys margebar 3 cote if keyword_set key_performance THEN print temps calibre systime 1 tempsun IF NOT keyword_set key_forgetold THEN BEGIN updateold ENDIF return end"); a[304] = new Array("./ToBeReviewed/POSTSCRIPT/chcolps.html", "chcolps.pro", "", " file_comments categories param TABLE restrictions examples history version Id: chcolps pro 327 2007 12 13 16:22:35Z pinsard PRO format_colortable_hexa table compile_opt idl2 strictarrsubs tvlct r g b get z strarr 256 y strarr 256 for k 0 255 do z k 00 strtrim string r k format Z 2 for k 0 255 do y k y k strmid z k strlen z k 2 2 for k 0 255 do z k 00 strtrim string g k format Z 2 for k 0 255 do y k y k strmid z k strlen z k 2 2 for k 0 255 do z k 00 strtrim string b k format Z 2 for k 0 255 do y k y k strmid z k strlen z k 2 2 table strlowcase y END file_comments Build a bloc of colortable categories param TABLEOUT restrictions examples history version Id: chcolps pro 327 2007 12 13 16:22:35Z pinsard PRO build_table tableout compile_opt idl2 strictarrsubs format_colortable_hexa table tableout strarr 25 tableout 0 COLORTAB def END file_comments Modify colors of a postscript file categories param N1 in required Number of elements in the first dimension param N2 in required Number of elements in the second dimension param FILE A scalar of string type the name of the pro file to be tested if necessary the input name is completed with pro and its path found in path keyword PALIT1 keyword PALIT2 restrictions examples history G Roullet 1999 version Id: chcolps pro 327 2007 12 13 16:22:35Z pinsard PRO chcolps n1 n2 file PALIT1 palit1 PALIT2 palit2 compile_opt idl2 strictarrsubs recuperate palettes lct n1 IF keyword_set palit1 THEN palit palit1 tvlct red green blue get lct n2 IF keyword_set palit2 THEN palit palit2 tvlct red1 green1 blue1 get filein file fileout file new openr numin filein get_lun openw numout fileout get_lun ligne nl 0 colortab 0 Scan le fichier WHILE NOT eof numin DO BEGIN readf numin ligne format A nl nl 1 Replace setrgbcolor statements pos strpos ligne setrgbcolor IF pos NE 1 THEN BEGIN r round float strmid ligne pos 18 6 255 g round float strmid ligne pos 12 6 255 b round float strmid ligne pos 6 6 255 ind where r EQ red AND g EQ green AND b EQ blue ind ind 0 IF ind 0 NE 1 THEN BEGIN r1 red1 ind 255 g1 green1 ind 255 b1 blue1 ind 255 color string r1 g1 b1 format 3 F5 3 : X strput ligne color pos 18 ENDIF ELSE BEGIN ras report erreur ligne : string nl dist abs r red abs g green abs b blue ind where dist EQ min dist 0 ind ind 0 ras report I found string long r g b I replace it by string red ind green ind blue ind r1 red1 ind 255 g1 green1 ind 255 b1 blue1 ind 255 color string r1 g1 b1 format 3 F5 3 : X strput ligne color pos 18 ENDELSE ENDIF Replace COLORTAB pos strpos ligne COLORTAB IF pos NE 1 THEN BEGIN build_table table n 0 colortab 1 ENDIF IF colortab THEN BEGIN ligne table n n n 1 IF n EQ 24 THEN colortab 0 ENDIF write output file printf numout ligne format A ENDWHILE close numin close numout free_lun numin free_lun numout spawn gs fileout END "); a[305] = new Array("./ToBeReviewed/POSTSCRIPT/ps.html", "ps.pro", "", ""); a[306] = new Array("./ToBeReviewed/STATISTICS/a_correlate2d.html", "a_correlate2d.pro", "", " file_comments categories Statistics param X in required An 2 dimension Array nx ny param LAG in required 2 element vector in the intervals nx 2 nx 2 ny 2 ny 2 of type integer that specifies the absolute distance s between indexed elements of X keyword ZERO2NAN keyword DOUBLE If set to a non zero value computations are done in double precision arithmetic history 28 2 2000 Sebastien Masson smasson lodyc jussieu fr Based on the A_CORRELATE procedure of IDL version Id: a_correlate2d pro 327 2007 12 13 16:22:35Z pinsard FUNCTION auto_cov2d x lag DOUBLE double ZERO2NAN zero2nan compile_opt idl2 strictarrsubs XDim SIZE X dimensions nx XDim 0 ny XDim 1 Sample autocovariance function Xmean TOTAL X Double Double 1 nx ny res TOTAL X 0:nx 1 lag 0 0:ny 1 lag 1 Xmean X lag 0 :nx 1 lag 1 :ny 1 Xmean Double Double if keyword_set zero2nan AND res EQ 0 then res values f_nan RETURN res END file_comments This function computes the autocorrelation Px K L or autocovariance Rx K L of a sample population X nx ny as a function of the lag K L categories Statistics param X in required An 2 dimension Array nx ny param LAG in required 2 element vector in the intervals nx 2 nx 2 ny 2 ny 2 of type integer that specifies the absolute distance s between indexed elements of X keyword COVARIANCE If set to a non zero value the sample autocovariance is computed keyword DOUBLE If set to a non zero value computations are done in double precision arithmetic history 28 2 2000 Sebastien Masson smasson lodyc jussieu fr Based on the A_CORRELATE procedure of IDL version Id: a_correlate2d pro 327 2007 12 13 16:22:35Z pinsard FUNCTION a_correlate2d x lag COVARIANCE covariance DOUBLE double compile_opt idl2 strictarrsubs Compute the sample autocorrelation or autocovariance of Xt Xt l as a function of the lag l ON_ERROR 2 XDim SIZE X dimensions XNDim SIZE X n_dimensions nx XDim 0 ny XDim 1 if XNDim NE 2 then ras report X array must contain 2 dimensions Check length if nx lt 2 then ras report first dimension of X array must contain 2 or more elements if ny lt 2 then ras report second dimension of X array must contain 2 or more elements if n_elements Lag NE 2 THEN ras report Lag array must contain 2 elements If the DOUBLE keyword is not set then the internal precision and result are identical to the type of input if N_ELEMENTS Double eq 0 then Double SIZE X type eq 5 if KEYWORD_SET Covariance eq 0 then begin Compute Autocorrelation Auto Auto_Cov2d X ABS Lag Double Double Auto_Cov2d X 0L 0L Double Double zero2nan endif else begin Compute Autocovariance Auto Auto_Cov2d X ABS Lag Double Double n_elements X endelse if Double eq 0 then RETURN FLOAT Auto else RETURN Auto END"); a[307] = new Array("./ToBeReviewed/STATISTICS/a_timecorrelate.html", "a_timecorrelate.pro", "", " file_comments categories Statistics param X in required type array An array which last dimension is the time dimension so size n param M param NT keyword ZERO2NAN keyword NAN keyword DOUBLE If set to a non zero value computations are done in double precision arithmetic hidden version Id: a_timecorrelate pro 371 2008 08 07 09:32:02Z pinsard FUNCTION timeauto_cov x m nt DOUBLE double ZERO2NAN zero2nan NAN nan Sample autocovariance function compile_opt idl2 strictarrsubs IF NAN AND M GE 1 THEN STOP Warning : lagged autocorrelation is not possible at the moment for time series with NaN TimeDim size X n_dimensions Xmean NAN TOTAL X TimeDim Double Double NAN nan TOTAL FINITE X TimeDim : TOTAL X TimeDim Double Double nT one double 1 0d : 1 0 Xmean Xmean replicate one nT M Time series with NaN : only for Lag 0 case TimeDim of 1:res TOTAL X 0:nT M 1L Xmean X M:nT 1L Xmean TimeDim Double Double NAN nan 2:res TOTAL X 0:nT M 1L Xmean X M:nT 1L Xmean TimeDim Double Double NAN nan 3:res TOTAL X 0:nT M 1L Xmean X M:nT 1L Xmean TimeDim Double Double NAN nan 4:res TOTAL X 0:nT M 1L Xmean X M:nT 1L Xmean TimeDim Double Double NAN nan ENDCASE if keyword_set zero2nan then begin zero where res EQ 0 if zero 0 NE 1 then res zero values f_nan endif RETURN res END file_comments Same function as A_CORRELATE but accept array until 4 dimension for input and do the autocorrelation or the autocovariance along the time dimension which must be the last one of the input array This function computes the autocorrelation Px L or autocovariance Rx L of a sample population X as a function of the lag L categories Statistics param X in required type array An array which last dimension is the time dimension so size n param LAG in required type scalar or vector A scalar or n element vector in the interval n 2 n 2 of type integer that specifies the absolute distance s between indexed elements of X keyword COVARIANCE If set to a non zero value the sample autocovariance is computed keyword NVAL A named variable that on exit contains the number of valid observations not NAN keyword DOUBLE If set to a non zero value computations are done in double precision arithmetic examples Define an n element sample population IDL x 3 73 3 67 3 77 3 83 4 67 5 87 6 70 6 97 6 40 5 57 Compute the autocorrelation of X for LAG 3 0 1 3 4 8 IDL lag 3 0 1 3 4 8 IDL result a_correlate x lag The result should be: 0 0146185 1 00000 0 810879 0 0146185 0 325279 0 151684 history 24 2 2000 Sebastien Masson smasson lodyc jussieu fr Based on the A_CORRELATE procedure of IDL INTRODUCTION TO STATISTICAL TIME SERIES Wayne A Fuller ISBN 0 471 28715 6 version Id: a_timecorrelate pro 371 2008 08 07 09:32:02Z pinsard FUNCTION a_timecorrelate x lag COVARIANCE covariance DOUBLE double NVAL nval compile_opt idl2 strictarrsubs Compute the sample autocorrelation or autocovariance of Xt Xt l as a function of the lag l ON_ERROR 2 XDim SIZE X dimensions XNDim SIZE X n_dimensions nT XDim XNDim 1 Keyword NAN activated if needed for TimeAuto_Cov function Keyword NVAL not compulsory NAN WHERE FINITE X EQ 0 0 NE 1 1 : 0 We can retrieve the matrix of real lenghts of time series nTreal WHERE FINITE X EQ 0 0 NE 1 TOTAL FINITE X XNDim : nT IF ARG_PRESENT NVAL THEN nval nTreal Check length IF WHERE nTreal GT 1 0 EQ 1 THEN MESSAGE Matrix of length of time series must contain 2 or more elements If the DOUBLE keyword is not set then the internal precision and result are identical to the type of input type SIZE X TYPE useDouble N_ELEMENTS Double eq 1 KEYWORD_SET Double : type eq 5 if n_elements lag EQ 0 then lag 0 nLag N_ELEMENTS Lag if nLag eq 1 then Lag Lag Create a 1 element vector Type of outputs according to the type of data input case XNDim of 1: Auto useDouble DBLARR nLag : FLTARR nLag 2: Auto useDouble DBLARR XDim 0 nLag : FLTARR XDim 0 nLag 3: Auto useDouble DBLARR XDim 0 XDim 1 nLag : FLTARR XDim 0 XDim 1 nLag 4: Auto useDouble DBLARR XDim 0 XDim 1 XDim 2 nLag : FLTARR XDim 0 XDim 1 XDim 2 nLag endcase Compute lagged autocorrelation or autocovariance no NaN FOR k 0 nLag 1 DO BEGIN case XNDim of 1: BEGIN Auto k TimeAuto_Cov X ABS Lag k nT Double useDouble NAN nan KEYWORD_SET Covariance nTreal : TimeAuto_Cov X 0L nT Double useDouble zero2nan NAN nan END 2: BEGIN Auto k TimeAuto_Cov X ABS Lag k nT Double useDouble NAN nan KEYWORD_SET Covariance nTreal : TimeAuto_Cov X 0L nT Double useDouble zero2nan NAN nan END 3: BEGIN Auto k TimeAuto_Cov X ABS Lag k nT Double useDouble NAN nan KEYWORD_SET Covariance nTreal : TimeAuto_Cov X 0L nT Double useDouble zero2nan NAN nan END 4: BEGIN Auto k TimeAuto_Cov X ABS Lag k nT Double useDouble NAN nan KEYWORD_SET Covariance nTreal : TimeAuto_Cov X 0L nT Double useDouble zero2nan NAN nan END ENDCASE ENDFOR return useDouble Auto : FLOAT Auto END"); a[308] = new Array("./ToBeReviewed/STATISTICS/c_timecorrelate.html", "c_timecorrelate.pro", "", " file_comments categories Statistics param XD param YD param M param NT param NDIM keyword ZERO2NAN keyword DOUBLE If set to a non zero value computations are done in double precision arithmetic examples history version Id: c_timecorrelate pro 371 2008 08 07 09:32:02Z pinsard FUNCTION timecross_cov xd yd m nt ndim DOUBLE double ZERO2NAN zero2nan compile_opt hidden Sample cross covariance function case Ndim OF 1:res TOTAL Xd 0:nT M 1L Yd M:nT 1L Double Double 2:res TOTAL Xd 0:nT M 1L Yd M:nT 1L Ndim Double Double 3:res TOTAL Xd 0:nT M 1L Yd M:nT 1L Ndim Double Double 4:res TOTAL Xd 0:nT M 1L Yd M:nT 1L Ndim Double Double ENDCASE if keyword_set zero2nan then begin zero where res EQ 0 if zero 0 NE 1 then res zero values f_nan ENDIF RETURN res END file_comments This function computes the time cross correlation Pxy L or the time cross covariance between 2 arrays this is some kind of C_CORRELATE but for multidimensional arrays as a function of the lag L categories Statistics param X in required type array An array which last dimension is the time dimension of size n float or double param Y in required type array An array which last dimension is the time dimension of size n float or double param LAG in required type scalar or vector A scalar or n elements vector in the interval n 2 n 2 of type integer that specifies the absolute distance s between indexed elements of X keyword COVARIANCE If set to a non zero value the sample cross covariance is computed keyword DOUBLE If set to a non zero value computations are done in double precision arithmetic examples Define two n elements sample populations IDL x 3 73 3 67 3 77 3 83 4 67 5 87 6 70 6 97 6 40 5 57 IDL y 2 31 2 76 3 02 3 13 3 72 3 88 3 97 4 39 4 34 3 95 Compute the cross correlation of X and Y for LAG 5 0 1 5 6 7 IDL lag 5 0 1 5 6 7 IDL result c_timecorrelate x y lag The result should be: 0 428246 0 914755 0 674547 0 405140 0 403100 0 339685 history 01 03 2000 Sebastien Masson smasson lodyc jussieu fr Based on the C_CORRELATE procedure of IDL August 2003 Sebastien Masson update according to the update made in C_CORRELATE by W Biagiotti and available in IDL 5 5 INTRODUCTION TO STATISTICAL TIME SERIES Wayne A Fuller ISBN 0 471 28715 6 version Id: c_timecorrelate pro 371 2008 08 07 09:32:02Z pinsard FUNCTION c_timecorrelate x y lag COVARIANCE covariance DOUBLE double Compute the sample cross correlation or cross covariance of Xt Xt l and Yt Yt l as a function of the lag l ON_ERROR 2 xsize SIZE X ysize SIZE Y nt float xsize xsize 0 NDim xsize 0 if total xsize 0:xsize 0 NE ysize 0:ysize 0 NE 0 then ras report X and Y arrays must have the same size and the same dimensions Check length if nt lt 2 then ras report Time dimension of X and Y arrays must contain 2 or more elements If the DOUBLE keyword is not set then the internal precision and result are identical to the type of input if N_ELEMENTS Double eq 0 then Double Xsize Xsize 0 1 eq 5 or ysize ysize 0 1 eq 5 if n_elements lag EQ 0 then lag 0 nLag N_ELEMENTS Lag Deviations if double then one 1 0d ELSE one 1 0 Ndim size X n_dimensions Xd TOTAL X Ndim Double Double nT Xd X Xd replicate one nT Yd TOTAL Y Ndim Double Double nT Yd Y Yd replicate one nT if nLag eq 1 then Lag Lag Create a 1 element vector case NDim of 1:if Double eq 0 then Cross FLTARR nLag else Cross DBLARR nLag 2:if Double eq 0 then Cross FLTARR Xsize 1 nLag else Cross DBLARR Xsize 1 nLag 3:if Double eq 0 then Cross FLTARR Xsize 1 Xsize 2 nLag else Cross DBLARR Xsize 1 Xsize 2 nLag 4:if Double eq 0 then Cross FLTARR Xsize 1 Xsize 2 Xsize 3 nLag else Cross DBLARR Xsize 1 Xsize 2 Xsize 3 nLag endcase if KEYWORD_SET Covariance eq 0 then begin Compute Cross Crossation for k 0 nLag 1 do begin if Lag k ge 0 then BEGIN case NDim of 1: Cross k TimeCross_Cov Xd Yd Lag k nT Ndim Double Double 2: Cross k TimeCross_Cov Xd Yd Lag k nT Ndim Double Double 3: Cross k TimeCross_Cov Xd Yd Lag k nT Ndim Double Double 4: Cross k TimeCross_Cov Xd Yd Lag k nT Ndim Double Double endcase ENDIF else BEGIN case NDim of 1: Cross k TimeCross_Cov Yd Xd ABS Lag k nT Ndim Double Double 2: Cross k TimeCross_Cov Yd Xd ABS Lag k nT Ndim Double Double 3: Cross k TimeCross_Cov Yd Xd ABS Lag k nT Ndim Double Double 4: Cross k TimeCross_Cov Yd Xd ABS Lag k nT Ndim Double Double endcase ENDELSE ENDFOR div sqrt TimeCross_Cov Xd Xd 0L nT Ndim Double Double zero2nan TimeCross_Cov Yd Yd 0L nT Ndim Double Double zero2nan Cross temporary Cross temporary div replicate one nLag endif else begin Compute Cross Covariance for k 0 nLag 1 do begin if Lag k ge 0 then BEGIN case NDim of 1: Cross k TimeCross_Cov Xd Yd Lag k nT Ndim Double Double nT 2: Cross k TimeCross_Cov Xd Yd Lag k nT Ndim Double Double nT 3: Cross k TimeCross_Cov Xd Yd Lag k nT Ndim Double Double nT 4: Cross k TimeCross_Cov Xd Yd Lag k nT Ndim Double Double nT ENDCASE ENDIF else BEGIN case NDim of 1: Cross k TimeCross_Cov yd xd ABS Lag k nT Ndim Double Double nT 2: Cross k TimeCross_Cov yd xd ABS Lag k nT Ndim Double Double nT 3: Cross k TimeCross_Cov yd xd ABS Lag k nT Ndim Double Double nT 4: Cross k TimeCross_Cov yd xd ABS Lag k nT Ndim Double Double nT ENDCASE ENDELSE endfor endelse if Double eq 0 then RETURN FLOAT Cross else RETURN Cross END"); a[309] = new Array("./ToBeReviewed/STATISTICS/skewness_4d.html", "skewness_4d.pro", "", " file_comments categories Statistics param X in required type array An array which last dimension is the time dimension so size n param NT keyword DOUBLE If set to a non zero value computations are done in double precision arithmetic keyword NAN hidden version Id: skewness_4d pro 378 2008 08 12 12:35:46Z pinsard FUNCTION skewness_num x nt DOUBLE double NAN nan Compute the numerator of the skewness expression compile_opt idl2 strictarrsubs TimeDim size X n_dimensions Xmean NAN TOTAL X TimeDim Double Double NAN nan TOTAL FINITE X TimeDim : TOTAL X TimeDim Double Double nT one double 1 0d : 1 0 Xmean Xmean replicate one nT res TOTAL X Xmean 3 TimeDim Double Double NAN nan RETURN res END file_comments Same function as SKEWNESS but accept array until 4 dimension for input and perform the skewness along the time dimension which must be the last one of the input array categories Statistics param X in required type array An array which last dimension is the time dimension so size n keyword DOUBLE If set to a non zero value computations are done in double precision arithmetic keyword NVAL A named variable that on exit contains the number of valid observations not NAN examples history May 2007 Michel Kolasinski michel kolasinski locean ipsl upmc fr Based on the a_timecorrelate procedure of IDL INTRODUCTION TO STATISTICAL TIME SERIES Wayne A Fuller ISBN 0 471 28715 6 version Id: skewness_4d pro 378 2008 08 12 12:35:46Z pinsard FUNCTION skewness_4d x DOUBLE double NVAL nval compile_opt idl2 strictarrsubs Compute the skewness from 1d to 4d vectors ON_ERROR 2 XDim SIZE X dimensions XNDim SIZE X n_dimensions nT XDim XNDim 1 Keyword NAN activated if needed Keyword NVAL not compulsory NAN WHERE FINITE X EQ 0 0 NE 1 1 : 0 We can retrieve the matrix of real lenghts of time series nTreal WHERE FINITE X EQ 0 0 NE 1 TOTAL FINITE X XNDim : nT IF ARG_PRESENT NVAL THEN nval nTreal Check length IF WHERE nTreal LE 1 0 NE 1 THEN MESSAGE Matrix of length of time series must contain 2 or more elements If the DOUBLE keyword is not set then the internal precision and result are identical to the type of input type SIZE X TYPE useDouble N_ELEMENTS Double eq 1 KEYWORD_SET Double : type eq 5 Type of outputs according to the type of data input case XNDim of 1: Skew useDouble DBLARR 1 : FLTARR 1 2: Skew useDouble DBLARR XDim 0 : FLTARR XDim 0 3: Skew useDouble DBLARR XDim 0 XDim 1 : FLTARR XDim 0 XDim 1 4: Skew useDouble DBLARR XDim 0 XDim 1 XDim 2 : FLTARR XDim 0 XDim 1 XDim 2 endcase Compute standard deviation nTreal might be a matrix std a_timecorrelate X 0 covariance std sqrt std zero where std EQ 0 if zero 0 NE 1 then STOP Cannot compute skewness since there are zeros in the matrix of standard deviations Problem with high masked values x 3 makes NaN when x is high Threshold put on the values of the tab idx_std WHERE std GT 1 0e 10 X X 1 0e 10 std std 1 0e 10 Compute skewness Skew Skewness_Num X nT Double useDouble NAN nan nTreal std 3 IF idx_std 0 NE 1 THEN Skew idx_std valmask return useDouble Skew : FLOAT Skew END "); a[310] = new Array("./ToBeReviewed/STRING/chkeywd.html", "chkeywd.pro", "", " file_comments In a string containing an order to execute with EXECUTE by example We change the value of one of keywords More generally in a string we look for the character chain: keywdname and we change the value of categories String keywords param STRINGIN in required type string it is a string param KEYWDNAME in required type string it is a string designating the name of keyword to look for param KEYWDVALUE in required The new value of the keyword to considerate in STRINGIN keyword SEPARATOR To look for the keyword we look for the first sign which follow the position of keywdname By default we substitute the string before the comma With the keyword SEPARATOR we can modify the cut of the string SEPARATOR give a Character before the one we have to look for the comma which delimit the keyword in the string see examples keyword AFTER To look for the keyword we look for the first sign which follow the position of keywdname By default we substitute the string before the comma With the keyword AFTER we can modify the cut of the string AFTER give a Character after the one we have to look for the comma which delimit the keyword in the string see examples returns stringout stringin modified if keywdname has been found in stringin uses common restrictions If keywdvalue is an array it will be convert in a vector restrictions Beware this function has loops ifs and cases everywhere So it can not be used by big keywords with a lot of elements which are big arrays The input keyword must not contain Complex floatings structure Double precision complex Pointer Object reference Unsigned Integer Unsigned Longword Integer 64 bit Integer or Unsigned 64 bit Integer examples IDL b ok 111 year 1997 1998 1999 age_capitaine 35 IDL print b ok 111 year 1997 1998 1999 age_capitaine 35 IDL print chkeywd b ok c est bon ok c est bon year 1997 1998 1999 age_capitaine 35 IDL print chkeywd b YEAR indgen 5 sep ok 111 year 0 1 2 3 4 age_capitaine 35 IDL print chkeywd b YEAR indgen 5 sep after ok 111 year 0 1 2 3 4 age_capitaine 35 IDL b ok 111 year age_capitaine IDL print chkeywd b year c est bon ok 111 year c est bon age_capitaine history Sebastien Masson smasson lodyc jussieu fr 18 10 1999 24 11 1999: adaptation for keywords starting by version Id: chkeywd pro 372 2008 08 08 12:31:53Z pinsard FUNCTION chkeywd stringin keywdname keywdvalue SEPARATOR separator AFTER after compile_opt idl2 strictarrsubs stringout stringin poskeywd strpos strlowcase stringout strlowcase keywdname if poskeywd EQ 1 then return stringout while poskeywd NE 1 do BEGIN change a keyword starting by toto if strmid stringout poskeywd 1 1 EQ then BEGIN ajoute keywdname tostr keywdvalue stringout strmid stringout 0 poskeywd 1 ajoute strmid stringout poskeywd strlen keywdname poskeywd poskeywd strlen ajoute poskeywd strpos stringout keywdname poskeywd ENDIF ELSE BEGIN change a keyword sarting by toto posegal strpos stringout poskeywd if posegal EQ 1 then return stringout if NOT keyword_set separator then separator posvirgule strpos stringout separator posegal 1 if keyword_set after then posvirgule strpos stringout posvirgule 1 ELSE posvirgule rstrpos stringout posvirgule 1 if posvirgule EQ 1 then posvirgule strlen stringout stringout strmid stringout 0 posegal 1 tostr keywdvalue strmid stringout posvirgule poskeywd strpos stringout keywdname posvirgule 1 ENDELSE endwhile return stringout end"); a[311] = new Array("./ToBeReviewed/STRING/delchr.html", "delchr.pro", "", " file_comments Delete all occurrences of a character from a text string categories param OLD in required original text string param C in required character to delete keyword HELP returns new resulting string history R Sterner 5 Jul 1988 Johns Hopkins Applied Physics Lab RES 11 Sep 1989 converted to SUN R Sterner 27 Jan 1993 dropped reference to array Copyright C 1988 Johns Hopkins University Applied Physics Laboratory This software may be used copied or redistributed as long as it is not sold and this copyright notice is reproduced on each copy made This routine is provided as is without any express or implied warranties whatsoever Other limitations apply as described in the file disclaimer txt version Id: delchr pro 325 2007 12 06 10:04:53Z pinsard FUNCTION delchr old c HELP hlp compile_opt idl2 strictarrsubs if n_params 0 lt 2 or keyword_set hlp then begin ras report Delete all occurrences of a character from a text string new delchr old char old original text string in char character to delete in new resulting string out return 1 endif B BYTE OLD convert string to a byte array CB BYTE C convert char to byte w where b ne cb 0 if w 0 eq 1 then return Nothing left return string b w Return new string END"); a[312] = new Array("./ToBeReviewed/STRING/getfile.html", "getfile.pro", "", " file_comments Read a text file into a string array param filein in required text file name keyword ERROR error flag: 0 ok 1 file not opened 2 no lines in file keyword QUIET means give no error message keyword LINES Number of lines to read def all Much faster if number of lines is known Automatic for IDL 5 6 or later keyword FIND search the file in the all path directories use find keyword HELP returns history R Sterner 20 Mar 1990 R Sterner 1999 Apr 14 Added LINES n keyword R Sterner 2003 Aug 29 Automatic lines if IDL 5 6 R Sterner 2003 Sep 02 Check if file exists first R Sterner 2003 Sep 04 Fixed error in number of lines in file R Sterner 2003 Oct 10 Fixed error when no lines R Sterner 2004 Jan 27 Fixed to work in IDL as old as vers 4 S Masson smasson lodyc jussieu fr 4 Feb 2002 search the file in the all path directories use find when using find keyword Use SPAWN cat for unix os Copyright C 1990 Johns Hopkins University Applied Physics Laboratory This software may be used copied or redistributed as long as it is not sold and this copyright notice is reproduced on each copy made This routine is provided as is without any express or implied warranties whatsoever Other limitations apply as described in the file disclaimer txt version Id: getfile pro 374 2008 08 08 15:12:27Z pinsard FUNCTION getfile filein ERROR err HELP hlp QUIET quiet LINES lines FIND find compile_opt idl2 strictarrsubs if n_params 0 lt 1 or keyword_set hlp then begin ras report Read a text file into a string array s getfile f f text file name in s string array out Keywords: ERROR err error flag: 0 ok 1 file not opened 2 no lines in file QUIET means give no error message LINES n Number of lines to read def all Much faster if number of lines is known Automatic for IDL 5 6 or later return 1 endif if keyword_set find then begin file find filein file file 0 if file EQ NOT FOUND then begin print Error in getfile: File filein not found return 1 endif ENDIF ELSE file filein if version release 0 ge 5 5 then begin f call_function file_search file count c endif else begin f findfile file count c endelse if c eq 0 then begin err 1 return endif if n_elements line eq 0 and version release 0 ge 5 6 then begin lines file_lines file if lines eq 0 then begin if not keyword_set quiet then print No lines in file err 2 return 1 endif minlines 0 endif else minlines 1 get_lun lun on_ioerror err openr lun file if n_elements lines ne 0 then begin s strarr lines readf lun s endif else begin s t while not eof lun do begin readf lun t s s t endwhile endelse close lun free_lun lun if n_elements s eq minlines then begin if not keyword_set quiet then print No lines in file err 2 return 1 endif if minlines eq 1 then s s 1: err 0 return s err: if err eq 168 then begin if not keyword_set quiet then print Non standard text file format free_lun lun return s endif if not keyword_set quiet then print Error in getfile: File file not opened free_lun lun err 1 return 1 end"); a[313] = new Array("./ToBeReviewed/STRING/getwrd.html", "getwrd.pro", "", " file_comments Return the n th word from a text string categories String param TXTSTR in required type string or array of strings text string to extract from The first element is used if txt is an array param NTH in required type integer default 0 word number to get first 0 def param MTH in optional type integer optional last word number to get keyword LOCATION l Return word n string location keyword DELIMITER d Set word delimiter def space tab keyword LAST means n is offset from last word So n 0 gives last word n 1 gives next to last If n 2 and m 0 then last 3 words are returned keyword NOTRIM suppresses whitespace trimming on ends keyword NWORDS n Returns number of words in string returns wrd returned word or words uses getwrd_com restrictions If a NULL string is given txt then the last string given is used This saves finding the words again If m n wrd will be a string of words from word n to word m If no m is given wrd will be a single word nnwrds history Ray Sterner 6 Jan 1985 R Sterner Fall 1989 converted to SUN R Sterner Jan 1990 added delimiter R Sterner 18 Mar 1990 added LAST R Sterner 31 Jan 1991 added NOTRIM R Sterner 20 May 1991 Added common and NULL string R Sterner 13 Dec 1992 Made tabs equivalent to spaces R Sterner 4 Jan 1993 Added NWORDS keyword R Sterner 2001 Jan 15 Fixed to use first element if not a scalar Copyright C 1985 Johns Hopkins University Applied Physics Laboratory This software may be used copied or redistributed as long as it is not sold and this copyright notice is reproduced on each copy made This routine is provided as is without any express or implied warranties whatsoever Other limitations apply as described in the file disclaimer txt version Id: getwrd pro 374 2008 08 08 15:12:27Z pinsard FUNCTION getwrd txtstr nth mth HELP hlp LOCATION ll DELIMITER delim NOTRIM notrim LAST last NWORDS nwords common getwrd_com txtstr0 nwds loc len if n_params 0 lt 1 or keyword_set hlp then begin print Return the n th word from a text string print wrd getwrd txt n m print txt text string to extract from in print The first element is used if txt is an array print n word number to get first 0 def in print m optional last word number to get in print wrd returned word or words out print Keywords: print LOCATION l Return word n string location print DELIMITER d Set word delimiter def space tab print LAST means n is offset from last word So n 0 gives print last word n 1 gives next to last print If n 2 and m 0 then last 3 words are returned print NOTRIM suppresses whitespace trimming on ends print NWORDS n Returns number of words in string print Note: If a NULL string is given txt then the last string print given is used This saves finding the words again print If m n wrd will be a string of words from word n to print word m If no m is given wrd will be a single word print n 0 Smaller of in and im im im 0 to zero if in gt lst and im gt lst then return Out of range in in lst Larger of in and im im im lst to be last ll loc in Nth word start return strtrim strmid txtstr0 ll loc im loc in len im 2 endif N ABS NTH Allow nth 0 IF N GT NWDS 1 THEN RETURN out of range null ll loc n N th word position IF NTH LT 0 THEN GOTO NEG Handle nth 0 IF MTH GT NWDS 1 THEN MTH NWDS 1 Words to end if keyword_set notrim then begin RETURN STRMID TXTSTR0 ll LOC MTH LOC NTH LEN MTH endif else begin RETURN strtrim STRMID TXTSTR0 ll LOC MTH LOC NTH LEN MTH 2 endelse NEG: if keyword_set notrim then begin RETURN STRMID TXTSTR0 ll 9999 endif else begin RETURN strtrim STRMID TXTSTR0 ll 9999 2 endelse END"); a[314] = new Array("./ToBeReviewed/STRING/isnumber.html", "isnumber.pro", "", " file_comments Determine if a text string is a valid number categories param TXT0 in required text string to test param X in required keyword HELP returns x optionaly returned numeric value if valid i test flag: 0: not a number 1: txt is a long integer 2: txt is a float 1: first word of txt is a long integer 2: first word of txt is a float history R Sterner 15 Oct 1986 Johns Hopkins Applied Physics Lab R Sterner 12 Mar 1990 upgraded Richard Garrett 14 June 1992 fixed bug in returned float value R Sterner 1999 Nov 30 Fixed a bug found by Kristian Kjaer Denmark Copyright C 1986 Johns Hopkins University Applied Physics Laboratory This software may be used copied or redistributed as long as it is not sold and this copyright notice is reproduced on each copy made This routine is provided as is without any express or implied warranties whatsoever Other limitations apply as described in the file disclaimer txt version Id: isnumber pro 372 2008 08 08 12:31:53Z pinsard FUNCTION isnumber txt0 x HELP hlp compile_opt idl2 strictarrsubs if n_params 0 lt 1 or keyword_set hlp then begin print Determine if a text string is a valid number print i isnumber txt x print txt text string to test in print x optionaly returned numeric value if valid out print i test flag: out print 0: not a number print 1: txt is a long integer print 2: txt is a float print 1: first word of txt is a long integer print 2: first word of txt is a float return 1 endif txt strtrim txt0 2 trim blanks x 0 define X if txt eq then return 0 null string not a number sn 1 if nwrds txt gt 1 then begin get first word if more than one sn 1 txt getwrd txt 0 endif f_flag 0 Floating flag b byte txt Convert to byte array if b 0 eq 45 then b b 1: Drop leading Kristian Kjaer if b 0 eq 43 then b b 1: Drop leading bug fix w where b eq 43 cnt Look for if cnt gt 1 then return 0 Allow only 1 t delchr txt Drop it w where b eq 45 cnt Look for if cnt gt 1 then return 0 Allow only 1 t delchr t Drop it w where b eq 46 cnt Look for if cnt gt 1 then return 0 Allow only 1 if cnt eq 1 then f_flag 1 If one then floating t delchr t Drop it w where b eq 101 cnt Look for e if cnt gt 1 then return 0 Allow only 1 if cnt eq 1 then f_flag 1 If 1 then assume float t delchr t e Drop it w where b eq 69 cnt Look for E if cnt gt 1 then return 0 Allow only 1 if cnt eq 1 then f_flag 1 If 1 then assume float t delchr t E Drop it w where b eq 100 cnt Look for d if cnt gt 1 then return 0 Allow only 1 if cnt eq 1 then f_flag 1 If 1 then assume float t delchr t d Drop it w where b eq 68 cnt Look for D if cnt gt 1 then return 0 Allow only 1 if cnt eq 1 then f_flag 1 If 1 then assume float t delchr t D Drop it Allow only one e E d or D if total b eq 101 b eq 69 b eq 100 b eq 68 gt 1 then return 0 b byte t Allow no alphabetic characters if total b ge 65 and b le 122 ne 0 then return 0 c strmid t 0 1 if c lt 0 or c gt 9 then return 0 First char not a digit x txt 0 0 Convert to a float if f_flag eq 1 then return 2 sn Was floating if x eq long x then begin x long x return sn endif else begin return 2 sn endelse end"); a[315] = new Array("./ToBeReviewed/STRING/lenstr.html", "lenstr.pro", "", " ROUTINE: lenstr USEAGE: result lenstr str input: str a single string or string array output: result length of the string s in normalized units the number of elements of RESULT matches the number of elements of STRING procedure: This function returns the physical length of the string on the output device not the number of characters This is done by first switching to X and writing the string s with XYOUTS in graphics mode 5 which disables display to the screen but does not interfere with operation of XYOUTS The WIDTH keyword parameter of XYOUTS is used to retrieve the physical length of the string s author: Paul Ricchiazzi 7apr93 Institute for Computational Earth System Science University of California Santa Barbara todo seb FUNCTION lenstr str compile_opt idl2 strictarrsubs dsave d name thisOS VERSION OS_FAMILY thisOS STRMID thisOS 0 3 thisOS STRUPCASE thisOS CASE thisOS of MAC : SET_PLOT thisOS WIN : SET_PLOT thisOS ELSE: SET_PLOT X ENDCASE p BACKGROUND d n_colors 1 255 p color 0 if d n_colors gt 256 then p background ffffff x device get_graphics oldg set_graphics 5 if keyword_set charsize eq 0 then charsize 1 nn n_elements str case nn of 0:w 0 1:xyouts 0 0 device str width w else:begin w fltarr nn for i 0 nn 1 do begin xyouts 0 0 device str i width ww w i ww endfor end endcase fac1 float d x_ch_size d x_vsize ratio of char width to device1 width device set_graphics oldg set_plot dsave IF dsave EQ X OR dsave EQ MAC OR dsave EQ WIN then BEGIN p BACKGROUND d n_colors 1 255 p color 0 if d n_colors gt 256 then p background ffffff x ENDIF fac2 float d x_ch_size d x_vsize ratio of char width to device2 width return w fac2 fac1 string width adjusted for device width end "); a[316] = new Array("./ToBeReviewed/STRING/nwrds.html", "nwrds.pro", "", " file_comments Return the number of words in the given text string categories param TXTSTR text string to examine keyword DELIMITER d Set delimiter character def space keyword HELP returns n number of words found restrictions See also getwrd history R Sterner 7 Feb 1985 Johns Hopkins University Applied Physics Laboratory RES 4 Sep 1989 converted to SUN Copyright C 1985 Johns Hopkins University Applied Physics Laboratory This software may be used copied or redistributed as long as it is not sold and this copyright notice is reproduced on each copy made This routine is provided as is without any express or implied warranties whatsoever Other limitations apply as described in the file disclaimer txt version Id: nwrds pro 372 2008 08 08 12:31:53Z pinsard FUNCTION nwrds txtstr HELP hlp DELIMITER delim compile_opt idl2 strictarrsubs if n_params 0 lt 1 or keyword_set hlp then begin print Return the number of words in the given text string print n nwrds txt print txt text string to examine in print n number of words found out print Keywords: print DELIMITER d Set delimiter character def space print Notes: See also getwrd return 1 endif if strlen txtstr eq 0 then return 0 A null string has 0 words ddel Default word delimiter is a space if n_elements delim ne 0 then ddel delim Use given word delimiter tst byte ddel 0 Delimiter as a byte value tb byte txtstr String to bytes if ddel eq then begin Check for tabs w where tb eq 9B cnt Yes if cnt gt 0 then tb w 32B Convert any to space endif x tb ne tst Locate words x 0 x 0 Pad ends with delimiters y x shift x 1 eq 1 Look for word beginnings n fix total y Count word beginnings return n end"); a[317] = new Array("./ToBeReviewed/STRING/putfile.html", "putfile.pro", "", " file_comments Write a text file from a string array categories param FILE in required type string text file name param S in required type string or array string array keyword ERROR error flag: 0 ok 1 invalid string array history R Sterner 20 Mar 1990 R Sterner 4 Nov 1992 allowed scalar strings Copyright C 1990 Johns Hopkins University Applied Physics Laboratory This software may be used copied or redistributed as long as it is not sold and this copyright notice is reproduced on each copy made This routine is provided as is without any express or implied warranties whatsoever Other limitations apply as described in the file disclaimer txt version Id: putfile pro 374 2008 08 08 15:12:27Z pinsard PRO putfile file s ERROR err HELP hlp compile_opt idl2 strictarrsubs if n_params 0 lt 1 or keyword_set hlp then begin print Write a text file from a string array print putfile f s print f text file name in print s string array in print Keywords: print ERROR err error flag: 0 ok 1 invalid string array return endif if lmgr demo then begin print you are in Demo mode It is impossible to write a file return endif if size s type ne 7 then begin print Error in putfile: argument must be a string array err 1 return endif get_lun lun openw lun file for i 0 n_elements s 1 do begin t s i if t eq then t printf lun t endfor close lun free_lun lun err 0 return end"); a[318] = new Array("./ToBeReviewed/STRING/str_size.html", "str_size.pro", "", " file_comments The purpose of this function is to return the proper character size to make a specified string a specified width in a window The width is specified in normalized coordinates The function is extremely useful for sizing strings and labels in resizeable graphics windows categories Graphics Widget param STRING in required This is the string that you want to make a specified target size or width param TARGETWIDTH in optional default 0 25 This is the target width of the string in normalized coordinates in the current graphics window The character size of the string returned as thisCharSize will be calculated to get the string width as close as possible to the target width keyword INITSIZE default 1 0 This is the initial size of the string Default is 1 0 keyword STEP default 0 05 This is the amount the string size will change in each step of the interactive process of calculating the string size returns thisCharSize This is the size the specified string should be set to if you want to produce output of the specified target width The value is in standard character size units where 1 0 is the standard character size examples To make the string Happy Holidays take up 30 of the width of the current graphics window type this: IDL XYOUTS 0 5 0 5 ALIGN 0 5 Happy Holidays CHARSIZE STR_SIZE Happy Holidays 0 3 history Written by: David Fanning 17 DEC 96 Added a scaling factor to take into account the aspect ratio of the window in determining the character size 28 Oct 97 DWF version Id: str_size pro 372 2008 08 08 12:31:53Z pinsard FUNCTION str_size string targetwidth INITSIZE initsize STEP step compile_opt idl2 strictarrsubs ON_ERROR 1 Check positional parameters np N_PARAMS CASE np OF 0: MESSAGE One string parameter is required 1: targetWidth 0 25 ELSE: ENDCASE Check keywords Assign default values IF N_ELEMENTS step EQ 0 THEN step 0 05 IF N_ELEMENTS initsize EQ 0 THEN initsize 1 0 Calculate a trial width size initsize XYOUTS 0 5 0 5 ALIGN 0 5 string WIDTH thisWidth CHARSIZE size NORMAL Size is perfect IF thisWidth EQ targetWidth THEN RETURN size Float D Y_Size D X_Size Initial size is too big IF thisWidth GT targetWidth THEN BEGIN REPEAT BEGIN XYOUTS 0 5 0 5 ALIGN 0 5 string WIDTH thisWidth CHARSIZE size NORMAL size size step ENDREP UNTIL thisWidth LE targetWidth RETURN size Float D Y_Size D X_Size ENDIF Initial size is too small IF thisWidth LT targetWidth THEN BEGIN REPEAT BEGIN XYOUTS 0 5 0 5 ALIGN 0 5 string WIDTH thisWidth CHARSIZE size NORMAL size size step ENDREP UNTIL thisWidth GT targetWidth size size step Need a value slightly smaller than target RETURN size Float D Y_Size D X_Size ENDIF END"); a[319] = new Array("./ToBeReviewed/STRING/string2struct.html", "string2struct.pro", "", " file_comments This is a really really cool way to turn keywords into a structure categories keyword _EXTRA Used to pass keywords returns restrictions examples history version Id: string2struct pro 374 2008 08 08 15:12:27Z pinsard FUNCTION too_cool _EXTRA extra compile_opt idl2 strictarrsubs return extra end file_comments Takes an input string set up as keywords and returns an anonymous structure This is particularly useful for taking keywords entered by a user in a text field and passing then to other routines categories Utilities param STRVAL IN REQUIRED String set up as keywords Keywords require a little special treatment Such as plot findgen 100 _extra string2struct title testing returns This function returns the string as an anonymous structure If an error was found then this function returns a structure with a null field examples The code below creates a widget that uses this routine pro tPlot event widget_control event top get_uvalue field widget_control field get_value strval extra string2struct strval plot findgen 100 _extra extra wshow return end pro testWid enter any keyword to plot and see how it works base widget_base col field cw_field base title test value ax 0 string void widget_button base value plot event_pro tPlot widget_control base realize set_uvalue field xmanager testWid base no_block return end history Written by: RLK Ronn Kling Consulting ronn rlkling com www rlkling com May 1999 version Id: string2struct pro 374 2008 08 08 15:12:27Z pinsard FUNCTION string2struct strval compile_opt idl2 strictarrsubs r execute extra too_cool strval 0 if r 0 then user did not enter keywords correctly so return a structure with a null field if r eq 0 then begin print Error in input string return null:0 endif return extra end"); a[320] = new Array("./ToBeReviewed/STRING/strkeywd.html", "strkeywd.pro", "", " file_comments Translate a structure in a string able to be used to specify keywords in the calling of a function when we use EXECUTE see example categories param STRUCT a structure returns a string composed like following: For each element of the structure we write a part of the string as: name_of_the_element content_of_the_element restrictions If an element of the structure contain an array it will be convert in a vector restrictions Beware this function has loops ifs and cases everywhere So it can not be used by big keywords with a lot of elements which are big arrays The input keyword must not contain Complex floatings structure Double precision complex Pointer Object reference Unsigned Integer Unsigned Longword Integer 64 bit Integer or Unsigned 64 bit Integer examples We create a structure: IDL b get_extra ok 111 year 1997 1998 1999 age_capitaine 35 IDL help b struct Structure 3 tags length 10 refs 1: AGE_CAPITAINE INT 35 OK INT 111 YEAR INT Array 3 We put this structure as a string: IDL a strkeywd b IDL print a AGE_CAPITAINE 35 OK 111 YEAR 1997 1998 1999 Now we can use the string a to pass keywords in a function thanks to execute IDL test execute c get_extra a IDL help c struct Structure 3 tags length 10 refs 1: AGE_CAPITAINE INT 35 OK INT 111 YEAR INT Array 3 history Sebastien Masson smasson lodyc jussieu fr 11 10 1999 version Id: strkeywd pro 372 2008 08 08 12:31:53Z pinsard FUNCTION strkeywd struct compile_opt idl2 strictarrsubs if size struct type NE 8 then return tname tag_names struct if n_elements tname EQ 0 then return on s occupe du premier element res strlowcase tname 0 tostr struct 0 if n_elements tname EQ 1 then return res on s occupe des autres elements for n 1 n_elements tname 1 do res res strlowcase tname n tostr struct n return res end"); a[321] = new Array("./ToBeReviewed/STRING/strright.html", "strright.pro", "", " file_comments return right subportion from a string categories String param S in required the string to be searched param LASTN in required default 1 the number of characters to be returned If LASTN is the strlen STRING the complete string is returned returns The portion of LASTN characters of S counted from the back examples add a in to path if it is not at the end : IDL path tmp IDL if strright path ne then path path IDL print path tmp history mgs 19 Nov 1997: VERSION 1 00 version Id: strright pro 374 2008 08 08 15:12:27Z pinsard Copyright C 1997 Martin Schultz Harvard University This software is provided as is without any warranty whatsoever It may be freely used copied or distributed for non commercial purposes This copyright notice must be kept with any copy of this software If this software shall be used commercially or sold as part of a larger package please contact the author to arrange payment Bugs and comments should be directed to mgs io harvard edu with subject IDL routine strright FUNCTION strright s lastn compile_opt idl2 strictarrsubs on_error 2 return to caller if n_elements s le 0 then return 1L l strlen s if n_elements lastn le 0 then lastn 1 if lastn gt l then lastn l result strmid s l lastn l return result end"); a[322] = new Array("./ToBeReviewed/STRING/strsci.html", "strsci.pro", "", " file_comments Given a number returns a string of that B number in scientific notation format e g A x 10 B categories String param DATA in required A floating point or integer number to be converted into a power of 10 keyword FORMAT default f12 2 The format specification used in the string conversion for the mantissa i e the A of A x 10 B keyword POT_ONLY Will return only the power of 10 part of the string i e the 10 B Default is to return the entire string e g A x 10 B keyword MANTISSA_ONLY return only mantissa of the string keyword SHORT return 10 0 as 1 and 10 1 as 10 keyword TRIM don t insert blanks i e return Ax10 B restrictions This function does not evaluate the format statement thoroughly which can result in somewhat quirky strings Example: print strsci 9 999 results in 10 0x10 0 instead of 1 0x10 1 Need a better symbol than the x for the multiplier examples IDL Result STRSCI 2000000 format i1 IDL print result 2 x 10 u6 n which gets plotted as 2 x 10 IDL Result STRSCI 0 0001 IDL print result 1 00 x 10 u 4 n which gets plotted as 1 00 x 10 IDL Result STRSCI 0d0 format f13 8 IDL print result 0 00000000 history bmy 28 May 1998: VERSION 1 00 B now returns string of the form A x 10 mgs 29 May 1998: bug fix: now allows negative numbers keyword MANTISSA_ONLY added default format changed to f12 2 bmy 02 Jun 1998: renamed to STRSCI STRing SCIentific notation mgs 03 Jun 1998: added TRIM keyword mgs 22 Sep 1998: added SHORT keyword modified handling of TRIM keyword mgs 24 Sep 1998: bug fix with SHORT flag bmy mgs 02 Jun 1999: now can handle DATA 0 0 correctly updated comments mgs 03 Jun 1999: can now also handle values lt 1 and doesn t choke on arrays version Id: strsci pro 374 2008 08 08 15:12:27Z pinsard Copyright C 1998 1999 Bob Yantosca and Martin Schultz Harvard University This software is provided as is without any warranty whatsoever It may be freely used copied or distributed for non commercial purposes This copyright notice must be kept with any copy of this software If this software shall be used commercially or sold as part of a larger package please contact the author to arrange payment Bugs and comments should be directed to bmy io harvard edu or mgs io harvard edu with subject IDL routine strsci FUNCTION strsci data FORMAT format POT_ONLY pot_only MANTISSA_ONLY mantissa_only SHORT short TRIM trim compile_opt idl2 strictarrsubs Error checking Keyword settings on_error 2 if n_elements Data eq 0 then begin return endif if not Keyword_Set Format then Format f12 2 POT_Only keyword_set POT_Only MANTISSA_Only keyword_set MANTISSA_Only Short Keyword_Set Short Trim Keyword_Set Trim NDat n_elements Data Result strarr NDat for i 0 NDat 1 do begin If ABS DATA 0 then we can proceed to take the common log For DATA 0 place a sign in front of the number if Abs Data i ne 0 0 then begin take the common log and store in LOG10DATA Log10Data ALog10 Abs Data i Boolean flag if data 0 sign Data i lt 0 0 Compute the characteristic int part Add the 1d 6 to prevent roundoff errors Characteristic Fix Log10Data 1 0d 6 if Log10Data lt 0 then Characteristic Characteristic 1 Compute the Mantissa frac part and take its antilog Mantissa Log10Data Characteristic Mantissa 10 0 Mantissa print data i log10data mantissa characteristic format 3f24 14 i8 String for the coefficient part The coefficient is just antilog of the Mantissa Add the minus sign if DATA 0 0 A StrTrim String Mantissa Format Format 2 if Sign then A A String for the power of 10 part B 10 u strtrim string Characteristic 2 n if Short then begin if Characteristic eq 0 then B 1 if Characteristic eq 1 then B 10 endif composite string Result i A x B if Short AND B eq 1 then Result i A If DATA 0 then we cannot take the common log so return zeroes for the result strings Use the FORMAT string endif else begin A String 0d0 Format Format B A Result i A endelse Return result to calling program depending on keyword settings Eliminate blanks if TRIM keyword is set if POT_Only then Result i B if MANTISSA_Only then Result i A if Trim then Result i StrCompress Result i Remove_All endfor if n_elements Result eq 1 then Result Result 0 return Result end"); a[323] = new Array("./ToBeReviewed/STRING/strsed.html", "strsed.pro", "", " file_comments replace one or more character s string s in a string array modern version of the obsolete strrepl categories String param STR in required type string array or scalar the string to be changed param EXP1 in required type scalar string a single regular expression as implemented by the STREGEX function param EXP2 in required type scalar string replacement character string keyword FOLD_CASE Indicates that the regular expression matching should be done in a case insensitive fashion returns string array or scalar examples IDL abc abcdefghijklmnopqrstuvwxyz IDL print strsed abc m M abcdefghijklMnopqrstuvwxyz IDL print strsed abc m t M_T abcdefghijklM_Tuvwxyz IDL a abcabcabc IDL help strsed abc a eee abc XXX_ STRING Array 3 IDL print strsed abc a eee abc XXX_ XXX_defghijklmnopqrstuvwxyz XXX_XXX_XXX_ eee history Sept 2006: Sebastien Masson smasson lodyc jussieu fr version Id: strsed pro 372 2008 08 08 12:31:53Z pinsard FUNCTION strsed str exp1 exp2 FOLD_CASE fold_case compile_opt idl2 strictarrsubs strout str line stregex strout exp1 line where line NE 1 cnt IF cnt GT 0 THEN BEGIN FOR i 0L cnt 1 DO strout line i strjoin strsplit strout line i exp1 extract regex preserve_null FOLD_CASE fold_case exp2 ENDIF return strout END"); a[324] = new Array("./ToBeReviewed/STRING/strtok.html", "strtok.pro", "", " file_comments Retrieve portion of string up to token categories String param STRING in required String to be split Contains text after in out token on output param TOKEN in required Token to use in splitting old keyword TRIM set to remove leading blanks from old before returning keyword HELP print useful message and exit returns new portion of string up to token out old portion of old after token out in restrictions Input parameter old is modified Token may be one or more characters if token is not found returns old and sets old to examples If old is foo44 bar then strtok old 44 would return foo and upon return old will be left with bar If TRIM were set old would be bar on return not ok IDL old foo44 bar IDL res strtok old 44 IDL print res 0 5 IDL print old foo44 bar IDL old foo44 bar IDL res strtok old 44 TRIM IDL print res 0 5 IDL print old foo44 bar not ok If old xyz then new strtok old a would return with new xyz and old IDL old xyz IDL new strtok old a IDL print new 0 IDL print old xyz history Log: strtok pro v Revision 1 3 1996 06 14 20:00:27 mcraig Updated Copyright info Revision 1 2 1996 05 09 00:22:17 mcraig Added built in help Revision 1 1 1996 01 31 18:47:37 mcraig Initial revision Thanks: To D Linder who wrote GETTOK part of the goddard library upon which this is based Release: Name: Rel_1_2 Copyright: Copyright C 1996 The Regents of the University of California All Rights Reserved Written by Matthew W Craig See the file COPYRIGHT for restrictions on distributing this code This code comes with absolutely NO warranty see DISCLAIMER for details version Id: strtok pro 374 2008 08 08 15:12:27Z pinsard FUNCTION strtok string token TRIM trim HELP Help compile_opt idl2 strictarrsubs Back to the caller if error occurs On_error 2 IF n_params NE 2 OR keyword_set Help THEN BEGIN offset print offset Retrieve portion of string up to token print offset new strtok old token print offset Inputs: print offset offset old String to be split Contains text after in out print offset offset token on output print offset offset token Token to use in splitting old in print offset Keywords: print offset offset TRIM set to remove leading blanks from old print offset offset before returning print offset offset HELP print useful message and exit print offset Outputs: print offset offset new portion of string up to token out print offset offset old portion of old after token out in print offset Side effects: print offset offset Input parameter old is modified print offset Notes: print offset offset Token may be one or more characters print offset offset If token is not found returns old and sets old to print offset Examples: print offset offset If old is foo44 bar then strtok old 44 would return print offset offset foo and upon return old will be left with bar If TRIM print offset offset were set old would be bar on return print offset offset If old xyz then new strtok old a would return with print offset offset new xyz and old return 1 ENDIF pos strpos string token IF pos GE 0 THEN BEGIN front strmid string 0 pos string strmid string pos strlen token strlen string IF keyword_set trim THEN string strtrim string 1 return front ENDIF front string string return front END"); a[325] = new Array("./ToBeReviewed/STRING/strwhere.html", "strwhere.pro", "", " file_comments return position array for occurrence of a character in a string categories String param STR in required the string param SCHAR in required the character to look for returns The number of matches that were found The function returns an index array similar to the result of the WHERE function examples find position of string a in the string abcabcabc IDL ind strwhere abcabcabc a IDL print ind 0 3 6 history mgs 02 Jun 1998: VERSION 1 00 bmy 30 Jun 1998: now returns COUNT the number of matches that are found this is analogous to the WHERE command version Id: strwhere pro 378 2008 08 12 12:35:46Z pinsard Copyright C 1998 Martin Schultz Harvard University This software is provided as is without any warranty whatsoever It may be freely used copied or distributed for non commercial purposes This copyright notice must be kept with any copy of this software If this software shall be used commercially or sold as part of a larger package please contact the author to arrange payment Bugs and comments should be directed to mgs io harvard edu with subject IDL routine strwhere FUNCTION strwhere str schar count compile_opt idl2 strictarrsubs if n_elements str eq 0 then return 1 convert to byte BStr byte Str BSC byte schar 0 Search for matches Ind where Bstr eq BSC Count bmy return where BStr eq BSC return Ind end"); a[326] = new Array("./ToBeReviewed/STRING/tostr.html", "tostr.pro", "", " file_comments Convert an input in a string categories String param INPUT in required input can not contain or be of the type of: Complex floating structure Double precision complex Pointer Object reference Unsigned Integer Unsigned Longword Integer 64 bit Integer Unsigned 64 bit Integer returns a string restrictions If keywdvalue is an array it will be convert in a vector restrictions Beware this function has loops ifs and cases everywhere So it can not be used by big keywords with a lot of elements which are big arrays examples IDL help tostr 1 tostr a tostr indgen 4 tostr a jkfjo STRING 1 STRING a STRING 0 1 2 3 STRING a jkfjo IDL print tostr c est bon c est bon c est bon c est bon history Sebastien Masson smasson lodyc jussieu fr 18 10 1999 version Id: tostr pro 372 2008 08 08 12:31:53Z pinsard FUNCTION tostr input compile_opt idl2 strictarrsubs case 1 of size input type LE 5:BEGIN if size input type EQ 1 then input long input if n_elements input EQ 1 then res strtrim input 1 ELSE BEGIN res strtrim input 0 1 for i 1 n_elements input 1 do res res strtrim input i 1 res res ENDELSE END size input type eq 7:BEGIN if n_elements input EQ 1 then BEGIN sinput strrepl input res sinput ENDIF ELSE BEGIN res strrepl input 0 for i 1 n_elements input 1 do res res strrepl input i res res ENDELSE END ELSE:BEGIN ras report la fonction tostr ne marche pas pour input qui est de type size input tname res END ENDCASE return res end"); a[327] = new Array("./ToBeReviewed/STRUCTURE/chkstru.html", "chkstru.pro", "", " file_comments check validity of a structure and test if necessary fields are contained categories Utilities param STRUCTURE in required type struct The structure to be tested If STRUCTURE is not of type structure the function will return 0 param FIELDS in required type string A string or string array with field names to be contained in STRUCTURE CHKSTRU returns 1 true only if all field names are contained in STRUCTURE The entries of FIELDS may be upper or lowercase keyword INDEX type string A named variable that will contain the indices of the required field names in the structure They can then be assessed through structure index i Index will contain 1 for all fields entries that are not in the structure keyword VERBOSE set this keyword to return an error message in case of an error keyword EXTRACT set this keyword to extract a field from the structure 1 is return if field or structure are incorrect returns 1 if successful otherwise 0 examples IDL test a:1 b:2 c:3 IDL required a c IDL if CHKSTRU test required then print found a and c IDL print CHKSTRU test b 1 IDL print CHKSTRU test b extract 2 history mgs 02 Mar 1998: VERSION 1 00 mgs 07 Apr 1998: second parameter FIELDS now optional 12 Jan 2001: EXTRACT keyword by S Masson smasson lodyc jussieu fr version Id: chkstru pro 375 2008 08 08 15:55:40Z pinsard Copyright C 1998 Martin Schultz Harvard University This software is provided as is without any warranty whatsoever It may be freely used copied or distributed for non commercial purposes This copyright notice must be kept with any copy of this software If this software shall be used commercially or sold as part of a larger package please contact the author to arrange payment Bugs and comments should be directed to mgs io harvard edu with subject IDL routine chkstru FUNCTION chkstru structure fields INDEX index VERBOSE verbose EXTRACT extract compile_opt idl2 strictarrsubs default index index 1 first check number of parameters must be at least 1 if n_params lt 1 then begin if keyword_set verbose then ras report CHKSTRU: invalid number of parameters if keyword_set extract THEN return 1 ELSE return 0 endif check if the user really passed a structure s size structure if s 1 s 0 ne 8 then begin if keyword_set verbose then ras report CHKSTRU: No structure passed if keyword_set extract THEN return 1 ELSE return 0 endif only one parameter: then we are finished if n_params eq 1 then return 1 see if required field names are contained in the structure and return indices of these fields names tag_names structure index intarr n_elements fields 1 default index to not found for i 0 n_elements fields 1 do begin ind where names eq strupcase fields i if ind 0 lt 0 then begin if keyword_set verbose then ras report CHKSTRU: Cannot find field fields i endif else index i ind 0 endfor check minimum value of index field: 1 indicates error if keyword_set extract then BEGIN if index 0 NE 1 THEN return structure index 0 ELSE return 1 ENDIF ELSE return min index ge 0 end "); a[328] = new Array("./ToBeReviewed/STRUCTURE/extractstru.html", "extractstru.pro", "", " file_comments extract elements of a structure to constitute a new structure categories Utilities param STRU in required A structure param LISTE in required type vector A vector of string including names of STRU to be deleted by default or to be kept if KEEP is activated keyword KEEP Specify that the given liste concern elements of STRU to be kept keyword DELETE Specify that the given liste concern elements of STRU to be deleted This keyword is activated by default returns A structure or 1 in case of problem examples IDL extra get_extra ok year 1999 age_capitaine 35 IDL help extra struct Structure 3 tags length 6 refs 1: AGE_CAPITAINE INT 35 OK INT 1 YEAR INT 1999 IDL help extractstru extra ok hhuihi YEAR stru Structure 1 tags length 2 refs 1: AGE_CAPITAINE INT 35 IDL help extractstru extra ok hhuihi YEAR keep stru Structure 2 tags length 4 refs 1: OK INT 1 YEAR INT 1999 history Sebastien Masson smasson lodyc jussieu fr 8 10 1999 version Id: extractstru pro 375 2008 08 08 15:55:40Z pinsard FUNCTION extractstru stru liste KEEP keep DELETE delete compile_opt idl2 strictarrsubs if size stru type NE 8 then return 1 if size liste type NE 7 then return 1 checking for keep and vire keywords keep keyword_set keep 1 keyword_set delete delete keyword_set delete 1 keyword_set keep keyword_set delete EQ keep tname tag_names stru index make_selection tname strupcase liste only_valid quiet if keep then BEGIN We just keep the list if index 0 EQ 1 then return 1 if n_elements index EQ n_elements tname then return stru res create_struct tname index 0 stru index 0 if n_elements index GT 1 then for i 1 n_elements index 1 do res create_struct res tname index i stru index i ENDIF ELSE BEGIN We delete the list if n_elements index EQ n_elements tname then return 1 if index 0 EQ 1 then return stru We take the complementary one of index to obtain indexes we keep index different indgen n_elements tname index res create_struct tname index 0 stru index 0 if n_elements index GT 1 then for i 1 n_elements index 1 do res create_struct res tname index i stru index i ENDELSE return res end"); a[329] = new Array("./ToBeReviewed/STRUCTURE/mixstru.html", "mixstru.pro", "", " file_comments Concatenate 2 structures together The difference with CREATE_STRUCT is that if the 2 structures have same elements s name then mixstru do not break down but choose for the common element the value specified by the first structure categories Structure param STRU1 in required Structure which can have same elements s name than STRU2 but with a different value param STRU2 in required Structure which can have same elements s name than STRU1 but with a different value returns A structure restrictions If STRU1 or STRU2 are not structure mixstru send back 1 examples IDL a get_extra toto ok 123 IDL b get_extra ok 111 year 1999 age_capitaine 35 IDL help a b struct Structure 2 tags length 4 refs 1: OK INT 123 TOTO INT 1 Structure 3 tags length 6 refs 1: AGE_CAPITAINE INT 35 OK INT 111 YEAR INT 1999 IDL help mixstru a b struct Structure 4 tags length 8 refs 1: AGE_CAPITAINE INT 35 YEAR INT 1999 OK INT 123 TOTO INT 1 IDL help mixstru b a struct Structure 4 tags length 8 refs 1: TOTO INT 1 AGE_CAPITAINE INT 35 OK INT 111 YEAR INT 1999 history Sebastien Masson smasson lodyc jussieu fr 7 10 1999 version Id: mixstru pro 375 2008 08 08 15:55:40Z pinsard FUNCTION mixstru stru1 stru2 compile_opt idl2 strictarrsubs cm_general IF size stru1 type EQ 0 AND size stru2 type EQ 8 THEN return stru2 IF size stru2 type EQ 0 AND size stru1 type EQ 8 THEN return stru1 if size stru1 type NE 8 then return 1 if size stru2 type NE 8 then return 1 tname tag_names stru2 str FOR i 0 n_tags stru2 1 DO str str tname i stru2 strtrim i 2 res createfunc get_extra str _extra stru1 kwdlist stru1 stru1 stru2 stru2 stru1 stru1 stru2 stru2 filename myuniquetmpdir for_createfunc pro return res end"); a[330] = new Array("./ToBeReviewed/STRUCTURE/struct2string.html", "struct2string.pro", "", " file_comments Convert a structure to an executable string categories Utilities param STRUCT in required A structure keyword MAX_STRUCT_LENGTH default 10000l The maximum length of the structure permitted to convert the structure to string keyword DIRECT2STRING To get a string instead an executable string keyword CUT_IN_STRING Try it restrictions Use tostr cf this function header examples IDL print struct2string d create_struct NAME X X_SIZE 891 Y_SIZE 630 X_VSIZE 891 Y_VSIZE 630 X_CH_SIZE 6 Y_CH_SIZE 10 X_PX_CM 40 0000 Y_PX_CM 40 0000 N_COLORS 16777216 TABLE_SIZE 256 FILL_DIST 1 WINDOW 32 UNIT 0 FLAGS 328124 ORIGIN 0 0 ZOOM 1 1 history Sebastien Masson smasson lodyc jussieu fr 2000 07 03 version Id: struct2string pro 371 2008 08 07 09:32:02Z pinsard FUNCTION struct2string struct CUT_IN_STRING cut_in_string MAX_STRUCT_LENGTH max_struct_length DIRECT2STRING direct2string compile_opt idl2 strictarrsubs if size struct type NE 8 then return if NOT keyword_set max_struct_length then max_struct_length 10000l if n_tags struct length GT max_struct_length then begin rien report The structure is too big to be converted to string C See the MAX_STRUCT_LENGTH keyword return endif names tag_names struct case 1 of keyword_set direct2string :BEGIN res names 0 tostr struct 0 if n_tags struct GT 1 then begin FOR i 1 n_tags struct 1 do begin res res names i tostr struct i endfor endif END keyword_set CUT_IN_STRING :BEGIN res create_struct names 0 tostr struct 0 if n_tags struct GT 1 then begin FOR i 1 n_tags struct 1 do begin res res create_struct res names i tostr struct i endfor endif END ELSE:BEGIN res create_struct names 0 tostr struct 0 if n_tags struct GT 1 then begin FOR i 1 n_tags struct 1 do begin res res names i tostr struct i endfor endif res res END endcase return res end"); a[331] = new Array("./ToBeReviewed/STRUCTURE/where_tag.html", "where_tag.pro", "", " file_comments Like WHERE but works on structure tag names Obtain subscripts of elements in structure array for which a particular Tag has values in a range or matching specified values Like the WHERE function but for use with structures categories Structure param STRUCT in required structure array to search keyword TAG_NAME Scalar string specifying Tag Name keyword TAG_NUMBER Otherwise give the Tag Number keyword RANGE min max range to search for in STRUCT keyword VALUES One or array of numbers to match for in STRUCT keyword ISELECT Specifies indices to select only part of structure array use it to recycle subscripts from previous searches keyword NOPRINT Suppress informational messages about nothing found returns Nfound out of occurrences found restrictions User must specify 1 TAG_NAME or TAG_NUMBER to search and 2 the VALUES or RANGE to search on examples Suppose STR is a structure with tags CAT_NO:indgen 10 and NAME:strarr 10 Find the indices where STR CAT_NO is between 3 and 5 IDL print WHERE_TAG str TAG_NAME CAT_NO VALUE 3 4 5 or IDL print WHERE_TAG str TAG_NUM 0 RANGE 3 5 history written 1990 Frank Varosi STX NASA GSFC Stop printing Tag not found with NOPRINT CD Pike 8 Jun 93 version Id: where_tag pro 375 2008 08 08 15:55:40Z pinsard FUNCTION where_tag Struct Nfound TAG_NAME tag_name TAG_NUMBER tag_num ISELECT ipart NOPRINT noprint RANGE range VALUES values compile_opt idl2 strictarrsubs First check required parameters Ntag N_tags Struct if Ntag LE 1 then begin message expecting a Structure Array try again CONTIN return 1 endif if N_elements Tag_Num NE 1 AND N_elements Tag_Name NE 1 then begin message specify TAG_NAME or TAG_NUMBER to search CONTIN return 1 endif Tags Tag_names Struct if N_elements Tag_Name EQ 1 then begin Tag_Name strupcase Tag_Name Tag_Num where Tags EQ Tag_Name Tag_Num Tag_Num 0 if Tag_Num LT 0 then begin if NOT keyword_set noprint then message Tag not found CONTIN return 2 endif endif if Tag_Num LT 0 OR Tag_Num GE Ntag then begin message Tag strtrim Tag_Num 2 exceeds Max Tag strtrim Ntag 1 2 in structure CONTIN return 1 endif if N_elements ipart GT 0 then begin check if any searching on a subset of input w where ipart GE 0 nf if nf LE 0 then return 1 if nf LT N_elements ipart then ipart ipart w endif Now find out where for RANGE : if N_elements range EQ 2 then begin if N_elements ipart GT 0 then begin w where Struct ipart Tag_Num GE range 0 AND Struct ipart Tag_Num LE range 1 Nfound if Nfound GT 0 then windex ipart w else windex w endif else windex where Struct Tag_Num GE range 0 AND Struct Tag_Num LE range 1 Nfound if Nfound LE 0 AND NOT keyword_set noprint then begin strnums strtrim range 2 string strnums 0 strnums 1 message NO values of found in the Range string CONTIN endif where Values: endif else if N_elements values GE 1 then begin Nval N_elements values vals values Nfound 0 if N_elements ipart GT 0 then begin for v 0 Nval 1 do begin w where Struct ipart Tag_Num EQ vals v Nf if Nf GT 0 then begin if Nfound GT 0 then ww ww w else ww w endif Nfound Nfound Nf endfor if Nfound GT 0 then windex ipart ww sort ww else windex w endif else begin for v 0 Nval 1 do begin w where Struct Tag_Num EQ vals v Nf if Nf GT 0 then begin if Nfound GT 0 then ww ww w else ww w endif Nfound Nfound Nf endfor if Nfound GT 0 then windex ww sort ww else windex w endelse if Nfound LE 0 AND NOT keyword_set noprint then begin strnums strtrim vals 2 string strnums 0 for i 1 Nval 1 do string string strnums i message NO values of found Equaling string CONTIN endif endif else begin message must specify a RANGE or VALUES s CONTIN windex 1 endelse return windex end"); a[332] = new Array("./ToBeReviewed/TRIANGULATION/ciseauxtri.html", "ciseauxtri.pro", "", " file_comments Delete arrays which do not have to be drawn thanks to 2 tests: 1 Corners of the array must be in the window 2 Lengths of side of triangles expressed in normalized coordinates must not surpass a sill length categories param TRIANG param GLAM param GPHI keyword _EXTRA Used to pass keywords uses common history Sebastien Masson smasson lodyc jussieu fr 20 2 99 version Id: ciseauxtri pro 370 2008 08 07 07:59:15Z pinsard FUNCTION ciseauxtri triang glam gphi _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh IF NOT keyword_set key_forgetold THEN BEGIN updatenew ENDIF IF NOT keyword_set key_periodic AND NOT keyword_set key_irregular AND NOT map projection LE 7 AND map projection NE 0 AND NOT map projection EQ 14 OR map projection EQ 15 OR map projection EQ 18 THEN return triang tempsun systime 1 For key_performance taille size glam nx taille 1 ny taille 2 tempdeux systime 1 For key_performance 2 z convert_coord glam gphi data to_normal x z 0 y z 1 tempvar SIZE TEMPORARY z delete z IF testvar var key_performance EQ 2 THEN print temps ciseauxtri: convert_coord data to_normal systime 1 tempdeux Beware following the projection some points x or y can become NaN see points behind the Earth in an orthographic projection In this case we have to remove all triangle which contain one of these points if map projection LE 7 AND map projection NE 0 OR map projection EQ 14 OR map projection EQ 15 OR map projection EQ 18 then begin tempdeux systime 1 For key_performance 2 test x y triang test finite temporary test nan test total temporary test 1 ind where temporary test EQ 0 if ind 0 NE 1 then triang triang temporary ind ELSE return 1 trichanged 1b IF testvar var key_performance EQ 2 THEN print temps ciseauxtri: recherche points a NAN systime 1 tempdeux endif seuil 5 indxtriang2 indxtriang indxmin nx 1 indxmin EQ 0 AND indxmax EQ nx 1 ENDIF ELSE indxtriang indxmin listrect nx indytriang indxtriang IF testvar var key_performance EQ 2 THEN print temps ciseauxtri: liste des rectangles systime 1 tempdeux Now we have this list we will make sure that we do not have triangles with only a common summit test bytarr nx ny test listrect 1 dejavire 1b test tempdeux systime 1 For key_performance 2 vire1 0 vire2 0 while vire1 0 NE 1 OR vire2 0 NE 1 ne 0 do begin vire1 where test shift test 1 1 1 shift test 0 1 1 shift test 1 0 EQ 1 if vire1 0 NE 1 THEN test vire1 0 We delete the rectangle vire2 where 1 test 1 shift test 1 1 shift test 0 1 shift test 1 0 EQ 1 We delete the top rectangle same x index but equal to 1 if vire2 0 NE 1 THEN test vire2 nx 0 ENDWHILE stop test test temporary dejavire avirer where temporary test EQ 0 IF testvar var key_performance EQ 2 THEN print temps ciseauxtri: determination des rectangles a virer systime 1 tempdeux if avirer 0 NE 1 then begin tempdeux systime 1 For key_performance 2 indnx n_elements listrect indny n_elements avirer ind listrect replicate 1l indny ind ind EQ replicate 1 indnx avirer if indny GT 1 then ind total ind 2 ind where ind EQ 0 if ind 0 NE 1 then triang triang ind ELSE return 1 endif IF testvar var key_performance EQ 2 THEN print temps ciseauxtri: derniere retouche de la triangulation systime 1 tempdeux endif if keyword_set key_performance THEN print temps ciseauxtri systime 1 tempsun return triang end"); a[333] = new Array("./ToBeReviewed/TRIANGULATION/completecointerre.html", "completecointerre.pro", "", " file_comments categories Graphics param LONS param LATS param SEUIL keyword _EXTRA Used to pass keywords keyword CONT_COLOR default d n_colors 1 white The color of the continent uses common history Sebastien Masson smasson lodyc jussieu fr 01 10 1999 version Id: completecointerre pro 370 2008 08 07 07:59:15Z pinsard PRO draw_corner_triangle lons lats seuil CONT_COLOR cont_color _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh the triangle must not be out of the domain IF min lons max maxlon GE lon1 AND maxlon LE lon2 AND min lats max maxlat GE lat1 AND maxlat LE lat2 then BEGIN the triangle must not be too big z convert_coord lons lats data to_normal alldist z 0 2 z 0 0 2 z 1 2 z 1 0 2 z 0 0 z 0 1 2 z 1 0 z 1 1 2 z 0 1 z 0 2 2 z 1 1 z 1 2 2 IF max alldist LT seuil 2 THEN polyfill lons lats color cont_color _extra ex return ENDIF end file_comments To color cleanly continents categories Graphics keyword _EXTRA Used to pass keywords keyword CONT_COLOR The color of the continent default value is d n_colors 1 white keyword COINMONTE type array To obtain the array of ascending land corner to be treated with completecointerre in the variable array instead of make it pass by the global variable twin_corners_up keyword COINDESCEND type array See COINMONTE keyword INDICEZOOM The zoom s index uses common history Sebastien Masson smasson lodyc jussieu fr 01 10 1999 version Id: completecointerre pro 370 2008 08 07 07:59:15Z pinsard PRO completecointerre COINMONTE coinmonte COINDESCEND coindescend CONT_COLOR cont_color INDICEZOOM indicezoom _EXTRA ex compile_opt idl2 strictarrsubs common if NOT keyword_set coinmonte then return if NOT keyword_set coindescend then return if NOT keyword_set indicezoom then return tempsun systime 1 For key_performance definitions of vectors coinmont and coindesc if keyword_set coinmonte then coinmont coinmonte ELSE coinmont twin_corners_up if keyword_set coindescend then coindesc coindescend ELSE coindesc twin_corners_dn IF NOT keyword_set cont_color THEN cont_color d n_colors 1 255 definition of coordinates of points numbered 1 2 3 4 5 6 see figures below tempdeux systime 1 For key_performance 2 if coinmont 0 NE 1 OR coindesc 0 NE 1 then BEGIN if keyword_set indicezoom then BEGIN if we use key_stide the t u v and f points are no more related to the same cell because glamf and gphif has be recomputed to be in the middle of two t points IF total key_stride EQ 3 AND finite glamv 0 gphiv 0 NE 0 THEN BEGIN long1 glamv indicezoom lati1 gphiv indicezoom ENDIF ELSE BEGIN long1 glamt indicezoom lati1 gphif indicezoom ENDELSE IF total key_stride EQ 3 AND finite glamu 0 gphiu 0 NE 0 THEN BEGIN long2 glamu indicezoom lati2 gphiu indicezoom ENDIF ELSE BEGIN long2 glamf indicezoom lati2 gphit indicezoom ENDELSE long3 glamf indicezoom lati3 gphif indicezoom ENDIF ELSE BEGIN IF total key_stride EQ 3 AND finite glamv 0 gphiv 0 NE 0 THEN BEGIN long1 glamv lati1 gphiv ENDIF ELSE BEGIN long1 glamt lati1 gphif ENDELSE IF total key_stride EQ 3 AND finite glamu 0 gphiu 0 NE 0 THEN BEGIN long2 glamu lati2 gphiu ENDIF ELSE BEGIN long2 glamf lati2 gphit ENDELSE long3 glamf lati3 gphif ENDELSE nx size long1 dimensions 0 ny size long1 dimensions 1 seuil 5 min nx ny 2 seuil min p position 2 p position 0 seuil p position 3 p position 1 seuil ENDIF IF testvar var key_performance EQ 2 THEN print temps completecointerre: positions des points systime 1 tempdeux Case land corner in ascent: 2 land points in diagonal ascending with 2 ocean points on the descendant diagonal 4 t i nx 1 u i nx t i nx 1 0 1 3 5 v i f i v i 1 t i 0 2 u i t i 1 1 if coinmont 0 NE 1 then BEGIN tempdeux systime 1 For key_performance 2 for id 0 n_elements coinmont 1 do BEGIN i coinmont id ii i MOD nx ij i nx bottom triangle lons long1 i long2 i long3 i lats lati1 i lati2 i lati3 i draw_corner_triangle lons lats seuil CONT_COLOR cont_color _extra ex upper triangle IF ii NE nx 1 AND ij NE ny 1 THEN BEGIN lons long3 i long1 i 1 long2 i nx lats lati3 i lati1 i 1 lati2 i nx draw_corner_triangle lons lats seuil CONT_COLOR cont_color _extra ex ENDIF ENDFOR IF testvar var key_performance EQ 2 THEN print temps completecointerre: trace de cointerremonte systime 1 tempdeux ENDIF Case land corner in descent: 2 land points in diagonal descending with 2 ocean points on the ascendant diagonal 4 t i nx 1 u i nx t i nx 1 0 3 5 v i f i v i 1 1 t i 0 2 u i t i 1 1 if coindesc 0 NE 1 then begin tempdeux systime 1 For key_performance 2 for id 0 n_elements coindesc 1 do BEGIN i coindesc id ii i MOD nx ij i nx IF ii NE nx 1 AND ij NE ny 1 THEN BEGIN left triangle lons long1 i long3 i long2 i nx lats lati1 i lati3 i lati2 i nx draw_corner_triangle lons lats seuil CONT_COLOR cont_color _extra ex right triangle lons long3 i long2 i long1 i 1 lats lati3 i lati2 i lati1 i 1 draw_corner_triangle lons lats seuil CONT_COLOR cont_color _extra ex ENDIF ENDFOR IF testvar var key_performance EQ 2 THEN print temps completecointerre: trace de cointerredescend systime 1 tempdeux ENDIF IF keyword_set key_performance THEN print temps completecointerre systime 1 tempsun return end"); a[334] = new Array("./ToBeReviewed/TRIANGULATION/definetri.html", "definetri.pro", "", " file_comments Define a triangulation array like TRIANGULATE But in a VERY SIMPLE CASE: the points are regularly gridded on nx ny array Find a Delaunay triangulation for this set of points is easy: Points define nx 1 ny 1 rectangles which we can cut in 2 triangles cf figure above ny 1 ny 2 1 0 0 1 2 nx 3 nx 2 nx 1 You have 2 ways to cut a rectangle: 1 the upward diagonal 2 the downward diagonal categories Utilities param nx in required The x dimension array param ny in required The y dimension array param downward in optional When downward is undefined all rectangles are cut in using the upward diagonal downward is a vector which contains the rectangles numbers which are cut in using the downward diagonal The rectangle number is defined by the index in a nx ny vector of the lower left corner of the rectangle returns triangles is a 2d array and its dimensions are 3 and 2 nx 1 ny 1 triangles is defined like in the TRIANGULATE procedure examples IDL triangles definetri 3 3 1 3 triangles will be this kind of triangulation: history sebastien Masson smlod ipsl jussieu fr 4 3 1999 version Id: definetri pro 371 2008 08 07 09:32:02Z pinsard FUNCTION definetri nx ny downward compile_opt idl2 strictarrsubs nx long nx ny long ny if n_elements downward NE 0 THEN BEGIN if n_elements downward GT nx 1 ny 1 then begin print downward a trop d elements par rapport a nx et ny return 1 endif downward long downward ENDIF we define triangles triangles lonarr 3 2 nx 1 ny 1 we cut the rectangles with the upward diagonal if n_elements downward NE nx 1 ny 1 then BEGIN there is some rectangle to cut we define upward: upward is a vector which contains the rectangles numbers which are cut in using the upward diagonal The rectangle number is defined by the index in a nx ny vector of the lower left corner of the rectangle upward bytarr nx ny 1 upward ny 1 0 upward nx 1 0 if n_elements downward NE 0 then upward downward 0 upward where upward EQ 1 n1 n_elements upward 4 corners indexes of a rectangle number i are i nx i nx 1 i i 1 trinumber 2 upward upward nx we define the right triangles triangles 0 trinumber upward triangles 1 trinumber upward 1 triangles 2 trinumber upward 1 nx we define the left triangles triangles 0 trinumber 1 upward 1 nx triangles 1 trinumber 1 upward nx triangles 2 trinumber 1 upward ENDIF ELSE n1 0 we cut the rectangles with the downward diagonal if n_elements downward NE 0 then BEGIN n2 n_elements downward trinumber 2 downward downward nx we define the right triangles triangles 0 trinumber downward 1 triangles 1 trinumber downward nx 1 triangles 2 trinumber downward nx we define the left triangles triangles 0 trinumber 1 downward nx triangles 1 trinumber 1 downward triangles 2 trinumber 1 downward 1 endif return triangles end"); a[335] = new Array("./ToBeReviewed/TRIANGULATION/definetri_e.html", "definetri_e.pro", "", " file_comments categories param INDEX It is the tick mark index which starts at 0 param NX in required The x dimension array param NY in required The y dimension array returns restrictions examples history version Id: definetri_e pro 327 2007 12 13 16:22:35Z pinsard FUNCTION numtri index nx ny compile_opt idl2 strictarrsubs y index nx x index y nx numtri y NE 0 nx 1 2 y 1 1 2 y EQ ny 1 OR y EQ ny 1 x return numtri end file_comments Define a triangulation array like TRIANGULATE but for a E grid type categories Make contours with E grid type param NX in required The x dimension array param NY in required The y dimension array param SINGULAR in optional When singular is undefined all rectangles are cut in using the vertical diagonal Singular is a vector which contains the rectangles numbers which are cut in using the horizontal diagonal The rectangle number is defined by the index in a nx ny vector of the lower left corner of the rectangle keyword SHIFTED returns Triangles is a 2d array and is dimensions are 3 and nx 1 ny 1 Triangles is defined like in the TRIANGULATE procedure history Sebastien Masson smlod ipsl jussieu fr June 2001 version Id: definetri_e pro 327 2007 12 13 16:22:35Z pinsard todo seb: documenter SHIFTED FUNCTION definetri_e nx ny singular SHIFTED shifted compile_opt idl2 strictarrsubs nx long nx ny long ny triangles lonarr 3 2 nx 1 ny 1 build the base triangulation with the diamond cut in two triangles by the vertical diagonal first line index lindgen nx 1 trinumber index triangles 0 trinumber index triangles 1 trinumber index 1 triangles 2 trinumber index nx 1 shifted last line index ny 1 nx lindgen nx 1 trinumber numtri index nx ny triangles 0 trinumber index triangles 1 trinumber index nx index nx 1 shifted MOD 2 triangles 2 trinumber index 1 other lines if ny GT 2 then begin index lindgen nx ny index index 0:nx 2 1:ny 2 index index oddeven index nx 1 shifted MOD 2 trinumber numtri index nx ny triangles 0 trinumber index triangles 1 trinumber index nx oddeven triangles 2 trinumber index nx oddeven triangles 0 trinumber 1 index nx oddeven triangles 1 trinumber 1 index nx oddeven triangles 2 trinumber 1 index 1 endif cut the diamond specified by singular in two triangles by the horizontal diagonal IF keyword_set singular then BEGIN yindex singular nx otherline where yindex NE 0 AND yindex NE ny 1 if otherline 0 NE 1 then begin index singular otherline oddeven index nx 1 shifted MOD 2 trinumber numtri index nx ny triangles 0 trinumber index triangles 1 trinumber index nx oddeven triangles 2 trinumber index 1 triangles 0 trinumber 1 index triangles 1 trinumber 1 index 1 triangles 2 trinumber 1 index nx oddeven endif endif return triangles end "); a[336] = new Array("./ToBeReviewed/TRIANGULATION/dessinetri.html", "dessinetri.pro", "", " file_comments Draw the triangulation categories Utilities param TRI in optional Array which define the triangulation provided by triangule or TRIANGULATE param X in optional The x position of points to which the trangulation refer to see the x array provided in triangulate param Y in optional The y position of points to which the trangulation refer to see the y array provided in triangulate keyword WAIT x to call wait x second between each triangle draw keyword ONEBYONE To draw the triangles one by one keyword FILL To fill the triangles using polyfill instead of plotting them keyword CHANGECOLOR n To change the color of each triangle n colors will be used and repeted if necessary uses common history Sebastien Masson smasson lodyc jussieu fr version Id: dessinetri pro 370 2008 08 07 07:59:15Z pinsard PRO dessinetri tri x y WAIT wait ONEBYONE onebyone FILL fill CHANGECOLOR changecolor _EXTRA ex compile_opt idl2 strictarrsubs common tempsun systime 1 For key_performance a if n_params EQ 3 then BEGIN CASE size x n_dimensions size y n_dimensions OF 2:BEGIN nx n_elements x ny n_elements y glam x replicate 1 ny gphi replicate 1 nx y END 4:BEGIN glam x gphi y END ELSE:BEGIN dummy report x and y inputs of dessinetri must have the same number of dimensions 1 or 2 return END ENDCASE ENDIF ELSE BEGIN grille mask glam gphi tri tri undefine mask tri ciseauxtri tri glam gphi ENDELSE IF keyword_set changecolor THEN BEGIN oldname d name if d name EQ PS OR d name EQ Z then BEGIN thisos strupcase strmid version os_family 0 3 CASE thisOS of MAC : set_plot thisOS WIN : set_plot thisOS ELSE: set_plot X ENDCASE ncolors d n_colors 1 255 set_plot oldname ENDIF ELSE ncolors d n_colors 1 255 color 1 indgen changecolor ncolors changecolor 1 ENDIF ELSE color 0 color color replicate 1 n_elements tri 3 n_elements color 1 tempdeux systime 1 For key_performance 2 for i 0L n_elements tri 3 1 do begin t tri i tri 0 i IF keyword_set fill THEN polyfill glam t gphi t color color i _extra ex ELSE plots glam t gphi t color color i _extra ex IF keyword_set wait THEN wait wait IF keyword_set onebyone THEN read a prompt press a key ENDFOR IF testvar var key_performance EQ 2 THEN print temps dessinetri: trace des triangles systime 1 tempdeux if keyword_set key_performance THEN print temps dessinetri systime 1 tempsun return end"); a[337] = new Array("./ToBeReviewed/TRIANGULATION/drawcoast_c.html", "drawcoast_c.pro", "", " file_comments categories param MASK param XF param YF param NX param NY keyword COAST_COLOR default 0 The color of the coastline Default is black 0 keyword COAST_THICK default 1 The thick of the trait to trace continents keyword XSEUIL default 5 To eliminate segments of coasts which are to big which link points which can be close on the sphere but distant on the drawing We delete all segments whose the size surpass the size of the window following X XSEUIL But it can be to big if we do a big zoom or a little one for some projections We specify it the keyword thanks to this keyword keyword YSEUIL See XSEUIL keyword _EXTRA Used to pass keywords returns uses restrictions examples history version todo Seb: remplir le header PRO drawcoast_c mask xf yf nx ny COAST_COLOR coast_color COAST_THICK coast_thick YSEUIL yseuil XSEUIL xseuil _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh IF NOT keyword_set key_forgetold THEN BEGIN updatenew updatekwd ENDIF tempsun systime 1 For key_performance We trace vertical segments: if NOT keyword_set yseuil then yseuil 5 min nx ny 2 distanceseuil p position 3 p position 1 yseuil list: list of points i for which we will trace a segment between the point i j 1 and i j tempdeux systime 1 For key_performance 2 liste where mask shift mask 1 0 EQ 1 AND xf shift xf 0 1 2 yf shift yf 0 1 2 LE distanceseuil 2 IF liste 0 NE 1 THEN BEGIN We recuperate lx an dly which are indexes in a 2d array of points given by list ly liste nx lx temporary liste nx ly indice where ly NE 0 We do not take points concerning if indice 0 NE 1 then begin the first line because in this case the point j 1 is undefined lx lx indice ly ly temporary indice Loop on concerned points and drawing of the segment Comment: we use plots instead of plot because plots goes faster IF testvar var key_performance EQ 2 THEN print temps tracecote: determiner liste des points concernes par un trait vertical systime 1 tempdeux tempdeux systime 1 For key_performance 2 for pt 0L n_elements lx 1 do BEGIN i lx pt j ly pt plots xf i j 1 xf i j yf i j 1 yf i j color coast_color thick coast_thick normal _extra ex endfor IF testvar var key_performance EQ 2 THEN print temps tracecote: trace des traits verticaux systime 1 tempdeux endif ENDIF For the drawing of horizontal segments it is the same thing but we have to be careful if it is periodic If it is periodic we duplicate the first column and we put it at the end This is made not for the shift which is periodic by default but for the plots tempdeux systime 1 For key_performance 2 if keyword_set key_periodic AND nx EQ jpi then begin mask mask mask 0 xf xf xf 0 yf yf yf 0 nx nx 1 ENDIF if NOT keyword_set xseuil then xseuil 5 min nx ny 2 distanceseuil p position 2 p position 0 xseuil liste where mask shift mask 0 1 EQ 1 AND xf shift xf 1 0 2 yf shift yf 1 0 2 LE distanceseuil 2 IF liste 0 NE 1 THEN BEGIN ly liste nx lx temporary liste nx ly indice where ly NE ny 1 AND lx NE 0 if indice 0 NE 1 then begin We do not take points of the first column and of the last line because we added artificially lx lx indice ly ly temporary indice IF testvar var key_performance EQ 2 THEN print temps tracecote: determiner liste des points concernes par un trait horizontal systime 1 tempdeux tempdeux systime 1 For key_performance 2 for pt 0L n_elements lx 1 do BEGIN i lx pt j ly pt plots xf i 1 j xf i j yf i 1 j yf i j color coast_color thick coast_thick normal _extra ex endfor IF testvar var key_performance EQ 2 THEN print temps tracecote: trace des traits horizontaux systime 1 tempdeux endif endif if keyword_set key_performance THEN print temps drawcoast_c systime 1 tempsun return end"); a[338] = new Array("./ToBeReviewed/TRIANGULATION/drawcoast_e.html", "drawcoast_e.pro", "", " file_comments categories param MASK param XF param YF param NX param NY keyword COAST_COLOR default 0 The color of the coastline Default is black 0 keyword COAST_THICK default 1 The thick of the trait to trace continents keyword XSEUIL default 5 To eliminate segments of coasts which are to big which link points which can be close on the sphere but distant on the drawing We delete all segments whose the size surpass the size of the window following X XSEUIL But it can be to big if we do a big zoom or a little one for some projections We specify it the keyword thanks to this keyword keyword YSEUIL See XSEUIL keyword _EXTRA Used to pass keywords returns uses restrictions examples history version todo Seb: remplir le header PRO drawcoast_e mask xf yf nx ny COAST_COLOR coast_color COAST_THICK coast_thick YSEUIL yseuil XSEUIL xseuil ONEMORE onemore _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh IF NOT keyword_set key_forgetold THEN BEGIN updatenew updatekwd ENDIF tempsun systime 1 pour key_performance if keyword_set key_periodic AND nx EQ jpi then begin mask mask mask 0 xf xf xf 0 yf yf yf 0 nx nx 1 ENDIF we plot the borders of the diamond in this sense : if NOT keyword_set onemore then onemore 0 if NOT keyword_set xseuil then xseuil 5 min nx ny 2 distanceseuil p position 2 p position 0 xseuil liste: liste des points i pour lesquels on va tracer un segment index lindgen nx ny index index 0:nx 2 1:ny 1 indexbis index nx index nx onemore MOD 2 liste where mask index 1 mask indexbis EQ 1 AND xf index xf indexbis 2 yf index yf indexbis 2 LE distanceseuil 2 IF liste 0 NE 1 THEN BEGIN index index liste indexbis indexbis liste for pt 0 n_elements index 1 do begin plots xf index pt xf indexbis pt yf index pt yf indexbis pt color coast_color thick coast_thick normal _extra ex endfor ENDIF we plot the borders of the diamond in this sense : if NOT keyword_set xseuil then xseuil 5 min nx ny 2 distanceseuil p position 2 p position 0 xseuil liste: liste des points i pour lesquels on va tracer un segment index lindgen nx ny 1 index index 0:nx 2 indexbis index nx index nx onemore MOD 2 liste where mask index 1 mask indexbis EQ 1 AND xf index xf indexbis 2 yf index yf indexbis 2 LE distanceseuil 2 IF liste 0 NE 1 THEN BEGIN index index liste indexbis indexbis liste for pt 0 n_elements index 1 do begin plots xf index pt xf indexbis pt yf index pt yf indexbis pt color coast_color thick coast_thick normal _extra ex endfor ENDIF if keyword_set key_performance THEN print temps drawcoast_e systime 1 tempsun return end"); a[339] = new Array("./ToBeReviewed/TRIANGULATION/drawsectionbottom.html", "drawsectionbottom.pro", "", " file_comments Fill and draw the bottom continents for a real section categories param maskin in required param xxaxisin in required param depthsin in required keyword COAST_COLOR default 0 The color of the coastline Default is black 0 keyword COAST_THICK default 1 The thickness of the coastline keyword CONT_COLOR default d n_colors 1 common restrictions Simple way to fill continents for a section using the fact that continents are wider at the bottom than at the top history Sebastien Masson smasson lodyc jussieu fr June 14 2002 version Id: drawsectionbottom pro 370 2008 08 07 07:59:15Z pinsard todo Seb: definir params PRO drawsectionbottom maskin xxaxisin depthsin COAST_COLOR coast_color COAST_THICK coast_thick CONT_COLOR cont_color CONT_NOFILL cont_nofill OVERPLOT overplot _EXTRA ex compile_opt idl2 strictarrsubs cm_general IF NOT keyword_set key_forgetold THEN BEGIN updatekwd ENDIF if keyword_set overplot then return mask is from bottom to top boundaries conditions: nx size maskin 1 nz size maskin 2 1 IF size xxaxisin n_dimensions EQ 1 THEN xxaxisin temporary xxaxisin replicate 1 nz IF size depthsin n_dimensions EQ 1 THEN depthsin replicate 1 nx temporary depthsin for the mask : we add ocean at the top then it is always possible to find one ocean point on each water column mask maskin replicate 1 nx for x axis we also add one level xxaxis xxaxisin xxaxisin 0 x axis must cover nx 1 points because we will draw the edge of the mask if it was mot possible in decoupeterre pro to extend the xxaxis we do it now by hand xxaxis xxaxisin 0 if size xxaxis 1 EQ nx then begin if n_elements xxaxis EQ nx then begin deltax abs x range 1 x range 0 10 xxaxis xxaxis 0 deltax xxaxis x0 xxaxis 0 deltax xxaxis replicate x0 1 nz xxaxis ENDIF for the depth usepartial total depthsin 2 usepartial total usepartial NE usepartial 0 GE 1 depths depthsin 0:nx 1 we add one level according to the ocean level we had to the mask deltaz abs y range 1 y range 0 10 zmax max depthsin deltaz depths depths replicate zmax nx 1 depths depths replicate zmax nx if min depths gt 1 then we must add one line at the bottom this appens when the bottom limit is defined between T k and W k points IF min depthsin GT 1 OR max total mask 2 EQ nz THEN BEGIN zmin min y range deltaz depths replicate zmin nx depths mask replicate 0 nx mask nz nz 1 ENDIF xleft xxaxis 0:nx 1 xright xxaxis 1:nx looking for the position of the bottom of the ocean pos nz 1 total mask 2 depths depths lindgen nx nx pos xx transpose xleft xright xx x range 0 xx zz max y range xx float xx zz float zz filling of the continents IF NOT keyword_set cont_color THEN cont_color d n_colors 1 255 if NOT keyword_set cont_nofill then polyfill min xx max maxx xx maxx min zz max mazz zz mazz color cont_color if NOT keyword_set cont_nofill then polyfill min xx max maxx xx maxx y range 0 zz y range 0 color cont_color drawing of the coast bottom line we could have plot directly xx and yy but if countout ne 0 doing this will draw an non existing bottom line along y range values which is not so good we thus do this ugly for if loops to make sure that we don t draw these lines but we keep all vertical lines IF countout NE 0 THEN BEGIN FOR i 0 countout 1 DO BEGIN CASE 1 OF out i EQ 0:BEGIN if we start with a out point xxx values f_nan zzz values f_nan END i EQ 0:BEGIN i eq 0 but out i ne 0 xxx xx 0:out i values f_nan zzz zz 0:out i values f_nan END ELSE:BEGIN two consecutive out values at the same depth: we just keep values f_nan values until the next change of depth IF out i 1 EQ out i 1 AND zz out i 1 EQ zz out i THEN BEGIN xxx xxx values f_nan zzz zzz values f_nan ENDIF ELSE BEGIN we keep everything inbetween the out values including themselves for the vertical lines but we had values f_nan to remove the horizontal lines xxx xxx xx out i 1 :out i values f_nan zzz zzz zz out i 1 :out i values f_nan ENDELSE END ENDCASE IF i EQ countout 1 AND out i NE n_elements xx 1 THEN BEGIN xxx xxx xx out i : zzz zzz zz out i : ENDIF ENDFOR plots xxx zzz color coast_color thick coast_thick _extra ex ENDIF ELSE plots xx zz color coast_color thick coast_thick _extra ex return end "); a[340] = new Array("./ToBeReviewed/TRIANGULATION/fillcornermask.html", "fillcornermask.pro", "", " file_comments To color cleanly continents categories Graphics keyword _EXTRA Used to pass keywords keyword CONT_COLOR default d n_colors 1 white The color of the continent uses common history Sebastien Masson smasson lodyc jussieu fr 8 8 2002 version Id: fillcornermask pro 370 2008 08 07 07:59:15Z pinsard PRO fillcornermask xin yin COINMONTE coinmonte COINDESCEND coindescend CONT_COLOR cont_color INDICEZOOM indicezoom _EXTRA ex compile_opt idl2 strictarrsubs common if NOT keyword_set coinmonte AND NOT keyword_set coindescend then return tempsun systime 1 For key_performance IF NOT keyword_set cont_color THEN cont_color d n_colors 1 255 definition of coordinates of points numbered 1 2 3 4 5 6 see figures below x1 reform xin y1 reform yin IF size x1 0 EQ 2 THEN x1 x1 0 IF size y1 0 EQ 2 THEN y1 y1 0 x2 5 x1 shift x1 1 y2 5 y1 shift y1 1 nx n_elements x1 ny n_elements y1 Case land corner in ascent: 2 land points in diagonal ascending with 2 ocean points on the descendant diagonal 3 t i nx 1 u i nx t i nx 1 0 1 4 v i f i v i 1 t i 0 2 u i t i 1 1 if keyword_set coinmonte then BEGIN if coinmonte 0 NE 1 then BEGIN iup coinmonte MOD nx jup coinmonte nx for id 0 n_elements coinmonte 1 do BEGIN i iup id j jup id IF i NE nx 1 AND j NE ny 1 THEN BEGIN polyfill x1 i x2 i x2 i x1 i 1 x1 i y2 j y1 j y1 j 1 y2 j y2 j color cont_color _extra ex ENDIF endfor endif endif Case land corner in descent: 2 land points in diagonal descending with 2 ocean points on the ascendant diagonal 4 t i nx 1 u i nx t i nx 1 0 3 5 v i f i v i 1 1 t i 0 2 u i t i 1 1 if keyword_set coindescend then BEGIN if coindescend 0 NE 1 then begin idw coindescend MOD nx jdw coindescend nx for id 0 n_elements coindescend 1 do BEGIN i idw id j jdw id IF i NE nx 1 AND j NE ny 1 THEN BEGIN polyfill x1 i x2 i x2 i x1 i 1 x1 i y2 j y1 j 1 y1 j y2 j y2 j color cont_color _extra ex ENDIF endfor endif endif IF keyword_set key_performance THEN print temps fillcornermask systime 1 tempsun return end"); a[341] = new Array("./ToBeReviewed/TRIANGULATION/section.html", "section.pro", "", " file_comments categories param FIELD param RES param GLAMAXE param GPHIAXE keyword ENDPOINTS keyword BOXZOOM keyword TYPE keyword WDEPTH keyword DIREC keyword SHOWBUILD keyword ONLYBOX keyword _EXTRA Used to pass keywords returns uses common restrictions examples history Sebastien Masson smasson lodyc jussieu fr version Id: section pro 393 2009 02 20 15:39:43Z smasson PRO section field res glamaxe gphiaxe ENDPOINTS endpoints BOXZOOM boxzoom TYPE type WDEPTH wdepth DIREC direc SHOWBUILD showbuild ONLYBOX onlybox _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh cm_4data cm_4cal IF NOT keyword_set key_forgetold THEN BEGIN updatenew updatekwd ENDIF definition of boxzoom in function of endpoints then redefinition of the domain boxzoom2d min endpoints 0 endpoints 2 max ma02 ma02 min endpoints 1 endpoints 3 max ma13 ma13 minprof 0 profdefault 200 if n_elements type EQ 0 then type nothing Case N_Elements Boxzoom OF 0:localbox boxzoom2d minprof profdefault 1:localbox boxzoom2d minprof boxzoom 0 2:localbox boxzoom2d boxzoom 4:if strpos type z NE 1 THEN localbox boxzoom2d minprof profdefault ELSE localbox boxzoom2d 5:localbox boxzoom2d minprof boxzoom 4 6:localbox boxzoom2d boxzoom 4:5 Else:BEGIN ras report Bad definition of the box stop END ENDCASE nelbox n_elements localbox if keyword_set wdepth then grillechoice vargrid W ELSE grillechoice vargrid domdef localbox GRIDTYPE grillechoice findalways _extra ex grille 1 1 1 1 nx ny if less than 10 points where found we apply domdef over the whole domain problem why 10 points as a test value how can we find a good test value IF nx ny LE 10 THEN domdef 0 jpi 1 0 jpj 1 localbox 4:5 xindex yindex GRIDTYPE grillechoice _extra ex We redefine lon1 in case findalways has been used in domdef lon1 min endpoints 0 endpoints 2 max lon2 lat1 min endpoints 1 endpoints 3 max lat2 we extend the box along the z axis i that way the plot will be drawn until its bottom part if strpos type z NE 1 THEN BEGIN We keep yranges axis z before changing the boxzoom y range localbox nelbox 1 localbox nelbox 2 if vargrid EQ W OR keyword_set wdepth then BEGIN firstzw 0 firstzw 1 lastzw lastzw 1 firstzt 1 lastzt lastzt 1 firstx 1 lastx lastx 1 firsty 1 lasty lasty 1 jpj 1 domdef firstx lastx firsty lasty firstz lastz index gridtype vargrid IF keyword_set onlybox THEN return grille mask glam gphi gdep nx ny nz firstx firsty firstz lastx lasty lastz We define the triangulation which will allows us to determinate the section We recalculate it because it must be defined on the Earth and on oceans Following the direction of the section rather longitude or rather latitude we define the way to triangulate if strpos type x NE 1 then BEGIN downward lindgen nx ny 0:nx 2 0:ny 2 tri definetri nx ny downward ENDIF ELSE tri definetri nx ny If we have an irregular grid that is periodic then it is possible that some of the triangle have a very large size neighborg points on the sphere but far away when doing the projection and should not be taken into account IF keyword_set key_irregular AND keyword_set key_periodic THEN BEGIN glamtri glam tri glamtri abs glamtri shift glamtri 1 0 good temporary glamtri LT 10 max glam nx good where total temporary good 1 EQ 3 tri temporary tri temporary good ENDIF Equation of the line on which we do the section abc linearequation endpoints 0:1 endpoints 2:3 glamtri glam tri gphitri gphi tri Which points of the triangulation are above and below the line if abc 1 NE 0 THEN test temporary gphitri GE abc 0 abc 1 temporary glamtri abc 2 abc 1 ELSE test temporary glamtri GE abc 1 abc 0 temporary gphitri abc 2 abc 0 zero123 total test 1 to keep: triangles of the triangulation which are over the line tokeep1 where zero123 EQ 1 tokeep2 where temporary zero123 EQ 2 tokeep tokeep1 tokeep2 test test tokeep tri tri tokeep Which summit of the triangle is alone in a side of the line single1 where test 0:n_elements tokeep1 1 EQ 1 single1 single1 single1 3 3 single2 where test n_elements tokeep1 :n_elements tokeep 1 EQ 0 single2 single2 single2 3 3 undefine tokeep undefine tokeep1 undefine tokeep2 undefine test single temporary single1 temporary single2 points1 the point of the triangle alone in a side of the line point2 the other point of the triangle in the other side of the line point1 single single point2 single EQ 0 1 single LE 1 undefine single ntri size tri 2 index lindgen ntri lindgen ntri points1 tri point1 index points2 tri point2 temporary index points : complex containing couples of points in a side and the other side of the line We have to delete duplicates points dcomplex points1 points2 points points uniq points sort points symetrique dcomplex imaginary points double points points points where points shift temporary symetrique 1 NE 0 points1 coordinates of the point of the triangle which is alone in a side of the line point2 coordinates of the other point of the triangle in the other side of the line points1 complex glam double points gphi double points points2 complex glam imaginary points gphi imaginary points droites equations of line whose we look for the intersection wit the section droites linearequation points1 points2 inter lineintersection droites abc replicate 1 n_elements points1 Geographic coordinates of points we look for on the section glamaxe float inter gphiaxe imaginary inter We arrange them in the growing order between boundaries of the section if strpos type x NE 1 then BEGIN sort sort glamaxe glamaxe glamaxe sort inbox where glamaxe GE lon1 AND glamaxe LE lon2 glamaxe glamaxe inbox sort sort inbox gphiaxe gphiaxe sort ENDIF ELSE BEGIN sort sort gphiaxe gphiaxe gphiaxe sort inbox where gphiaxe GE lat1 AND gphiaxe LE lat2 gphiaxe gphiaxe inbox sort sort inbox glamaxe glamaxe sort ENDELSE points points sort points1 points1 sort points2 points2 sort inter inter sort poids abs points2 inter abs points2 points1 array litchamp field array fitintobox array if array 0 EQ 1 THEN BEGIN res 1 return ENDIF if n_elements valmask EQ 0 THEN valmask 1e20 taille size array if jpt GT 1 AND taille 0 GE 3 AND strpos type t EQ 1 then BEGIN direc t array grossemoyenne array t taille size array jpt 1 ENDIF case 1 of xy taille 0 EQ 2:BEGIN value1 array double points terre where value1 GT valmask 10 if terre 0 NE 1 then value1 terre values f_nan value2 array imaginary points terre where value2 GT valmask 10 if terre 0 NE 1 then value2 terre values f_nan res poids value1 1 poids value2 END xyz taille 0 EQ 3 AND jpt EQ 1:BEGIN npoints n_elements points index double points replicate 1 nz replicate nx ny npoints lindgen nz value1 array index terre where value1 GT valmask 10 if terre 0 NE 1 then value1 terre values f_nan index imaginary points replicate 1 nz replicate nx ny npoints lindgen nz value2 array index terre where value2 GT valmask 10 if terre 0 NE 1 then value2 terre values f_nan poids poids replicate 1 nz res poids value1 1 poids value2 average following z if strpos type z EQ 1 then begin nan where finite res EQ 0 if vargrid EQ W then e3 e3w firstzw:lastzw ELSE e3 e3t firstzt:lastzt weight replicate 1 npoints e3 if nan 0 NE 1 then weight nan values f_nan totalweight total weight 2 nan zero where totalweight EQ 0 if zero 0 NE 1 then totalweight zero values f_nan res total res weight 2 nan totalweight direc z string byte testvar var toto endif END xyt taille 0 EQ 3 AND jpt NE 1:BEGIN npoints n_elements points index double points replicate 1 jpt replicate nx ny npoints lindgen jpt value1 array index terre where value1 GT valmask 10 if terre 0 NE 1 then value1 terre values f_nan index imaginary points replicate 1 jpt replicate nx ny npoints lindgen jpt value2 array index terre where value2 GT valmask 10 if terre 0 NE 1 then value2 terre values f_nan poids poids replicate 1 jpt res poids value1 1 poids value2 END xyzt taille 0 EQ 4:BEGIN npoints n_elements points index double points replicate 1 nz jpt replicate nx ny npoints lindgen nz jpt index reform index npoints nz jpt over value1 array index terre where value1 GT valmask 10 if terre 0 NE 1 then value1 terre values f_nan index imaginary points replicate 1 nz jpt replicate nx ny npoints lindgen nz jpt index reform index npoints nz jpt over value2 array index terre where value2 GT valmask 10 if terre 0 NE 1 then value2 terre values f_nan poids poids replicate 1 nz jpt poids reform poids npoints nz jpt over res poids value1 1 poids value2 average following z if strpos type z EQ 1 then begin nan where finite res EQ 0 if vargrid EQ W then e3 e3w firstzw:lastzw ELSE e3 e3t firstzt:lastzt weight replicate 1 npoints e3 weight weight replicate 1 jpt weight reform weight npoints nz jpt over if nan 0 NE 1 then weight nan values f_nan totalweight total weight 2 nan zero where totalweight EQ 0 if zero 0 NE 1 then totalweight zero values f_nan res total res weight 2 nan totalweight direc z string byte testvar var toto endif END endcase terre where finite res EQ 0 if terre 0 NE 1 then res terre valmask if n_elements showbuild then BEGIN winsave window psave p xsave x ysave y plt findgen nx ny nodata nofill rempli title subtitle coast_thick 2 window showbuild p title p subtitle plots endpoints 0 endpoints 2 endpoints 1 endpoints 3 color 50 plots endpoints 0 endpoints 2 endpoints 1 endpoints 3 color 50 psym 2 thick 2 FOR i 0 n_elements points1 1 DO plots float points1 i float points2 i imaginary points1 i imaginary points2 i color 150 plots float points1 imaginary points1 color 150 psym 1 plots float points2 imaginary points2 color 150 psym 1 plots float inter imaginary inter color 250 psym 1 bug IF terre 0 NE 1 THEN plots float terre inter imaginary terre inter color 0 psym 1 dummy read dummy prompt press return to continue IF d name EQ PS THEN erase ELSE wset winsave p psave x xsave y ysave ENDIF restoreboxparam boxparam4section dat return end"); a[342] = new Array("./ToBeReviewed/TRIANGULATION/tracecote.html", "tracecote.pro", "", " file_comments Draw coasts in plt categories Graphics keyword SURFACE_COASTLINE To draw the surface coast line instead of the coast line at level firstz tw Useful only for deep plots keyword _EXTRA Used to pass keywords uses common history Sebastien Masson smasson lodyc jussieu fr 30 9 1999 version Id: tracecote pro 370 2008 08 07 07:59:15Z pinsard PRO tracecote SURFACE_COASTLINE surface_coastline _EXTRA ex compile_opt idl2 strictarrsubs cm_4data cm_4mesh IF NOT keyword_set key_forgetold THEN BEGIN updatenew ENDIF tempsun systime 1 For key_performance if n_elements key_gridtype EQ 0 then key_gridtype c We enlarge a bit the frame defined by firsts lasts in order to recuperate edges of the coast which are in the edging of the domain tempdeux systime 1 For key_performance 2 firstx 0 min firstxt firstxf 1 lastx max lastxt lastxf 1 min firstyt firstyf 1 lasty max lastyt lastyf 1 jpj 1 nx lastx firstx 1 ny lasty firsty 1 Which vertical level choose IF keyword_set surface_coastline THEN firstz 0 ELSE IF strupcase vargrid eq W THEN firstz firstzw ELSE firstz firstzt Attribution of the mask and of coordinates delimiting limits of the land coordinates f mask tmask firstx:lastx firsty:lasty firstz xf glamf firstx:lastx firsty:lasty yf gphif firstx:lastx firsty:lasty IF testvar var key_performance EQ 2 THEN print temps tracecote: determiner mask xf yf systime 1 tempdeux if key_gridtype EQ e then onemore xf 0 0 gT xf 0 1 We pass in normalized coordinates to be able to become independant from the projection s type choosen and from the support on which we do the drawing screen or postscript z convert_coord xf yf data to_normal xf reform z 0 nx ny yf reform z 1 nx ny tempvar SIZE TEMPORARY z Beware following the projection some points x or y can become NaN see point behind the earth in an orthographic projection We put points to be eliminated at a very big value so that they will not pass the test with distanceseuil see further if map projection LE 7 AND map projection NE 0 OR map projection EQ 14 OR map projection EQ 15 OR map projection EQ 18 then begin ind where finite xf yf EQ 0 IF ind 0 NE 1 THEN BEGIN xf ind 1e5 yf ind 1e5 ENDIF ENDIF ind where xf LT p position 0 OR xf GT p position 2 IF ind 0 NE 1 THEN xf ind 1e5 ind where yf LT p position 1 OR yf GT p position 3 IF ind 0 NE 1 THEN yf ind 1e5 tempvar SIZE TEMPORARY ind we delete ind case strmid key_gridtype 0 1 of c :drawcoast_c mask xf yf nx ny _extra ex e :drawcoast_e mask xf yf nx ny onemore onemore _extra ex endcase if keyword_set key_performance THEN print temps tracecote systime 1 tempsun return end"); a[343] = new Array("./ToBeReviewed/TRIANGULATION/tracemask.html", "tracemask.pro", "", " file_comments Draw contours of a mask categories Utilities param MASKENTREE in required 2d array specifying the mask param XIN in required 2d array specifying longitude coordinates param YIN in required 2d array specifying latitude coordinates keyword COAST_COLOR default 0 The color of the coastline Default is black 0 keyword COAST_THICK default 1 The thick of the trait to trace continents keyword OVERPLOT To do a plot over an other one keyword _EXTRA Used to pass keywords uses common history Sebastien Masson smasson lodyc jussieu fr version Id: tracemask pro 370 2008 08 07 07:59:15Z pinsard PRO tracemask maskentree xin yin COAST_COLOR coast_color COAST_THICK coast_thick OVERPLOT overplot _EXTRA ex compile_opt idl2 strictarrsubs if keyword_set overplot then return cm_general IF NOT keyword_set key_forgetold THEN BEGIN updatekwd ENDIF tempsun systime 1 For key_performance We avoid edging problems: tempdeux systime 1 For key_performance 2 tailleentree size maskentree nx tailleentree 1 1 ny tailleentree 2 1 we check the input axis IF n_elements xin EQ 0 THEN xentree findgen nx 1 ELSE xentree xin IF size xentree 0 EQ 1 THEN xentree xentree replicate 1 ny 1 IF n_elements yin EQ 0 THEN yentree findgen ny 1 ELSE yentree yin IF size yentree 0 EQ 1 THEN yentree replicate 1 nx 1 yentree We enlarge the mask by 1 column to the left an d1 line to the bottom mask intarr tailleentree 1 1 tailleentree 2 1 mask 1:tailleentree 1 1:tailleentree 2 maskentree The 2 first columns are identical mask 0 1:tailleentree 2 maskentree 0 The 2 first lines are identical mask 1:tailleentree 1 0 maskentree 0 We calculate the position following x of points which will serve to trace the mask They are situated between each points of the mask exept for the last column we can not calculate and so we put at max x range xrange x range sort x range if REVERSE_X is used xentree 5 xentree shift xentree 1 0 IF not keyword_set overplot THEN xentree nx 2 xrange 1 ELSE xentree nx 2 xentree nx 3 we sill xentree xrange 0 xentree yentree yrange 1 yf fltarr nx ny yf 1:nx 1 1:ny 1 yentree yf 0 1:ny 1 yentree 0 IF not keyword_set overplot THEN BEGIN if yinverse then yf 0 yrange 1 ELSE yf 0 yrange 0 ENDIF ELSE yentree 0 yentree 1 IF testvar var key_performance EQ 2 THEN print temps tracemask: determination du mask et de ses coordonnees systime 1 tempdeux We trace vertical segments: tempdeux systime 1 For key_performance 2 liste where mask shift mask 1 0 EQ 1 IF liste 0 NE 1 THEN BEGIN We recuperate lx and ly which are indexes in a 2d array of points given by list ly liste nx lx temporary liste nx ly indice where ly NE 0 We do not take points concerning the first line because in this case the point j 1 is not defined if indice 0 NE 1 then begin lx lx indice ly ly temporary indice IF testvar var key_performance EQ 2 THEN print temps tracemask: liste traits verticaux systime 1 tempdeux tempdeux systime 1 For key_performance 2 loop on concerned points and drawing of the segment comments: we use plots instead of plot because plots is faster for pt 0L n_elements lx 1 do BEGIN i lx pt j ly pt plots xf i j 1 xf i j yf i j 1 yf i j color coast_color thick coast_thick _extra ex if pt LT 5 then begin endif endfor IF testvar var key_performance EQ 2 THEN print temps tracemask: trace traits verticaux systime 1 tempdeux endif ENDIF We trace horizontal segments: tempdeux systime 1 For key_performance 2 liste where mask shift mask 0 1 EQ 1 IF liste 0 NE 1 THEN BEGIN ly liste nx lx temporary liste nx ly indice where lx NE 0 We do not take point sof the first column if indice 0 EQ 1 then return lx lx indice ly ly temporary indice IF testvar var key_performance EQ 2 THEN print temps tracemask: liste traits horizontaux systime 1 tempdeux tempdeux systime 1 For key_performance 2 for pt 0L n_elements lx 1 do BEGIN i lx pt j ly pt plots xf i 1 j xf i j yf i 1 j yf i j color coast_color thick coast_thick _extra ex endfor IF testvar var key_performance EQ 2 THEN print temps tracemask: trace traits horizontaux systime 1 tempdeux endif if keyword_set key_performance THEN print temps tracemask systime 1 tempsun return end "); a[344] = new Array("./ToBeReviewed/TRIANGULATION/triangule.html", "triangule.pro", "", " file_comments categories param MASKENTREE in optional type 2d array It is a 2d array which will serve to mask the field we will trace after with CONTOUR TRIANGULATION triangule mask If this argument is not specified the function use tmask keyword BASIC Specify that the mask is on a basic grid use the triangulation for vertical cuts and hovmoellers keyword COINMONTE type array To obtain the array of ascending land corner to be treated with completecointerre pro in the variable array instead of make it pass by the global variable twin_corners_up keyword COINDESCEND type array See COINMONTE keyword _EXTRA Used to pass keywords returns uses restrictions examples history version Id: triangule pro 327 2007 12 13 16:22:35Z pinsard todo seb FUNCTION triangule maskentree BASIC basic COINMONTE coinmonte COINDESCEND coindescend _EXTRA ex compile_opt idl2 strictarrsubs common szmsk size maskentree IF szmsk 0 EQ 0 THEN BEGIN nx jpi ny jpj ENDIF ELSE BEGIN nx szmsk 1 ny szmsk 2 ENDELSE IF nx EQ 1 OR ny EQ 1 THEN return 1 IF arg_present coinmonte THEN coinmonte 1 IF arg_present coindescend THEN coindescend 1 if keyword_set basic then return triangule_c maskentree BASIC COINMONTE coinmonte COINDESCEND coindescend _extra ex if n_elements key_gridtype EQ 0 then key_gridtype c if n_elements maskentree EQ 0 then maskentree tmask 0 case strmid key_gridtype 0 1 of e :res triangule_e maskentree _extra ex c :res triangule_c maskentree COINMONTE coinmonte COINDESCEND coindescend _extra ex endcase return res end"); a[345] = new Array("./ToBeReviewed/TRIANGULATION/triangule_c.html", "triangule_c.pro", "", " file_comments Construct the triangulation array The idea is: construct a list of triangle which link points between them This is automatically done by the function TRIANGULATE Here: we consider the fact that points are disposed on a grid regular or not but not unstructured that is to say that points are written following a rectangular matrix A easy way to do triangles between all points is then: for each point i j of the matrix except those of the last line and of the last column we call rectangle i j the rectangle made of the four points i j i 1 j i j 1 i 1 j 1 To trace all triangle we just have to trace the 2 triangles contained in rectangles i j We notice that each rectangle i j have 2 diagonals it is true Make a drawing to make sure so there are two possible choice for each rectangle we want to cut in 2 triangles It is thanks to this choice that we will be able to trace coast with right angles At each angle of coast remarkable by the existence of an unique land point or of an unique ocean point on one of the four summit of a rectangle i j we have to cut the rectangle following the diagonal passing by this point categories Graphics param MASKENTREE in optional type 2d array It is a 2d array which will serve to mask the field we will trace after with CONTOUR TRIANGULATION triangule mask If this argument is not specified the function use tmask keyword BASIC Specify that the mask is on a basic grid use the triangulation for vertical cuts and hovmoellers keyword KEEP_CONT To keep the triangulation even on the continents keyword COINMONTE type array To obtain the array of ascending land corner to be treated with completecointerre pro in the variable array instead of make it pass by the global variable twin_corners_up keyword COINDESCEND type array See COINMONTE returns res: tableau 2d 3 nbre de triangles Each line of res represent indexes of points constituting summits of a triangle See how we trace triangles in definetri pro uses common different definetri restrictions Data whose we want to do the contour must be disposed in a matrix On the other hand in the matrix the points s arrangement can not be irregular If it is use TRIANGULE history Sebastien Masson smasson lodyc jussieu fr 26 4 1999 version Id: triangule_c pro 370 2008 08 07 07:59:15Z pinsard todo seb L 267 268 je ne pense pas que ce soit ce que tu voulais dire mais c est la traduction de ce qu il y avait crit Correction si besoin FUNCTION triangule_c maskentree COINMONTE coinmonte COINDESCEND coindescend BASIC basic KEEP_CONT keep_cont compile_opt idl2 strictarrsubs tempsun systime 1 For key_performance cm_4mesh IF NOT keyword_set key_forgetold THEN BEGIN updatenew ENDIF Is the mask given or do we have to take tmask msk maskentree taille size msk nx taille 1 ny taille 2 IF n_elements keep_cont EQ 0 THEN keep_cont 1 key_irregular if keyword_set key_periodic nx EQ jpi AND NOT keyword_set basic then BEGIN msk msk msk 0 nx nx 1 ENDIF We will find the list of rectangles i j located by their left bottom corner we have to cut following a descendant diagonal We will call this list : pts_downward pts_downward 0 We construct the test which allow to find this triangle : shift msk 0 1 shift msk 1 1 msk shift msk 1 0 sum1 msk shift msk 1 0 shift msk 1 1 points which surround the left top point sum2 msk shift msk 0 1 shift msk 1 1 points which surround the right bottom point tempdeux systime 1 For key_performance 2 The left top land point surrounded by ocean points liste where 4 sum1 1 shift msk 0 1 EQ 1 if liste 0 NE 1 THEN pts_downward pts_downward liste The left top ocean point surrounded by land points liste where 1 sum1 shift msk 0 1 EQ 1 if liste 0 NE 1 THEN pts_downward pts_downward liste The right bottom land point surrounded by ocean points liste where 4 sum2 1 shift msk 1 0 EQ 1 if liste 0 NE 1 THEN pts_downward pts_downward liste The right bottom ocean point surrounded by land points liste where 1 sum2 shift msk 1 0 EQ 1 if liste 0 NE 1 THEN pts_downward pts_downward liste undefine liste IF testvar var key_performance EQ 2 THEN print temps triangule: trouver pts_downward systime 1 tempdeux if NOT keyword_set basic OR keyword_set coinmonte OR keyword_set coindescend then begin tempdeux systime 1 For key_performance 2 2 land points in ascendant diagonal with 2 ocean points in descendant diagonal coinmont where 1 msk 1 shift msk 1 1 shift msk 0 1 shift msk 1 0 EQ 1 if coinmont 0 NE 1 THEN pts_downward pts_downward coinmont IF testvar var key_performance EQ 2 THEN print temps triangule: trouver coinmont systime 1 tempdeux tempdeux systime 1 pour key_performance 2 coindesc where 1 shift msk 0 1 1 shift msk 1 0 msk shift msk 1 1 EQ 1 2 land points in descendant diagonal with 2 ocean points in ascendant diagonal IF testvar var key_performance EQ 2 THEN print temps triangule: trouver coindesc systime 1 tempdeux ENDIF if n_elements pts_downward EQ 1 then BEGIN tempdeux systime 1 For key_performance 2 triang definetri nx ny IF testvar var key_performance EQ 2 THEN print temps triangule: definetri systime 1 tempdeux coinmont 1 coindesc 1 ENDIF ELSE BEGIN tempdeux systime 1 For key_performance 2 pts_downward pts_downward 1:n_elements pts_downward 1 pts_downward pts_downward uniq pts_downward sort pts_downward None rectangle can have an element of the last column or of the last line as left bottom corner so we have to remove these points if they has been selected in pts_downward derniere_colonne lindgen ny 1 nx 1 derniere_ligne lindgen nx ny 1 nx pts_downward different pts_downward derniere_colonne pts_downward different pts_downward derniere_ligne if NOT keyword_set basic OR keyword_set coinmonte OR keyword_set coindescend then begin if coinmont 0 NE 1 then begin coinmont different coinmont derniere_colonne coinmont different coinmont derniere_ligne endif if coindesc 0 NE 1 then begin coindesc different coindesc derniere_colonne coindesc different coindesc derniere_ligne endif ENDIF ELSE BEGIN coinmont 1 coindesc 1 ENDELSE IF testvar var key_performance EQ 2 THEN print temps triangule: menage ds pts_downward coinmont et coindesc systime 1 tempdeux tempdeux systime 1 For key_performance 2 if pts_downward 0 EQ 1 then triang definetri nx ny ELSE triang definetri nx ny pts_downward IF testvar var key_performance EQ 2 THEN print temps triangule: definetri systime 1 tempdeux ENDELSE We delete land points which only contain land points if NOT keyword_set basic AND NOT keyword_set keep_cont then begin tempdeux systime 1 For key_performance 2 We delete rectangles which are entirely in the land recdsterre where 1 msk 1 shift msk 1 0 1 shift msk 0 1 1 shift msk 1 1 EQ 1 IF testvar var key_performance EQ 2 THEN print temps triangule: tous les recdsterre systime 1 tempdeux We do an other sort : We have to do not remove rectangles which only have one common summit t1 systime 1 indice intarr nx ny trimask intarr nx ny trimask 0:nx 2 0:ny 2 1 IF recdsterre 0 NE 1 then BEGIN tempdeux systime 1 For key_performance 2 indice recdsterre 1 if NOT keyword_set basic then begin vire1 0 vire2 0 while vire1 0 NE 1 OR vire2 0 NE 1 ne 0 do begin Delete rectangles we have to remove from recsterre in fact those we have to keep although they are entirely in the land vire1 where indice shift indice 1 1 1 shift indice 0 1 1 shift indice 1 0 trimask EQ 1 if vire1 0 NE 1 THEN BEGIN indice vire1 0 indice vire1 nx 1 0 endif vire2 where 1 indice 1 shift indice 1 1 shift indice 0 1 shift indice 1 0 trimask EQ 1 if vire2 0 NE 1 THEN BEGIN indice vire2 1 0 indice vire2 nx 0 endif endwhile IF testvar var key_performance EQ 2 THEN print temps triangule: trier les recdsterre systime 1 tempdeux endif indice ny 1 1 The last column and the last line indice nx 1 1 can not define any rectangle tempdeux systime 1 For key_performance 2 recgarde where indice EQ 0 We recuperate numbers of triangles we will keep trigarde 2 recgarde recgarde nx trigarde transpose temporary trigarde trigarde trigarde trigarde 1 triang triang temporary trigarde IF testvar var key_performance EQ 2 THEN print temps triangule: virer les triangle de la liste systime 1 tempdeux endif endif print temps tri triangles systime 1 t1 When key_periodic equal 1 triang is a list of indexes s array which have a surplus column We have to put it back to the initial matrix by putting indexes of the last column equal to these of the last column tempdeux systime 1 For key_performance 2 if keyword_set key_periodic nx 1 EQ jpi AND NOT keyword_set basic then BEGIN indicey triang nx indicex triang indicey nx nx nx 1 liste where indicex EQ nx if liste 0 NE 1 then indicex liste 0 triang indicex nx indicey nx nx 1 if coinmont 0 NE 1 then begin indicey coinmont nx indicex coinmont indicey nx nx nx 1 liste where indicex EQ nx if liste 0 NE 1 THEN indicex liste 0 coinmont indicex nx indicey nx nx 1 endif if coindesc 0 NE 1 then begin indicey coindesc nx indicex coindesc indicey nx nx nx 1 liste where indicex EQ nx if liste 0 NE 1 THEN indicex liste 0 coindesc indicex nx indicey nx nx 1 endif endif IF testvar var key_performance EQ 2 THEN print temps triangule: finitions systime 1 tempdeux if keyword_set coinmonte THEN coinmonte coinmont ELSE twin_corners_up coinmont if keyword_set coindescend THEN coindescend coindesc ELSE twin_corners_dn coindesc IF NOT keyword_set key_forgetold THEN BEGIN updateold ENDIF IF keyword_set key_performance THEN print temps triangule systime 1 tempsun return triang END"); a[346] = new Array("./ToBeReviewed/TRIANGULATION/triangule_e.html", "triangule_e.pro", "", " file_comments Build the triangulation for a E grid type categories Graphics param maskentree in optional type 2d array It is a 2d array which will serve to mask the field we will trace after with CONTOUR TRIANGULATION triangule mask If this argument is not specified the function use tmask keyword BASIC Specify that the mask is on a basic grid use the triangulation for vertical cuts and hovmoellers keyword COINMONTE type array To obtain the array of ascending land corner to be treated with completecointerre in the variable array instead of make it pass by the global variable twin_corners_up keyword COINDESCEND type array See COINMONTE keyword SHIFTED uses common history Sebastien Masson smasson lodyc jussieu fr june 2001 version Id: triangule_e pro 370 2008 08 07 07:59:15Z pinsard todo seb L 152 153 je ne pense pas que ce soit ce que tu voulais dire mais c est la traduction de ce qu il y avait crit Correction si besoin FUNCTION triangule_e maskentree COINMONTE coinmonte COINDESCEND coindescend SHIFTED shifted BASIC basic compile_opt idl2 strictarrsubs cm_4mesh IF NOT keyword_set key_forgetold THEN BEGIN updatenew ENDIF tempsun systime 1 For key_performance Is the mask given or do we have to take tmask msk maskentree sizem size msk nx sizem 1 ny sizem 2 if keyword_set key_periodic nx EQ jpi AND NOT keyword_set basic then BEGIN msk msk msk 0 nx nx 1 ENDIF we will find the diamond that must be cut in two triangle using the horizontal diagonal index lindgen nx ny index index 0:nx 2 1:ny 2 if n_elements shifted EQ 0 then shifted 1 oddeven index nx 1 shifted MOD 2 msk1 msk index msk2 msk index 1 sum msk index nx oddeven msk index nx oddeven sum1 msk2 sum sum2 msk1 sum horizontal singularpoint where msk1 EQ 0 AND sum1 EQ 3 OR msk1 EQ 1 AND sum1 EQ 0 OR msk2 EQ 0 AND sum2 EQ 3 OR msk2 EQ 1 AND sum2 EQ 0 OR sum EQ 0 AND msk1 msk2 EQ 2 if singularpoint 0 NE 1 then begin horizontal index singularpoint triang definetri_e nx ny horizontal SHIFTED shifted ENDIF ELSE triang definetri_e nx ny SHIFTED shifted coinmont index where sum EQ 2 AND msk1 msk2 EQ 0 coindesc index where sum EQ 0 AND msk1 msk2 EQ 2 we keep only the triangles which are outside the land but for some reasons we will in fact delete the land diamond allrecinland where sum1 msk1 EQ 0 indexallinland index allrecinland otherrec lindgen nx ny 0:nx 2 1:ny 2 otherrec different otherrec indexallinland index lindgen nx ny index index 0:nx 3 2:ny 3 out inter index indexallinland IF out 0 NE 1 THEN begin out inter out 1 indexallinland IF out 0 NE 1 THEN begin out out 1 oddeven out nx 1 shifted MOD 2 out inter out nx oddeven otherrec IF out 0 NE 1 THEN begin out inter out 2 nx otherrec IF out 0 NE 1 THEN begin out out nx out nx shifted MOD 2 endif endif endif ENDIF help out index lindgen nx ny index index 0:nx 3 2:ny 3 out inter index otherrec IF out 0 NE 1 THEN begin out inter out 1 otherrec IF out 0 NE 1 THEN begin out out 1 oddeven out nx 1 shifted MOD 2 out inter out nx oddeven indexallinland IF out 0 NE 1 THEN begin out inter out 2 nx indexallinland IF out 0 NE 1 THEN begin out out nx out nx shifted MOD 2 endif endif endif endif help out IF out 0 EQ 1 THEN out different indexallinland out ELSE out indexallinland triout numtri out nx ny triout triout triout 1 goodtri lindgen 2 nx 1 ny 1 goodtri different goodtri triout triang triang temporary goodtri When key_periodic equal 1 triang is a list of indexes s array which have a surplus column We have to put it back to the initial matrix by putting indexes of the last column equal to these of the last column tempdeux systime 1 For key_performance 2 if keyword_set key_periodic nx 1 EQ jpi AND NOT keyword_set basic then BEGIN indicey triang nx indicex triang indicey nx nx nx 1 liste where indicex EQ nx if liste 0 NE 1 then indicex liste 0 triang indicex nx indicey nx nx 1 if coinmont 0 NE 1 then begin indicey coinmont nx indicex coinmont indicey nx nx nx 1 liste where indicex EQ nx if liste 0 NE 1 THEN indicex liste 0 coinmont indicex nx indicey nx nx 1 endif if coindesc 0 NE 1 then begin indicey coindesc nx indicex coindesc indicey nx nx nx 1 liste where indicex EQ nx if liste 0 NE 1 THEN indicex liste 0 coindesc indicex nx indicey nx nx 1 endif endif IF testvar var key_performance EQ 2 THEN print temps triangule: finitions systime 1 tempdeux if arg_present coinmonte THEN coinmonte coinmont ELSE twin_corners_up coinmont if arg_present coindescend THEN coindescend coindesc ELSE twin_corners_dn coindesc IF NOT keyword_set key_forgetold THEN BEGIN updateold ENDIF IF keyword_set key_performance THEN print temps triangule systime 1 tempsun return triang END"); a[347] = new Array("./ToBeReviewed/UTILITAIRE/get_extra.html", "get_extra.pro", "", " elle fait quoi elle permet : soit de creer une variable extra contenant les mots clefs que tu desires soit de completer une variable extra avec des mots clefs que tu rajoutes imagine : tu es dans une routine et tu veux passer un mot clef en extra car la routine que tu appelles ne le connait pas mais la routine suivante oui tu fais extra get_extra ok year 1999 age_capitaine 35 et tu obtiens la bonne variable extra fait un help extra struc ou alors tu completes un extra existant : extra get_extra _extra extra name Guillaume todo seb FUNCTION get_extra _EXTRA extra compile_opt idl2 strictarrsubs return extra END "); a[348] = new Array("./ToBeReviewed/UTILITAIRE/oups.html", "oups.pro", "", ""); a[349] = new Array("./ToBeReviewed/UTILITAIRE/vzoom.html", "vzoom.pro", "", ""); a[350] = new Array("./ToBeReviewed/WIDGET/AUTOUR_de_XXX/buildcmd.html", "buildcmd.pro", "", " file_comments This function send back a string which contain the reading command and drawing s parameters param BASE in required keyword BOXZOOM Vector indicating the geographic zone on which we want to cut the map If BOXZOOM has : 1 element : The extraction is made on lon1 lon2 lat1 lat2 0 boxzoom 0 2 elements: The extraction is made on lon1 lon2 lat1 lat2 boxzoom 0 boxzoom 1 4 elements: The extraction is made on Boxzoom 0 max gdept gdepw 5 elements: The extraction is made on Boxzoom 0:3 0 Boxzoom 4 6 elements: The extraction is made on Boxzoom Where lon1 lon2 lat1 lat2 are global variables defined at the last domdef keyword FORCETYPE history Sebastien Masson smasson lodyc jussieu fr version Id: buildcmd pro 327 2007 12 13 16:22:35Z pinsard todo seb: documenter le param BASE et le keyword FORCETYPE FUNCTION buildcmd base BOXZOOM boxzoom FORCETYPE forcetype we get back the ids of the widget parts compile_opt idl2 strictarrsubs txtcmdid widget_info base find_by_uname txtcmd domainid widget_info base find_by_uname domain actionid widget_info base find_by_uname action optionid widget_info base find_by_uname option widget_control base get_uvalue top_uvalue smallin extractatt top_uvalue smallin numdessinin smallin 2 1 smallout extractatt top_uvalue smallout numdessinout smallout 2 1 options extractatt top_uvalue options optionsflag extractatt top_uvalue optionsflag portrait strtrim optionsflag where options EQ Portrait Landscape 0 1 0 We determinate which procedure we will call to do the drawing and the type IF keyword_set forcetype THEN type forcetype ELSE type widget_info actionid combobox_gettext case type of pltz diag up :procedure pltz pltz diag dn :procedure pltz pltt diag up :procedure pltt pltt diag dn :procedure pltt xy :procedure plt xz :procedure pltz yz :procedure pltz xt :procedure pltt yt :procedure pltt zt :procedure pltt x :procedure plt1d y :procedure plt1d z :procedure plt1d t :procedure pltt ELSE:procedure type endcase Search of options options extractatt top_uvalue options optionsflag extractatt top_uvalue optionsflag flags optionsflag numdessinin xindex flags where options EQ Longitude x index 0 yindex flags where options EQ Latitude y index 0 drawvecteur flags where options EQ Vecteur 0 procedure eq plt drawover flags where options EQ Overlay 0 alreadyread extractatt top_uvalue alreadyread alreadyvector extractatt top_uvalue alreadyvector alreadyover extractatt top_uvalue alreadyoer What must we read case 1 of alreadyover NE 1:BEGIN toread alreadyover 1 readswitch over END alreadyvector NE 1 AND alreadyvector NE pi:BEGIN toread alreadyvector 1 readswitch vector END alreadyread NE 1 AND alreadyread NE pi AND alreadyread NE 2 pi:BEGIN toread alreadyread 1 readswitch classic END else:BEGIN case 1 of alreadyvector eq pi:BEGIN toread alreadyover 1 readswitch over END alreadyread EQ pi:BEGIN toread alreadyvector 1 readswitch vector END alreadyread EQ 2 pi:BEGIN toread alreadyover 1 readswitch over END ELSE:BEGIN toread alreadyread 1 readswitch classic END endcase END ENDCASE widget_control txtcmdid get_value widcmd widcmd strtrim widcmd 2 IF widcmd 0 EQ THEN widcmd zzz cutcmd widcmd 0 toread numberofread prefix nameexp ending readcmd buildreadcmd base nameexp procedure type BOXZOOM boxzoom complete readswitch EQ classic AND alreadyread EQ 1 we look for the line containing funclec_name currentfile extractatt top_uvalue currentfile readparameters extractatt top_uvalue readparameters currentfile i 0 while strpos readcmd i readparameters funclec_name EQ 1 do i i 1 case readswitch of classic :BEGIN if alreadyread 1 EQ 0 then BEGIN we start the reading command readcmd beginning of reading the field to draw readcmd readcmd i 1 field prefix readcmd i 1 ENDIF ELSE BEGIN we complet the reading command oldrdcmd extractatt top_uvalue currentreadcmd nl n_elements oldrdcmd oldrdcmd nl 1 oldrdcmd nl 1 readcmd i prefix readcmd i readcmd temporary oldrdcmd temporary readcmd ENDELSE exit if we have to read other fields if alreadyread 1 NE numberofread 1 THEN BEGIN top_uvalue 1 findline top_uvalue currentreadcmd readcmd top_uvalue 1 findline top_uvalue alreadyread alreadyread 1 top_uvalue 1 findline top_uvalue noticebase xnotice Select the field number strtrim alreadyread 3 1 return ENDIF we finalize the reading command IF ending NE THEN BEGIN nl n_elements readcmd readcmd nl 1 readcmd nl 1 readcmd temporary readcmd ending ENDIF readcmd temporary readcmd field create_struct arr:temporary field grid:vargrid unit:varunit experiment:varexp name:varname end of reading the field to draw we get back _EXTRA: extra extractatt top_uvalue extra if xindex NE 0 then extra create_struct extra xindex xindex if yindex NE 0 then extra create_struct extra yindex yindex exextra cw_specifie_get_value base tgnm strlowcase tag_names exextra indtmp where tgnm EQ box OR tgnm EQ boxzoom cnt IF cnt EQ 1 THEN BEGIN boxextra exextra indtmp 0 exextra extractstru exextra box boxzoom ENDIF extra mixstru exextra extra sextra struct2string extra readcmd temporary readcmd extra sextra top_uvalue 1 findline top_uvalue currentreadcmd readcmd case 1 of drawvecteur:BEGIN we have to read the vectors top_uvalue 1 findline top_uvalue alreadyread pi top_uvalue 1 findline top_uvalue noticebase xnotice Select the zonal component of vector return END drawover:BEGIN we have to read the field to overlay top_uvalue 1 findline top_uvalue alreadyread 2 pi top_uvalue 1 findline top_uvalue noticebase xnotice Select the field to overlay return END finished we draw the plot ELSE: top_uvalue 1 findline top_uvalue alreadyread 1 endcase END vector :BEGIN for the vectors there is 2 components we read u when alreadyvector is a integer and v when alreadyvector is a integer 0 5 if floor alreadyvector 1 EQ 0 then begin if floor alreadyvector EQ alreadyvector then begin readcmd beginning of reading the zonal component of vector readcmd readcmd i 1 fieldu prefix readcmd i 1 ENDIF ELSE BEGIN readcmd beginning of reading the meridional component of vector readcmd readcmd i 1 fieldv prefix readcmd i 1 ENDELSE readcmd extractatt top_uvalue currentreadcmd temporary readcmd ENDIF ELSE BEGIN oldrdcmd extractatt top_uvalue currentreadcmd nl n_elements oldrdcmd oldrdcmd nl 1 oldrdcmd nl 1 readcmd i prefix readcmd i readcmd temporary oldrdcmd temporary readcmd ENDELSE case alreadyvector 1 of numberofread 1:BEGIN we finalize the reading command IF ending NE THEN BEGIN nl n_elements readcmd readcmd nl 1 readcmd nl 1 readcmd temporary readcmd ending ENDIF readcmd temporary readcmd fieldu create_struct arr:temporary fieldu grid:vargrid unit:varunit experiment:varexp name:varname end of reading the zonal component of vector top_uvalue 1 findline top_uvalue currentreadcmd readcmd we finished zonal component reading we know switch to meridional component top_uvalue 1 findline top_uvalue alreadyvector 5 top_uvalue 1 findline top_uvalue noticebase xnotice Select the meridional component of vector return END numberofread 0 5:BEGIN we finalize the reading command IF ending NE THEN BEGIN nl n_elements readcmd readcmd nl 1 readcmd nl 1 readcmd temporary readcmd ending ENDIF readcmd temporary readcmd fieldv create_struct arr:temporary fieldv grid:vargrid unit:varunit experiment:varexp name:varname end of reading the meridional component of vector we finished meridional component reading we get back _EXTRA of the vector and we complet extra already build extra extractatt top_uvalue extra exextra cw_specifie_get_value base extra mixstru exextra extra sextra struct2string extra readcmd readcmd vectorextra sextra extra mixstru extra vectorextra top_uvalue 1 findline top_uvalue currentreadcmd readcmd if drawover then BEGIN shall we do an overlay top_uvalue 1 findline top_uvalue alreadyvector pi top_uvalue 1 findline top_uvalue noticebase xnotice Select the field to overlay return ENDIF ELSE BEGIN it is done know top_uvalue 1 findline top_uvalue alreadyread 1 top_uvalue 1 findline top_uvalue alreadyvector 1 ENDELSE END ELSE:BEGIN we still need to read some vector components top_uvalue 1 findline top_uvalue currentreadcmd readcmd top_uvalue 1 findline top_uvalue alreadyvector alreadyvector 1 if floor alreadyvector EQ alreadyvector then text zonal ELSE text meridional top_uvalue 1 findline top_uvalue noticebase xnotice Select the strtrim floor alreadyread 3 1 text component of vector return END endcase END over :BEGIN if alreadyover 1 EQ 0 then begin we start the reading readcmd beginning of reading the field to overdraw readcmd readcmd i 1 fieldover prefix readcmd i 1 readcmd extractatt top_uvalue currentreadcmd temporary readcmd ENDIF ELSE BEGIN oldrdcmd extractatt top_uvalue currentreadcmd nl n_elements oldrdcmd oldrdcmd nl 1 oldrdcmd nl 1 readcmd i prefix readcmd i readcmd temporary oldrdcmd temporary readcmd ENDELSE if alreadyover 1 NE numberofread 1 THEN BEGIN we still need to read some files top_uvalue 1 findline top_uvalue currentreadcmd readcmd top_uvalue 1 findline top_uvalue alreadyover alreadyover 1 top_uvalue 1 findline top_uvalue noticebase xnotice Select the field number strtrim alreadyover 3 1 to overlay return ENDIF we finalize the reading command IF ending NE THEN BEGIN nl n_elements readcmd readcmd nl 1 readcmd nl 1 readcmd temporary readcmd ending ENDIF on finalise la commande de lecture readcmd readcmd fieldover create_struct arr:temporary fieldover grid:vargrid unit:varunit experiment:varexp name:varname end of reading the field to overdraw we get back _EXTRA of over and we complet extra already build extra extractatt top_uvalue extra exextra cw_specifie_get_value base extra mixstru exextra extra sextra struct2string extra readcmd readcmd overextra sextra extra mixstru extra overextra top_uvalue 1 findline top_uvalue currentreadcmd readcmd we reinitialize top_uvalue 1 findline top_uvalue alreadyread 1 top_uvalue 1 findline top_uvalue alreadyvector 1 top_uvalue 1 findline top_uvalue alreadyover 1 END endcase determination of the boxzoom s name if NOT keyword_set boxzoom then widget_control domainid get_value boxzoom CASE n_elements boxextra OF 0: 1:boxzoom 5 boxextra 2:boxzoom 4:5 boxextra 4:boxzoom 0:3 boxextra 5:boxzoom boxextra 0:3 0 boxextra 4 6:boxzoom boxextra ENDCASE Writing of this one as a string box strtrim boxzoom 0 1 for i 1 n_elements boxzoom 1 pmax 1 ENDELSE endif box box IF strpos type diag up NE 1 THEN BEGIN sendpoints strtrim boxzoom 0 1 strtrim boxzoom 2 1 strtrim boxzoom 1 1 strtrim boxzoom 3 1 ENDIF IF strpos type diag dn NE 1 THEN BEGIN sendpoints strtrim boxzoom 0 1 strtrim boxzoom 3 1 strtrim boxzoom 1 1 strtrim boxzoom 2 1 ENDIF We determinate typein IF strpos type diag NE 1 THEN typein strmid type 0 4 ELSE typein type determination of small ssmall tostr smallout We will define the string which will contain the command to be executed by widgetdessine pro Cmd readCmd procedure field boxzoom box findalways typein typein small ssmall IF drawvecteur then Cmd Cmd vecteur u: fieldu v: fieldv IF drawover then Cmd Cmd contour fieldover IF n_elements sendpoints NE 0 then Cmd Cmd endpoints sendpoints Cmd Cmd _extra mixstru ex extra portrait portrait NOERASE noerase print for i 0 n_elements Cmd 1 do print Cmd i print We complete and or update the structure top_uvalue top_uvalue 1 findline top_uvalue nameprocedures numdessinout procedure top_uvalue 1 findline top_uvalue types numdessinout type top_uvalue 1 findline top_uvalue domaines numdessinout boxzoom top_uvalue 1 findline top_uvalue txtcmd numdessinout widcmd top_uvalue 1 findline top_uvalue optionsflag numdessinout flags top_uvalue 1 findline top_uvalue exextra numdessinout extra return Cmd end "); a[351] = new Array("./ToBeReviewed/WIDGET/AUTOUR_de_XXX/buildreadcmd.html", "buildreadcmd.pro", "", " param BASE in required The id of the widget where apply the drawing param SNAMEEXP in required param PROCEDURE in required param TYPE in required keyword BOXZOOM Vector indicating the geographic zone on which we want to cut the map If BOXZOOM has : 1 element : The extraction is made on lon1 lon2 lat1 lat2 0 boxzoom 0 2 elements: The extraction is made on lon1 lon2 lat1 lat2 boxzoom 0 boxzoom 1 4 elements: The extraction is made on Boxzoom 0 max gdept gdepw 5 elements: The extraction is made on Boxzoom 0:3 0 Boxzoom 4 6 elements: The extraction is made on Boxzoom Where lon1 lon2 lat1 lat2 are global variables defined at the last domdef keyword COMPLETE keyword NAMEFIELD uses common history Sebastien Masson smasson lodyc jussieu fr version Id: buildreadcmd pro 370 2008 08 07 07:59:15Z pinsard todo seb: documenter les param et les keyword qui ne le sont pas FUNCTION buildreadcmd base snameexp procedure type BOXZOOM boxzoom COMPLETE complete NAMEFIELD namefield compile_opt idl2 strictarrsubs cm_4cal for key_caltype get back widgets IDs vlstid widget_info base find_by_uname varlist date1id widget_info base find_by_uname calendar1 date2id widget_info base find_by_uname calendar2 domainid widget_info base find_by_uname domain optionid widget_info base find_by_uname option widget_control base get_uvalue top_uvalue numdessinin extractatt top_uvalue smallin 2 1 numdessinout extractatt top_uvalue smallout 2 1 name of the file currentfile extractatt top_uvalue currentfile filelist extractatt top_uvalue filelist filename filelist currentfile sfilename filename name of the variable if keyword_set namefield then namevar namefield ELSE namevar widget_info vlstid combobox_gettext snamevar namevar get the options options extractatt top_uvalue options flags extractatt top_uvalue optionsflag flags flags numdessinin xindex flags where options EQ Longitude x index 0 yindex flags where options EQ Latitude y index 0 extra extractatt top_uvalue extra if xindex NE 0 then extra create_struct extra xindex xindex if yindex NE 0 then extra create_struct extra yindex yindex exextra cw_specifie_get_value base tgnm strlowcase tag_names exextra indtmp where tgnm EQ box OR tgnm EQ boxzoom cnt IF cnt EQ 1 THEN boxextra exextra indtmp 0 exextra extractstru exextra min max inter lct box boxzoom if size exextra type EQ 8 then extra mixstru exextra extra sextra struct2string extra find date1 and date2 key_caltype extractatt top_uvalue fileparameters currentfile caltype widget_control date1id get_value date1 widget_control date2id get_value date2 if procedure EQ pltt AND date1 EQ date2 then BEGIN we redefine the dates to the begining and end of the calendar calendar extractatt top_uvalue fileparameters currentfile time_counter date1 jul2date calendar 0 date2 jul2date calendar n_elements calendar 1 widget_control date1id set_value date1 widget_control date2id set_value date2 endif fakecal extractatt top_uvalue fileparameters currentfile fakecal IF keyword_set fakecal THEN BEGIN date1 date2jul date1 fakecal date2 date2jul date2 fakecal ENDIF IF size date1 type EQ 5 THEN sdate1 string date1 format f15 6 d ELSE sdate1 string date1 format i10 L IF size date2 type EQ 5 THEN sdate2 string date2 format f15 6 d ELSE sdate2 string date2 format i10 L find boxzoom if NOT keyword_set boxzoom then widget_control domainid get_value boxzoom CASE n_elements boxextra OF 0: 1:boxzoom 5 boxextra 2:boxzoom 4:5 boxextra 4:boxzoom 0:3 boxextra 5:boxzoom boxextra 0:3 0 boxextra 4 6:boxzoom boxextra ENDCASE put boxzoom into a string box strtrim boxzoom 0 1 for i 1 n_elements boxzoom 1 3 2 strpos type z EQ 1 do box box strtrim boxzoom i 1 if strpos type z NE 1 then BEGIN cm_4mesh min min gdept gdepw boxzoom 4:5 max max box box strtrim floor min 1 strtrim ceil max 1 endif box box IF strpos type diag up NE 1 THEN BEGIN sendpoints strtrim boxzoom 0 1 strtrim boxzoom 2 1 strtrim boxzoom 1 1 strtrim boxzoom 3 1 ENDIF IF strpos type diag dn NE 1 THEN BEGIN sendpoints strtrim boxzoom 0 1 strtrim boxzoom 3 1 strtrim boxzoom 1 1 strtrim boxzoom 2 1 ENDIF find funclec_name readparameters meshparameters readparameters extractatt top_uvalue readparameters currentfile funclec_name readparameters funclec_name if keyword_set complete then begin sreadparameters struct2string readparameters meshparameters extractatt top_uvalue meshparameters currentfile smeshparameters struct2string meshparameters We will define the string which will contain the command to be executed for the reading Cmd Definition of extra structure: extra sextra Definition of readparameters structure: readparameters sreadparameters Do we change of reading : dummy changeread readparameters Definition of meshparameters structure: meshparameters smeshparameters Do we change the grid : dummy changegrid meshparameters Read the data if n_elements date1in ne 0 then date1 date1in else date1 sdate1 if n_elements date2in ne 0 then date2 date2in else date2 sdate2 funclec_name snamevar date1 date2 snameexp timestep strtrim keyword_set fakecal 1 parent strtrim base 2 boxzoom box findalways filename sfilename if n_elements sendpoints NE 0 then Cmd Cmd endpoints sendpoints type type Cmd Cmd _extra mixstru ex extra nostruct top_uvalue 1 findline top_uvalue varinfo numdessinout filename namevar top_uvalue 1 findline top_uvalue dates numdessinout date1 date2 ENDIF ELSE BEGIN Cmd funclec_name snamevar sdate1 sdate2 snameexp timestep strtrim keyword_set fakecal 1 parent strtrim base 1 boxzoom box findalways filename sfilename if n_elements sendpoints NE 0 then Cmd Cmd endpoints sendpoints type type Cmd Cmd _extra mixstru ex extra nostruct ENDELSE print :::::::::::::::::::::: for i 0 n_elements Cmd 1 do print Cmd i print :::::::::::::::::::::: return cmd end"); a[352] = new Array("./ToBeReviewed/WIDGET/AUTOUR_de_XXX/changefield.html", "changefield.pro", "", " file_comments categories param BASE in required The id of the widget where apply the drawing param NEWFIELDNAME keyword BOXZOOM Vector indicating the geographic zone on which we want to cut the map If BOXZOOM has : 1 element : The extraction is made on lon1 lon2 lat1 lat2 0 boxzoom 0 2 elements: The extraction is made on lon1 lon2 lat1 lat2 boxzoom 0 boxzoom 1 4 elements: The extraction is made on Boxzoom 0 max gdept gdepw 5 elements: The extraction is made on Boxzoom 0:3 0 Boxzoom 4 6 elements: The extraction is made on Boxzoom Where lon1 lon2 lat1 lat2 are global variables defined at the last domdef returns uses restrictions examples history version Id: changefield pro 327 2007 12 13 16:22:35Z pinsard todo seb PRO changefield base newfieldname BOXZOOM boxzoom compile_opt idl2 strictarrsubs widget_control base get_uvalue top_uvalue Change exextra : exextra definedefaultextra newfieldname specifieid widget_info base find_by_uname specifie widget_control specifieid set_value exextra Change the variable Do we need to change the vertical axis according to the type of points T or W dthlv1id widget_info base find_by_uname dthlv1 widget_control dthlv1id get_uvalue dthlv1_uval oldzgridt dthlv1_uval grid_t get the type of point currentfile extractatt top_uvalue currentfile listgrid extractatt top_uvalue fileparameters currentfile listgrid listvar extractatt top_uvalue fileparameters currentfile listvar for i 0 n_elements listvar 1 do print listvar i listgrid i indexvar where listvar EQ newfieldname indexvar 0 indexvar 0 zgridt strupcase listgrid indexvar NE W if we change the type of point if zgridt NE oldzgridt then BEGIN update dthlv1_uval grid_t dthlv1_uval grid_t zgridt widget_control dthlv1id set_uvalue dthlv1_uval update cw_domain if NOT keyword_set boxzoom THEN widget_control widget_info base find_by_uname domain get_value boxzoom widget_control widget_info base find_by_uname domain set_value boxzoom endif return end"); a[353] = new Array("./ToBeReviewed/WIDGET/AUTOUR_de_XXX/changefile.html", "changefile.pro", "", " file_comments categories param BASE in required The id of the widget where apply the drawing param NEWFILENAME keyword BOXZOOM Vector indicating the geographic zone on which we want to cut the map If BOXZOOM has : 1 element : The extraction is made on lon1 lon2 lat1 lat2 0 boxzoom 0 2 elements: The extraction is made on lon1 lon2 lat1 lat2 boxzoom 0 boxzoom 1 4 elements: The extraction is made on Boxzoom 0 max gdept gdepw 5 elements: The extraction is made on Boxzoom 0:3 0 Boxzoom 4 6 elements: The extraction is made on Boxzoom Where lon1 lon2 lat1 lat2 are global variables defined at the last domdef keyword DATE1 keyword DATE2 keyword FIELDNAME returns uses restrictions examples history version Id: changefile pro 327 2007 12 13 16:22:35Z pinsard todo seb PRO changefile base newfilename BOXZOOM boxzoom DATE1 date1 DATE2 date2 FIELDNAME fieldname compile_opt idl2 strictarrsubs widget_control base hourglass widget_control base get_uvalue top_uvalue filelist extractatt top_uvalue filelist IF size newfilename type EQ 7 THEN newfile where filelist EQ newfilename 0 ELSE newfile newfilename it is already the index of the new file if newfile EQ 1 then begin nothing report invalid filename return endif oldfile extractatt top_uvalue currentfile oldfilename filelist oldfile did we really change the file if oldfile EQ newfile AND NOT keyword_set BOXZOOM OR keyword_set DATE1 OR keyword_set DATE2 OR keyword_set FIELDNAME then return widget_control base update 0 we update currentfile element of the top_uvalue top_uvalue 1 findline top_uvalue currentfile newfile Calendar oldcalendar extractatt top_uvalue fileparameters oldfile time_counter newcalendar extractatt top_uvalue fileparameters newfile time_counter Did we change the calendar if array_equal oldcalendar newcalendar NE 1 then begin cm_4cal for key_caltype key_caltype extractatt top_uvalue fileparameters newfile caltype fake or real calendar fakecal extractatt top_uvalue fileparameters newfile fakecal Which dates were selected date1id widget_info base find_by_uname calendar1 if NOT keyword_set date1 then widget_control date1id get_value date1 jdate1 date2jul date1 if where newcalendar EQ jdate1 0 EQ 1 then jdate1 newcalendar 0 date2id widget_info base find_by_uname calendar2 if NOT keyword_set date2 then widget_control date2id get_value date2 jdate2 date2jul date2 if where newcalendar EQ jdate2 0 EQ 1 then jdate2 date1 if jdate2 LT jdate1 THEN jdate2 jdate1 widget_control date1id destroy widget_control date2id destroy basecal widget_info base find_by_uname basecal rien cw_calendar basecal newcalendar jdate1 uname calendar1 FAKECAL fakecal uvalue name: calendar1 frame rien cw_calendar basecal newcalendar jdate2 uname calendar2 FAKECAL fakecal uvalue name: calendar2 frame ENDIF ELSE BEGIN if keyword_set date1 then begin date1id widget_info base find_by_uname calendar1 widget_control date1id set_value date1 endif if keyword_set date2 then begin date2id widget_info base find_by_uname calendar2 widget_control date2id set_value date2 endif ENDELSE Grid parameters and domain newgrid extractatt top_uvalue meshparameters newfile change changegrid newgrid if change OR keyword_set boxzoom then BEGIN if NOT keyword_set boxzoom then boxzoom 1 domainid widget_info base find_by_uname domain widget_control domainid set_value boxzoom endif file name IF oldfile NE newfile THEN BEGIN flstid widget_info base find_by_uname filelist widget_control flstid set_combobox_select newfile ENDIF Variables name vlstid widget_info base find_by_uname varlist oldfieldname widget_info vlstid combobox_gettext did we really change the liste of variables oldlistvar extractatt top_uvalue fileparameters oldfile listvar newlistvar extractatt top_uvalue fileparameters newfile listvar if array_equal oldlistvar newlistvar NE 1 THEN widget_control vlstid set_value newlistvar set the liste of variables to the new variable name if keyword_set fieldname then newfieldname fieldname ELSE newfieldname oldfieldname indexvar where newlistvar EQ newfieldname indexvar 0 indexvar 0 widget_control vlstid set_combobox_select indexvar newfieldname newlistvar indexvar did we change the name of the variable if newfieldname NE oldfieldname then BEGIN changefield base newfieldname BOXZOOM boxzoom ENDIF widget_control base update 1 return end"); a[354] = new Array("./ToBeReviewed/WIDGET/AUTOUR_de_XXX/createhistory.html", "createhistory.pro", "", " file_comments categories param BASE in required The id of the widget where apply the drawing param SMALL Vector composed of 3 or 4 elements applied to make a drawing on a small portion of a page or screen It delimit the zone where the drawing will be done If there is 4 elements: then is constituted of coordinates expressed in cm located from the up and left corner of the page or the window in portrait like in landscape of the bottom and left corner and of the up and right corner of the drawing zone If there is 3 elements: in this case we divide the page or the screen in small 0 columns and in small 1 lines the drawing made in the box numbered small 2 The numerotation starting up and left by the number 1 and then following the writing direction By default we make the largest drawing we can do conserving the aspect ratio except when REMPLI is activated returns uses restrictions examples history version Id: createhistory pro 367 2008 08 06 09:05:24Z pinsard todo seb: je ne suis pas sur pour les param documenter le reste PRO createhistory base small we save globalcommand in globaloldcommand compile_opt idl2 strictarrsubs widget_control base get_uvalue top_uvalue globalcommand extractatt top_uvalue globalcommand top_uvalue 1 findline top_uvalue globaloldcommand globalcommand portrait or landscape options extractatt top_uvalue options optionsflag extractatt top_uvalue optionsflag portrait optionsflag where options EQ Portrait Landscape 0 0 composition du text contennu ds history pro texte common if keyword_set postscript then begin noerase 1 openps infowidget infowidget portrait strtrim portrait 2 endif beginning of 1 end of 1 if small 0 small 1 GT 1 then begin for draw 1 small 0 small 1 1 do begin texte texte beginning of strtrim draw 1 2 noerase 1 end of strtrim draw 1 2 endfor ENDIF texte texte if keyword_set postscript then begin closeps infowidget infowidget printps endif the new globalcommand top_uvalue 1 findline top_uvalue globalcommand texte for i 0 n_elements texte 1 do print texte i return end"); a[355] = new Array("./ToBeReviewed/WIDGET/AUTOUR_de_XXX/cutcmd.html", "cutcmd.pro", "", " file_comments categories param WIDCMD param TOREAD param NUMBEROFREAD param PREFIX param NAMEEXP param ENDING returns uses restrictions examples history version Id: cutcmd pro 325 2007 12 06 10:04:53Z pinsard todo seb PRO cutcmd widcmd toread numberofread prefix nameexp ending compile_opt idl2 strictarrsubs dummy where byte widcmd EQ byte 0 nbdblquote CASE 1 OF nbdblquote MOD 2: stop odd numbers are impossibles nbdblquote GT 0: nbdblquote EQ 0:BEGIN widcmd is an expression of type: numb1 a numb2 b numb we will change into the form numb1 a numb2 b numb in order to suits the new method of cutcmd widcmd strtrim widcmd 2 we force to start with a or case 1 of strpos widcmd EQ 0: strpos widcmd EQ 0: ELSE:widcmd widcmd ENDCASE separator strsplit widcmd extract regex other strsplit widcmd extract IF n_elements separator NE n_elements other THEN stop widcmd FOR i 0 n_elements other 1 DO BEGIN IF isnumber other i LT 1 THEN other i other i widcmd widcmd separator i other i ENDFOR print widcmd END ENDCASE cutted strsplit widcmd extract IF strpos widcmd EQ 0 THEN start 0 ELSE start 1 nameexp cutted start: :2 numberofread n_elements nameexp IF toread GE numberofread then begin dummy report toread cannot be larger than numberofread stop ENDIF IF n_elements cutted EQ 1 THEN other ELSE other cutted 1 start: :2 make sure that we have a prefix for each nameexp IF start EQ 0 THEN other other nameexp nameexp toread prefix other toread IF n_elements other EQ numberofread 1 THEN ending other numberofread ELSE ending help prefix nameexp ending return end"); a[356] = new Array("./ToBeReviewed/WIDGET/AUTOUR_de_XXX/definedefaultextra.html", "definedefaultextra.pro", "", " file_comments categories param NOMVARIABLE returns uses restrictions examples history version Id: definedefaultextra pro 325 2007 12 06 10:04:53Z pinsard todo seb FUNCTION definedefaultextra nomvariable compile_opt idl2 strictarrsubs case strlowcase nomvariable of sn :BEGIN return get_extra min 31 max 37 inter 2 lct 33 nocontout END tn :BEGIN return get_extra min 20 max 31 inter 5 lct 39 END un :BEGIN return get_extra min 1 max 1 inter 1 lct 64 END vn :BEGIN return get_extra min 1 max 1 inter 1 lct 64 END ELSE: ENDCASE return get_extra min max inter lct 39 end"); a[357] = new Array("./ToBeReviewed/WIDGET/AUTOUR_de_XXX/doubleclickaction.html", "doubleclickaction.pro", "", " file_comments categories param EVENT returns uses restrictions examples history version Id: doubleclickaction pro 325 2007 12 06 10:04:53Z pinsard todo seb PRO doubleclickaction event compile_opt idl2 strictarrsubs widget_control event id get_uvalue uval widget_control event top get_uvalue top_uvalue We activate the right window widget_control event id get_value win wset win What is the selected drawing smallin extractatt top_uvalue smallin smallout extractatt top_uvalue smallout x convert_coord uval x 0 uval y 0 device to_normal 0 y convert_coord uval x 0 uval y 0 device to_normal 1 numcolonne n_elements where findgen smallin 0 smallin 0 lt x 1 numligne n_elements where findgen smallin 1 smallin 1 lt 1 y 1 numdessin numcolonne numligne smallin 0 1 Choice of the type of action case uval press of 1:BEGIN if top_uvalue smallin 2 NE numdessin then begin tracecadre smallin erase if total smallin EQ smallout EQ 3 then tracecadre smallout out smallin smallin 0:1 numdessin top_uvalue 1 findline top_uvalue smallin smallin tracecadre smallin p extractatt top_uvalue penvs numdessin 1 x extractatt top_uvalue xenvs numdessin 1 y extractatt top_uvalue yenvs numdessin 1 END 2:BEGIN if top_uvalue smallout 2 NE numdessin then begin tracecadre smallout erase if total smallin EQ smallout EQ 3 then tracecadre smallin smallout smallin 0:1 numdessin top_uvalue 1 findline top_uvalue smallout smallout tracecadre smallout out endif END 4:BEGIN tracecadre smallin 0:1 numdessin fill inserthistory event top beginning of strtrim numdessin 2 end of strtrim numdessin 2 Putting at 0 of attributes of the value concerning the drawing numdessin numdessin 1 top_uvalue 1 findline top_uvalue varinfo numdessin top_uvalue 1 findline top_uvalue dates numdessin 0l 0l top_uvalue 1 findline top_uvalue nameprocedures numdessin top_uvalue 1 findline top_uvalue types numdessin top_uvalue 1 findline top_uvalue domaines numdessin fltarr 6 top_uvalue 1 findline top_uvalue txtcmd numdessin if numdessin EQ smallin 2 then tracecadre smallin if numdessin EQ smallout 2 then tracecadre smallout out END ELSE: endcase updatewidget event top return end"); a[358] = new Array("./ToBeReviewed/WIDGET/AUTOUR_de_XXX/extractatt.html", "extractatt.pro", "", " file_comments categories param TOP_UVALUE param NAME returns uses restrictions examples history version Id: extractatt pro 325 2007 12 06 10:04:53Z pinsard todo seb FUNCTION extractatt top_uvalue name compile_opt idl2 strictarrsubs taille size top_uvalue j 1 repeat BEGIN j j 1 if j EQ size top_uvalue 2 then return 1 endrep until top_uvalue 0 j EQ name return top_uvalue 1 j end"); a[359] = new Array("./ToBeReviewed/WIDGET/AUTOUR_de_XXX/findline.html", "findline.pro", "", " file_comments categories param TOP_UVALUE param NAME returns uses restrictions examples history version Id: findline pro 325 2007 12 06 10:04:53Z pinsard todo seb FUNCTION findline top_uvalue name compile_opt idl2 strictarrsubs taille size top_uvalue j 1 repeat BEGIN j j 1 if j EQ size top_uvalue 2 then return 1 endrep until top_uvalue 0 j EQ name return j end"); a[360] = new Array("./ToBeReviewed/WIDGET/AUTOUR_de_XXX/identifyclick.html", "identifyclick.pro", "", " file_comments categories param EVENT returns uses restrictions examples history version Id: identifyclick pro 325 2007 12 06 10:04:53Z pinsard todo seb FUNCTION identifyclick event compile_opt idl2 strictarrsubs widget_control event id get_uvalue uval no_copy thisEvent TAG_NAMES event Structure if thisEvent EQ WIDGET_TIMER then press 0 ELSE press event press d 0 1 t 1 0 d 2 0 long click d 1 0 t 2 0 normal click d 2 1 d 3 0 t 0 0 double click t 3 0 d 0 0 double click type inutile case 1 OF d 0 0 1er reascending thisEvent EQ WIDGET_DRAW AND uval click EQ 0 AND press EQ 0: d 0 1 1er click of the series thisEvent EQ WIDGET_DRAW AND uval click EQ 0 AND press ge 1:BEGIN uval x event x 0 uval y event y 0 uval press press uval click 1 widget_control event id timer 3 END d 1 0 1er reascending thisEvent EQ WIDGET_DRAW AND uval click EQ 1 AND press EQ 0:uval click 2 d 2 0 End of the long click thisEvent EQ WIDGET_DRAW AND uval click EQ 2 AND press EQ 0:BEGIN type long uval x uval x 0 event x uval x uval x sort uval x uval y uval y 0 event y uval y uval y sort uval y uval click 0 uval press event release END d 2 1 thisEvent EQ WIDGET_DRAW AND uval click EQ 2 AND press ge 1:BEGIN type double uval press press uval click 3 END d 3 0 reascending and end of the double click thisEvent EQ WIDGET_DRAW AND uval click EQ 3 AND press EQ 0:uval click 0 t 0 0 End of the double click thisEvent EQ WIDGET_TIMER AND uval click EQ 0 AND press EQ 0: t 1 0 long click thisEvent EQ WIDGET_TIMER AND uval click EQ 1 AND press EQ 0:uval click 2 t 2 0 normal click thisEvent EQ WIDGET_TIMER AND uval click EQ 2 AND press EQ 0:BEGIN type single press uval press uval click 0 END t 3 0 End of the double click thisEvent EQ WIDGET_TIMER AND uval click EQ 3 AND press EQ 0:uval click 0 Impossible case in theory: ELSE:BEGIN print thisEvent uval click press print Probleme cas normalement impossible END endcase widget_control event id set_uvalue uval no_copy return type:type end"); a[361] = new Array("./ToBeReviewed/WIDGET/AUTOUR_de_XXX/inserthistory.html", "inserthistory.pro", "", " file_comments categories param BASE param TEXT param LINE1 param LINE2 returns uses restrictions examples history version Id: inserthistory pro 325 2007 12 06 10:04:53Z pinsard todo seb PRO inserthistory base text line1 line2 compile_opt idl2 strictarrsubs widget_control base get_uvalue top_uvalue globalcommand extractatt top_uvalue globalcommand top_uvalue 1 findline top_uvalue globaloldcommand globalcommand for i 0 n_elements globalcommand 1 do print globalcommand i we insert text between line1 and line2 index1 where globalcommand EQ line1 index1 index1 0 1 if index1 EQ 1 then begin rien report line1 not found in globalcommand return endif index2 where globalcommand EQ line2 index2 index2 0 if index2 EQ 1 then begin rien report line2 not found in globalcommand return ENDIF the new text: globalcommand globalcommand 0:index1 text globalcommand index2:n_elements globalcommand 1 the new globalcommand top_uvalue 1 findline top_uvalue globalcommand globalcommand return end"); a[362] = new Array("./ToBeReviewed/WIDGET/AUTOUR_de_XXX/letsdraw.html", "letsdraw.pro", "", " file_comments It is the procedure launching the drawing If we do not give the command to it it call construitcommande to know what to trace categories param BASE in required The id of the widget where apply the drawing keyword COMMANDE type string A string of the style: read_data sst keyword _EXTRA Used to pass keywords uses common history Sebastien Masson smasson lodyc jussieu fr version Id: letsdraw pro 370 2008 08 07 07:59:15Z pinsard PRO letsdraw base COMMANDE commande _EXTRA ex compile_opt idl2 strictarrsubs common we recuperate the uvalue of base widget_control base get_uvalue top_uvalue print help top_uvalue struct help top_uvalue exextra struct if NOT keyword_set commande then commande buildcmd base _extra ex if commande 0 EQ then return on recupere la uvalue de base widget_control base hourglass widget_control base get_uvalue top_uvalue print help top_uvalue struct print help top_uvalue exextra struct help top_uvalue extra struct print print commande help mixstru top_uvalue exextra top_uvalue extra struct we recuperate the id of the graphic associated to the widget of id base graphid extractatt top_uvalue graphid widget_control graphid get_value win We select it we will pass to it all commands concerning the window wset win erase 255 we clean the window We make sure that if we work with a screen coding colors on 24 bits the specified background color p background is the one applied if d n_colors gt 256 then begin device decomposed 1 p background ffffff x plot 0 0 device decomposed 0 ENDIF smallout long extractatt top_uvalue smallout numdessinout smallout 2 1 tracecadre smallout fill options extractatt top_uvalue options optionsflag extractatt top_uvalue optionsflag portrait strtrim optionsflag where options EQ Portrait Landscape 0 1 0 createpro common noerase 1 key_portrait portrait Commande filename myuniquetmpdir xxx_oneplot pro inserthistory base Commande beginning of strtrim smallout 2 1 end of strtrim smallout 2 1 top_uvalue 1 findline top_uvalue penvs numdessinout p top_uvalue 1 findline top_uvalue xenvs numdessinout x top_uvalue 1 findline top_uvalue yenvs numdessinout y return end"); a[363] = new Array("./ToBeReviewed/WIDGET/AUTOUR_de_XXX/loadgrid.html", "loadgrid.pro", "", " file_comments categories param MESHFILETXTIN keyword _EXTRA Used to pass keywords returns uses restrictions examples history version Id: loadgrid pro 327 2007 12 13 16:22:35Z pinsard todo seb PRO loadgrid meshfiletxtin _EXTRA ex meshfilein strsed meshfiletxtin compile_opt idl2 strictarrsubs cm_4mesh ccmeshparameters filename meshfilein split the name according to delimiter meshfile strsplit meshfilein extract meshfile strtrim meshfile 2 try to find a pro file with this name filepro find meshfile 0 firstfound onlypro if this is an idl batch file or a procedure if filepro NE NOT FOUND THEN BEGIN CASE protype filepro OF this is a procedure proc :listing file_basename filepro pro this is a function this case is not coded func :stop this is an IDL batch file batch :listing file_basename filepro pro ENDCASE ENDIF ELSE BEGIN filenc find meshfile 0 firstfound onlync if filenc EQ NOT FOUND THEN stop listing initncdf filenc ENDELSE add the arguments and keywords if necessary IF n_elements meshfile GT 1 AND strmid listing 0 1 NE THEN listing listing strmid meshfilein strpos meshfilein meshfilein strsed meshfilein IF strmid listing 0 1 NE THEN listing listing strcalling meshfilein _extra ex createpro listing filename myuniquetmpdir for_createpro pro _extra ex return END"); a[364] = new Array("./ToBeReviewed/WIDGET/AUTOUR_de_XXX/longclickaction.html", "longclickaction.pro", "", " file_comments categories param EVENT returns uses restrictions examples history version Id: longclickaction pro 325 2007 12 06 10:04:53Z pinsard todo seb PRO longclickaction event compile_opt idl2 strictarrsubs widget_control event id get_uvalue uval widget_control event top get_uvalue top_uvalue What is the selected drawing smallout extractatt top_uvalue smallout smallin extractatt top_uvalue smallin small smallin x convert_coord uval x 0 uval y 0 device to_normal 0 y convert_coord uval x 0 uval y 0 device to_normal 1 numcolonne n_elements where findgen small 0 small 0 lt x 1 numligne n_elements where findgen small 1 small 1 lt 1 y 1 numdessin numcolonne numligne small 0 we put on numdessin as the leader plot tracecadre smallin erase if total smallin EQ smallout EQ 3 then tracecadre smallout out smallin smallin 0:1 numdessin 1 top_uvalue 1 findline top_uvalue smallin smallin tracecadre smallin p extractatt top_uvalue penvs numdessin x extractatt top_uvalue xenvs numdessin y extractatt top_uvalue yenvs numdessin actionid widget_info event top find_by_uname action type widget_info actionid combobox_gettext Change the domain box: coor convert_coord uval x uval y device to_data x coor 0 0 coor 0 1 y coor 1 0 coor 1 1 domainid widget_info event top find_by_uname domain IF type EQ pltv THEN BEGIN currentfile extractatt top_uvalue currentfile listgrid extractatt top_uvalue fileparameters currentfile listgrid listvar extractatt top_uvalue fileparameters currentfile listvar vlstid widget_info event top find_by_uname varlist namevar widget_info vlstid combobox_gettext indexvar where listvar EQ namevar vargrid strupcase listgrid indexvar grille 1 glam gphi boxzoom glam x 0 y 0 glam x 1 y 1 gphi x 0 y 0 gphi x 1 y 1 ENDIF ELSE boxzoom x y Do we have to pass the boxzoom in indexes currentplot extractatt top_uvalue smallin 2 1 options extractatt top_uvalue options flags extractatt top_uvalue optionsflag flags flags currentplot changex flags where options EQ Longitude x index 0 EQ 1 changey flags where options EQ Latitude y index 0 EQ 1 if changex OR changey then begin We want to find the type of grid which is used currentfile extractatt top_uvalue currentfile listgrid extractatt top_uvalue fileparameters currentfile listgrid listvar extractatt top_uvalue fileparameters currentfile listvar vlstid widget_info event top find_by_uname varlist namevar widget_info vlstid combobox_gettext indexvar where listvar EQ namevar vargrid strupcase listgrid indexvar domdef boxzoom gridtype vargrid grille 1 1 1 1 nx ny nz firstx firsty firstz lastx lasty lastz if changex then boxzoom 0:1 firstx lastx if changey then boxzoom 2:3 firsty lasty endif widget_control domainid set_value boxzoom case uval press of 1:BEGIN nodates type EQ xt OR type EQ yt OR type EQ zt OR type EQ t updatewidget event top noboxzoom nodates nodates notype type NE plt letsdraw event top END 2:BEGIN IF type EQ plt THEN BEGIN top_uvalue 1 findline top_uvalue types smallout 2 1 pltz forcetype pltz ENDIF updatewidget event top noboxzoom letsdraw event top forcetype forcetype END 4:BEGIN IF type EQ plt THEN BEGIN top_uvalue 1 findline top_uvalue types smallout 2 1 pltt forcetype pltt ENDIF updatewidget event top noboxzoom nodates letsdraw event top forcetype forcetype END endcase return end"); a[365] = new Array("./ToBeReviewed/WIDGET/AUTOUR_de_XXX/read_vermair.html", "read_vermair.pro", "", " file_comments categories param NAME param DEBUT param FIN param NOMEXP keyword PARENT same as DIALOG_PARENT de dialog_message pro keyword BOXZOOM Vector indicating the geographic zone on which we want to cut the map If BOXZOOM has : 1 element : The extraction is made on lon1 lon2 lat1 lat2 0 boxzoom 0 2 elements: The extraction is made on lon1 lon2 lat1 lat2 boxzoom 0 boxzoom 1 4 elements: The extraction is made on Boxzoom 0 max gdept gdepw 5 elements: The extraction is made on Boxzoom 0:3 0 Boxzoom 4 6 elements: The extraction is made on Boxzoom Where lon1 lon2 lat1 lat2 are global variables defined at the last domdef keyword _EXTRA Used to pass keywords returns uses restrictions examples history version Id: read_vermair pro 327 2007 12 13 16:22:35Z pinsard todo seb FUNCTION read_vermair name debut fin nomexp PARENT parent BOXZOOM boxzoom _EXTRA ex compile_opt idl2 strictarrsubs common if name EQ un then name vozocrtx if name EQ vn then name vomecrty if debut EQ fin then begin res lec name debut nomexp BOXZOOM boxzoom _EXTRA ex ENDIF ELSE res lect name debut fin nomexp BOXZOOM boxzoom _EXTRA ex return tab:res grille:vargrid unite: experience:varexp nom:varname end"); a[366] = new Array("./ToBeReviewed/WIDGET/AUTOUR_de_XXX/scanfile.html", "scanfile.pro", "", " file_comments categories param NAMEFILE keyword GRID default T type scalar string Used to specify on which grid type are located the data keyword _EXTRA Used to pass keywords to isafile ncdf_getaxis and ncdf_gettime returns uses restrictions examples history version Id: scanfile pro 327 2007 12 13 16:22:35Z pinsard todo seb : I don t know what to do with that FUNCTION scanfile namefile GRID GRID _EXTRA ex liste des presupposes: 1 le fichier a lire est un fichier netcdf 2 le nom de ce fichier finit par U nc V nc W nc T nc ou F nc la lettre avant le nc designant la grille a laquelle se rapporte la champ Si tel n est pas la cas le fichier est attribue a la grille T 3 ce fichier contient une dimension infinie qui doit etre celle qui se rapporte au temps et au mois 2 autres dimensions dont les noms sont x lon xi_ et y lat ou eta_ ou bien en majuscule 4 il doit exister ds ce fichier une unique variable n ayant qu une dimension et etant la dimension temporelle cette variable sera prise comme axe des temps Rq: si plusieurs variables verifient ces criteres on considere la premiere variable 5 Cette variable axe des temps doit contenir l attribut units qui doit etre ecrit suivant la syntaxe: seconds since 0001 01 01 00:00:00 hours since 0001 01 01 00:00:00 days since 1979 01 01 00:59:59 months since 1979 01 01 00:59:59 years since 1979 01 01 00:59:59 je crois que c est tout GRID UTVWF to specify the type of grid Defaut is 1 based on the name of the file if the file ends by GRID _ TUVFW NC not case sensible or 2 T if case 1 is not found compile_opt idl2 strictarrsubs common filename fullname isafile filename namefile IODIRECTORY iodir _extra ex IF size fullname type NE 7 THEN return 1 open file cdfid ncdf_open fullname What contains the file inq ncdf_inquire cdfid name of all dimensions namedim strarr inq ndims for dimiq 0 inq ndims 1 do begin ncdf_diminq cdfid dimiq tmpname value namedim dimiq strlowcase tmpname ENDFOR x y dimensions id ncdf_getaxis cdfid dimidx dimidy _extra ex name of all variables we keep only the variables containing at least x y and time dimension if existing namevar strarr inq nvars for varid 0 inq nvars 1 do begin varinq ncdf_varinq cdfid varid what contains the variable if inter varinq dim dimidx 0 NE 1 AND inter varinq dim dimidy 0 NE 1 AND where varinq dim EQ inq recdim 0 NE 1 OR inq recdim EQ 1 THEN namevar varid varinq name ENDFOR namevar namevar where namevar NE find vargrid for each selected variable listgrid strarr n_elements namevar default definitions IF keyword_set grid THEN vargrid strupcase grid ELSE vargrid T look for values of vargrid for each variable IF finite glamu 0 EQ 1 AND NOT keyword_set grid THEN BEGIN for each variable look if we in one of the case corresponding to ROMS conventions FOR i 0 n_elements namevar 1 do begin varinq ncdf_varinq cdfid namevar i tmpnm namedim varinq dim are we in one of the case corresponding to ROMS conventions CASE 1 OF tmpnm 2 jpt ncdf_close cdfid return filename:fullname time_counter:time listvar:namevar listgrid:strupcase listgrid caltype:key_caltype fakecal:date0fk fakecal end"); a[367] = new Array("./ToBeReviewed/WIDGET/AUTOUR_de_XXX/selectfile.html", "selectfile.pro", "", " file_comments categories param EVENT returns uses restrictions examples history version Id: selectfile pro 327 2007 12 13 16:22:35Z pinsard todo seb: documenter EVENT PRO selectfile_event event compile_opt idl2 strictarrsubs common widget_control event id get_uvalue eventuvalue default definition of messenger when selectfile_event is called directly without calling xmanager widget_control event handler get_uvalue messenger messenger 1 IF chkstru eventuvalue name EQ 0 THEN return case eventuvalue name of cancel button Global Cancel :BEGIN widget_control event handler get_uvalue messenger messenger 1 widget_control event handler destroy END data file informations datafilename :BEGIN widget_control event id get_value filename filename isafile filename filename 0 onlync iodirectory iodir title data file name tryfind fully_qualify_path if size filename type NE 7 then BEGIN widget_control event id set_value return ENDIF widget_control event id set_value filename END browse datafilename :BEGIN filename isafile onlync title data file name tryfind fully_qualify_path iodirectory iodir if size filename type NE 7 then return widget_control widget_info event handler find_by_uname datafilename set_value filename END switch automatic by and mesh definition buttons gridload :BEGIN IF event select EQ 1 THEN BEGIN widget_control widget_info event handler find_by_uname argtxt set_value widget_control widget_info event handler find_by_uname kwdtxt set_value widget_control widget_info event handler find_by_uname kwd base sensitive 1 CASE event value OF via initnetcdf :BEGIN widget_control widget_info event handler find_by_uname meshload set_value initncdf editable 0 widget_control widget_info event handler find_by_uname arg base sensitive 0 widget_control widget_info event handler find_by_uname kwdlab set_value initncdf keywords: END via perso :BEGIN widget_control widget_info event handler find_by_uname meshload set_value editable 1 widget_control widget_info event handler find_by_uname arg base sensitive 1 widget_control widget_info event handler find_by_uname kwdlab set_value keywords of IDL procedure: END ENDCASE ENDIF END name of the procedure or batch file meshload :BEGIN widget_control event id get_value filename filename find filename 0 onlypro firstfound if filename EQ NOT FOUND then begin widget_control event id set_value return endif CASE protype filename OF this is a procedure proc :BEGIN widget_control widget_info event handler find_by_uname arg base sensitive 1 widget_control widget_info event handler find_by_uname kwd base sensitive 1 widget_control widget_info event handler find_by_uname kwdlab set_value file_basename filename pro keywords: END this is a function this case is not accepted func :BEGIN widget_control event id set_value return END this is an IDL batch file batch :BEGIN widget_control widget_info event handler find_by_uname arg base sensitive 0 widget_control widget_info event handler find_by_uname kwd base sensitive 0 widget_control widget_info event handler find_by_uname kwdlab set_value no keywords: END ENDCASE widget_control widget_info event handler find_by_uname argtxt set_value widget_control widget_info event handler find_by_uname kwdtxt set_value widget_control event id set_value file_basename filename pro END browse meshload :BEGIN filename isafile iodir homedir onlypro title to load the grid file if size filename type NE 7 then return meshload_id widget_info event handler find_by_uname meshload widget_control meshload_id set_value filename selectfile_event ID:meshload_id TOP:event top HANDLER:event handler END Lets Go button Lets Go :BEGIN widget_control widget_info event handler find_by_uname datafilename get_value datafilename datafilename datafilename 0 IF datafilename EQ THEN return datafilename isafile filename datafilename tryfind onlync title data file name fully_qualify_path if size datafilename type NE 7 then BEGIN widget_control widget_info event handler find_by_uname datafilename set_value return ENDIF widget_control widget_info event handler find_by_uname gridload get_value gridload widget_control widget_info event handler find_by_uname argtxt get_value argtxt argtxt strtrim argtxt 0 2 IF strpos argtxt EQ 0 THEN argtxt strmid argtxt 1 widget_control widget_info event handler find_by_uname kwdtxt get_value kwdtxt kwdtxt strtrim kwdtxt 0 2 IF strpos kwdtxt EQ 0 THEN kwdtxt strmid kwdtxt 1 CASE gridload 0 OF via perso :BEGIN meshload_id widget_info event handler find_by_uname meshload widget_control meshload_id get_value meshload meshload meshload 0 IF meshload EQ THEN return meshload find meshload 0 onlypro firstfound if meshload EQ NOT FOUND then begin widget_control meshload_id set_value return endif END via initnetcdf :meshload datafilename ENDCASE IF strlen argtxt NE 0 THEN meshload meshload argtxt IF strlen kwdtxt NE 0 THEN meshload meshload kwdtxt widget_control event handler get_uvalue messenger messenger create_struct datafilename datafilename meshload meshload widget_control event handler destroy END ELSE: endcase return end file_comments categories param DATAFILENAME param IDLFILE param ARGSPRO keyword _EXTRA Used to pass keywords returns uses restrictions examples history version Id: selectfile pro 327 2007 12 13 16:22:35Z pinsard todo seb: documenter les params FUNCTION selectfile datafilename idlfile argspro _EXTRA ex compile_opt idl2 strictarrsubs common We create a pointer in the uvalue to recuperate answers at setted questions atthe time of the use of this widget So when the widget is deleted in the procedure event pro the variable on which the pointer pointed contained in the uvalue of the widget is not deleted and we can recuperate the result messenger ptr_new allocate_heap base widget_base column title selectfile align_center uvalue messenger _EXTRA ex cancel button dummyid widget_button base value Cancel uvalue name: Global Cancel data file informations basea widget_base base row align_center dummyid widget_label basea value Data file name: database widget_text basea value uvalue name: datafilename uname datafilename xsize 45 EDITABLE dummyid widget_button basea value Browse uvalue name: browse datafilename switch automatic by and mesh definition buttons baseb widget_base base row align_center gdldid cw_bgroup baseb automatic grid construction with initncdf pro grid construction with other IDL batch or procedure exclusive set_value 0 uvalue name: gridload uname gridload button_uvalue via initnetcdf via perso name of the procedure or batch file basec widget_base base row align_center uname pro base dummyid widget_label basec value IDL batch file of procedure basemeshload widget_text basec value initncdf uvalue name: meshload uname meshload xsize 45 editable 0 dummyid widget_button basec value Browse uvalue name: browse meshload arguments informations based widget_base base row align_center uname arg base sensitive 0 dummyid widget_label based value procedure arguments argbase widget_text based value uvalue name: argtxt uname argtxt xsize 45 EDITABLE keyword informations basee widget_base base row align_center uname kwd base dummyid widget_label basee uname kwdlab value keywords of initncdf: dummyid widget_text basee value uvalue name: kwdtxt uname kwdtxt xsize 45 EDITABLE Lets Go button basego widget_button base value Lets Go uvalue name: Lets Go IF n_elements datafilename NE 0 THEN BEGIN widget_control database set_value datafilename selectfile_event ID:database TOP:base HANDLER:base ENDIF IF n_elements idlfile NE 0 THEN BEGIN idlfile isafile filename idlfile onlypro title pro file used to define the grid widget_control basemeshload set_value idlfile selectfile_event ID:basemeshload TOP:base HANDLER:base widget_control basemeshload get_value idlfile2 widget_control gdldid set_value 1 ENDIF IF n_elements argspro NE 0 THEN widget_control argbase set_value argspro IF n_elements datafilename EQ 0 THEN BEGIN widget_control base realize xmanager selectfile base event_handler selectfile_event no_block 0 ENDIF ELSE selectfile_event ID:basego TOP:base HANDLER:base get back the information from selectfile_event res messenger ptr_free messenger if size res type NE 8 then return 1 loadgrid res meshload _extra ex ccreadparameters funclec_name: read_ncdf jpidta:jpidta jpjdta:jpjdta jpkdta:jpkdta ixmindta:ixmindta ixmaxdta:ixmaxdta iymindta:iymindta iymaxdta:iymaxdta izmindta:izmindta izmaxdta:izmaxdta res3 scanfile res datafilename _extra ex if size res3 type NE 8 then return 1 return fileparameters:res3 readparameters:ccreadparameters meshparameters:ccmeshparameters end"); a[368] = new Array("./ToBeReviewed/WIDGET/AUTOUR_de_XXX/singleclickaction.html", "singleclickaction.pro", "", " file_comments categories param EVENT returns uses restrictions examples history version Id: singleclickaction pro 325 2007 12 06 10:04:53Z pinsard todo seb PRO singleclickaction event compile_opt idl2 strictarrsubs cm_4mesh cm_4data return widget_control event id get_uvalue uval widget_control event top get_uvalue top_uvalue actionid widget_info event top find_by_uname action type widget_info actionid combobox_gettext IF type NE plt THEN return We activate the right window widget_control event id get_value win wset win choice of the type of action case uval press of 1:BEGIN coor convert_coord uval x 0 uval y 0 device to_data x coor 0 y coor 1 help x y oldgrid vargrid CASE strupcase vargrid OF T :vargrid F W :vargrid F U :vargrid V V :vargrid U F :vargrid T ENDCASE grille 1 glam gphi 1 nx ny nz firstx firsty firstz lastx lasty lastz vargrid oldgrid define the corner of the cells in the clockwise direction IF keyword_set key_periodic AND nx EQ jpi THEN BEGIN x1 glam 0:ny 2 y1 gphi 0:ny 2 x2 glam 1:ny 1 y2 gphi 1:ny 1 x3 shift glam 1:ny 1 1 0 y3 shift gphi 1:ny 1 1 0 x4 shift glam 0:ny 2 1 0 y4 shift gphi 0:ny 2 1 0 ENDIF ELSE BEGIN x1 glam 0:nx 2 0:ny 2 y1 gphi 0:nx 2 0:ny 2 x2 glam 0:nx 2 1:ny 1 y2 gphi 0:nx 2 1:ny 1 x3 glam 1:nx 1 1:ny 1 y3 gphi 1:nx 1 1:ny 1 x4 glam 1:nx 1 0:ny 2 y4 gphi 1:nx 1 0:ny 2 ENDELSE glam 1 free memory gphi 1 free memory What is the longitude WHILE x GT x range 1 DO x x 360 WHILE x LT x range 0 DO x x 360 IF x GT x range 1 THEN RETURN IF y GT y range 1 THEN RETURN IF y LT y range 0 THEN RETURN cell inquad x y x1 y1 x2 y2 x3 y3 x4 y4 onsphere key_onearth x1 1 free memory y1 1 free memory x2 1 free memory y2 1 free memory x3 1 free memory y3 1 free memory x4 1 free memory y4 1 free memory IF cell 0 EQ 1 OR n_elements cell GT 1 THEN RETURN yy cell 0 nx 1 key_periodic nx EQ jpi xx cell 0 MOD nx 1 key_periodic nx EQ jpi CASE strupcase vargrid OF T :BEGIN xx xx firstx 1 yy yy firsty 1 END W :BEGIN xx xx firstx 1 yy yy firsty 1 END U :BEGIN xx xx firstx yy yy firsty 1 END V :BEGIN xx xx firstx 1 yy yy firsty END F :BEGIN xx xx firstx yy yy firsty END ENDCASE bad where xx GE jpi IF bad 0 NE 1 THEN BEGIN xx bad xx bad jpi yy bad yy bad 1 ENDIF bad where yy GE jpj IF bad 0 NE 1 THEN stop print glamt xx yy gphit xx yy cmd buildcmd event top boxzoom boxzoom END ELSE: endcase RETURN end"); a[369] = new Array("./ToBeReviewed/WIDGET/AUTOUR_de_XXX/tracecadre.html", "tracecadre.pro", "", " file_comments determination of the column and of the line corresponding in input to small categories param SMALL keyword OUT keyword ERASE keyword FILL returns uses restrictions examples history version Id: tracecadre pro 327 2007 12 13 16:22:35Z pinsard todo seb PRO tracecadre small OUT out ERASE erase FILL fill compile_opt idl2 strictarrsubs numdessin small 2 1 numligne numdessin small 0 numcolonne numdessin numligne small 0 determination of poscadre largeurcolonne 1 small 0 largeurligne 1 small 1 cadre numcolonne largeurcolonne 1 numligne 1 largeurligne numcolonne 1 largeurcolonne 1 numligne largeurligne decale 0 001 cadre cadre decale decale decale decale reinitplt p position 0 0 1 1 IF keyword_set fill then begin polyfill cadre 0 cadre 2 cadre 2 cadre 0 cadre 0 cadre 1 cadre 1 cadre 3 cadre 3 cadre 1 color 255 normal ENDIF ELSE BEGIN plot cadre 0 cadre 2 cadre 2 cadre 0 cadre 0 cadre 1 cadre 1 cadre 3 cadre 3 cadre 1 xrange 0 1 yrange 0 1 linestyle 2 keyword_set out noerase normal thick 2 color 0 255 keyword_set erase ENDELSE return end"); a[370] = new Array("./ToBeReviewed/WIDGET/AUTOUR_de_XXX/updatewidget.html", "updatewidget.pro", "", " file_comments categories param BASE in required The id of the widget where apply the drawing keyword NOBOXZOOM keyword NODATES keyword NOTYPE returns uses restrictions examples history version Id: updatewidget pro 327 2007 12 13 16:22:35Z pinsard todo seb PRO updatewidget base NOBOXZOOM noboxzoom NODATES nodates NOTYPE notype compile_opt idl2 strictarrsubs widget_control base get_uvalue top_uvalue smallin extractatt top_uvalue smallin numdessinin smallin 2 1 widget_control base update 0 date1 and date2 if keyword_set nodates then begin date1 0 date2 0 ENDIF ELSE BEGIN dates extractatt top_uvalue dates numdessinin date1 dates 0 date2 dates 1 ENDELSE domain boxzoom extractatt top_uvalue domaines numdessinin if total boxzoom EQ 0 then boxzoom 1 if keyword_set noboxzoom then boxzoom 0 varinfo: filename namevar varinfo extractatt top_uvalue varinfo numdessinin filename varinfo 0 nomvar varinfo 1 if filename NE OR nomvar NE THEN BEGIN changefile base filename fieldname nomvar BOXZOOM boxzoom DATE1 date1 DATE2 date2 ENDIF ELSE BEGIN if date1 NE 0 then begin date1id widget_info base find_by_uname calendar1 widget_control date1id set_value date1 endif if date2 NE 0 then begin date2id widget_info base find_by_uname calendar2 widget_control date2id set_value date2 endif if keyword_set boxzoom then BEGIN domainid widget_info base find_by_uname domain widget_control domainid set_value boxzoom endif ENDELSE exextra if n_elements extractatt top_uvalue exextra numdessinin NE 0 then begin exextra extractatt top_uvalue exextra numdessinin specifieid widget_info base find_by_uname specifie widget_control specifieid set_value exextra endif text command txtcmd extractatt top_uvalue txtcmd numdessinin if txtcmd NE then begin txtcmdid widget_info base find_by_uname txtcmd widget_control txtcmdid set_value txtcmd endif graphtype if NOT keyword_set notype then BEGIN graphtype extractatt top_uvalue types numdessinin if graphtype NE then begin actionid widget_info base find_by_uname action widget_control actionid get_value action_value widget_control actionid set_combobox_select where action_value EQ graphtype 0 endif endif widget_control base update 1 return end"); a[371] = new Array("./ToBeReviewed/WIDGET/AUTOUR_de_XXX/xcreateanim.html", "xcreateanim.pro", "", " file_comments categories param EVENT returns uses restrictions examples history version Id: xcreateanim pro 325 2007 12 06 10:04:53Z pinsard todo seb PRO xcreateanim_event event compile_opt idl2 strictarrsubs common We recuperate arguments contained in the widget if tag_names event structure_name NE WIDGET_BUTTON then return widget_control event id get_uvalue uval if n_elements uval EQ 0 then return if uval EQ cancel then begin widget_control event top destroy return ENDIF We will write the animation widget_control event top get_uvalue local_uvalue widget_control local_uvalue parent get_uvalue top_uvalue calendar extractatt top_uvalue fileparameters local_uvalue indexfile time_counter key_caltype extractatt top_uvalue fileparameters local_uvalue indexfile caltype fakecal extractatt top_uvalue fileparameters local_uvalue indexfile fakecal widget_control widget_info event top find_by_uname Filename get_value nomfic nomfic nomfic 0 widget_control widget_info event top find_by_uname directorie get_value animdir animdir animdir 0 widget_control widget_info event top find_by_uname debut get_value vdate1 index1 where abs calendar date2jul vdate1 LT 1 86400 0 if index1 EQ 1 then return widget_control widget_info event handler find_by_uname fin get_value vdate2 index2 where abs calendar date2jul vdate2 LT 1 86400 0 if index2 EQ 1 OR index2 LE index1 then return We delete the widget before create the file ps widget_control event top destroy creation of the routine which will serve us to do the drawing We recuperate the list of instructions globalcommand extractatt top_uvalue globalcommand We complete by first and last lines of the program createpro globalcommand filename myuniquetmpdir xxx2ps pro KWDLIST NOERASE noerase POSTSCRIPT postscript DATE1IN date1in DATE2IN date2in creation of the file we recuperate the number of octets on which we code the palette device get_visual_depth depth Picture s size in number of pixels : xsize d x_size ysize d y_size We check that the file s name end by gif if strpos nomfic gif EQ 1 then nomfic nomfic gif current_window d window window free pixmap xsize xsize ysize ysize indication of the number of the picture we are creating base widget_base sliderid widget_slider base minimum 1 maximum index2 index1 1 value 1 title image number: widget_control base realize Beginning of the gif file Writing of an empty picture IF keyword_set fakecal THEN date index1 ELSE date jul2date calendar index1 xxx2ps noerase date1in date date2in date image tvrd true depth GT 8 If an 8 bit image was read reduce the number of colors if depth le 8 then begin tvlct red green blue get reduce_colors image index red red index green green index blue blue index endif if depth gt 8 then Convert 24 bit image to 8 bit image color_quan image 1 red green blue colors 256 get_translation translation map_all write_gif animdir nomfic image red green blue multiple wdelete d window Creation and writting loop in the file IF index2 GT index1 THEN BEGIN FOR ind index1 1 index2 do BEGIN widget_control sliderid set_value ind index1 1 We move the slider window free pixmap xsize xsize ysize ysize IF keyword_set fakecal THEN date ind ELSE date jul2date calendar ind xxx2ps noerase date1 date date2 date image tvrd true depth GT 8 if depth gt 8 then image color_quan image 1 aaa bbb ccc colors 256 translation translation write_gif animdir nomfic image red green blue multiple wdelete d window ENDFOR ENDIF We put a last white picture window free pixmap xsize xsize ysize ysize reinitplt plot 0 0 nodata image tvrd true depth GT 8 if depth gt 8 then image color_quan image 1 aaa bbb ccc colors 256 translation translation write_gif animdir nomfic image red green blue multiple wdelete d window File s closing write_gif animdir nomfic close widget_control base destroy Rerock in normal mode thisOS strupcase strmid version os_family 0 3 wset current_window If we are under X we try to launch xanim if thisOS NE MAC AND thisOS NE WIN then begin spawn which xanim result if strpos result 0 xanim EQ strlen result 0 5 then spawn xanim animdir nomfic endif return end file_comments categories param PARENT returns uses restrictions examples history version Id: xcreateanim pro 325 2007 12 06 10:04:53Z pinsard todo seb PRO xcreateanim parent compile_opt idl2 strictarrsubs common widget_control parent get_uvalue top_uvalue We will make sure that all procedure are not in pltt procedures extractatt top_uvalue nameprocedures if total procedures EQ pltt NE 0 then begin nothing report Certains des plots ont un axe se rapportant au temps C Animation impossible error return ENDIF We will make sure that all figure have the same calendar filelist extractatt top_uvalue filelist filenames extractatt top_uvalue varinfo 0 filenames reform filenames filenames filenames uniq filenames sort filenames if strtrim filenames 0 1 EQ then filenames filenames 1:n_elements filenames 1 indexfile where filelist EQ filenames 0 0 calendar extractatt top_uvalue fileparameters indexfile time_counter key_caltype extractatt top_uvalue fileparameters indexfile caltype fakecal extractatt top_uvalue fileparameters indexfile fakecal if n_elements filenames GT 1 then begin for i 1 n_elements filenames 1 do begin indexfilebis where filelist EQ filenames i 0 calendarbis extractatt top_uvalue fileparameters indexfilebis time_counter if n_elements calendarbis NE n_elements calendar then begin nothing report plots do not use the same calendar C Animation impossible error return ENDIF if total calendar NE calendarbis NE 0 then begin nothing report plots do not use the same calendar C Animation impossible error return endif endfor endif It is possible to do an animation base widget_base column title animation creation uvalue parent:parent indexfile:indexfile rien widget_label base value animation name rien widget_text base value anim_idl gif uname Filename editable rien widget_label base value animation directory if n_elements animdir EQ 0 then cd current animdir rien widget_text base value animdir uname directorie editable rien widget_label base value starting date rien cw_calendar base calendar calendar 0 FAKECAL fakecal uname debut uvalue name: calendar frame rien widget_label base value ending date rien cw_calendar base calendar calendar n_elements calendar 1 FAKECAL fakecal uname fin uvalue name: calendar frame rien widget_button base value OK uvalue ok rien widget_button base value Cancel uvalue cancel widget_control base realize xmanager xcreateanim base no_block return end"); a[372] = new Array("./ToBeReviewed/WIDGET/AUTOUR_de_XXX/xxxmenubar_event.html", "xxxmenubar_event.pro", "", " file_comments categories param EVENT returns uses restrictions examples history version Id: xxxmenubar_event pro 325 2007 12 06 10:04:53Z pinsard todo seb PRO xxxmenubar_event event compile_opt idl2 strictarrsubs common case event value of Open :begin oldmeshparams ccmeshparameters newfile selectfile if size newfile type NE 8 then return widget_control event top hourglass widget_control event top update 0 widget_control event top get_uvalue top_uvalue We take care of filelist filelist extractatt top_uvalue filelist filelist filelist newfile fileparameters filename currentfile n_elements filelist 1 We update the widget filelistid widget_info event top find_by_uname filelist widget_control filelistid combobox_additem file_basename newfile fileparameters filename widget_control filelistid set_combobox_select currentfile We update filelist and currentfile s elements of the top_value top_uvalue 1 findline top_uvalue filelist filelist oldfile top_uvalue 1 findline top_uvalue currentfile top_uvalue 1 findline top_uvalue currentfile currentfile We take care of the name of the variable vlstid widget_info event top find_by_uname varlist What is the selected field Do we reselect it fieldname widget_info vlstid combobox_gettext index where newfile fileparameters listvar EQ fieldname widget_control vlstid set_value newfile fileparameters listvar widget_control vlstid set_combobox_select 0 index 0 We take care of the calendar key_caltype newfile fileparameters caltype date1id widget_info event top find_by_uname calendar1 widget_control date1id get_value date1 widget_control date1id destroy jdate1 jul2date date1 if where newfile fileparameters time_counter EQ jdate1 0 EQ 1 then jdate1 newfile fileparameters time_counter 0 date2id widget_info event top find_by_uname calendar2 widget_control date2id get_value date2 widget_control date2id destroy jdate2 jul2date date2 if where newfile fileparameters time_counter EQ jdate2 0 EQ 1 then jdate2 jdate1 basecal widget_info event top find_by_uname basecal fakecal newfile fileparameters fakecal rien cw_calendar basecal newfile fileparameters time_counter jdate1 uname calendar1 FAKECAL fakecal uvalue name: calendar1 frame rien cw_calendar basecal newfile fileparameters time_counter jdate2 uname calendar2 FAKECAL fakecal uvalue name: calendar2 frame We update fileparameters readparameters and meshparameters elements of the top_value newfileparameters ptrarr currentfile 1 allocate_heap FOR i 0 currentfile 1 DO newfileparameters i extractatt top_uvalue fileparameters i newfileparameters currentfile newfile fileparameters ptr_free extractatt top_uvalue fileparameters top_uvalue 1 findline top_uvalue fileparameters newfileparameters newreadparameters ptrarr currentfile 1 allocate_heap FOR i 0 currentfile 1 DO newreadparameters i extractatt top_uvalue readparameters i newreadparameters currentfile newfile readparameters ptr_free extractatt top_uvalue readparameters top_uvalue 1 findline top_uvalue readparameters newreadparameters newmeshparameters ptrarr currentfile 1 allocate_heap FOR i 0 currentfile 1 DO newmeshparameters i extractatt top_uvalue meshparameters i newmeshparameters currentfile newfile meshparameters ptr_free extractatt top_uvalue meshparameters top_uvalue 1 findline top_uvalue meshparameters newmeshparameters We update the widget if cmpgrid oldmeshparams then BEGIN domainid widget_info event top find_by_uname domain widget_control domainid set_value 1 endif widget_control event top update 1 end New xxx :BEGIN widget_control event top get_uvalue top_uvalue extra extractatt top_uvalue extra xxx CALLERWIDID event top _extra extra end Quit :begin widget_control event top get_uvalue top_uvalue ptr_free extractatt top_uvalue exextra ptr_free extractatt top_uvalue fileparameters ptr_free extractatt top_uvalue readparameters ptr_free extractatt top_uvalue meshparameters ptr_free top_uvalue widget_control event top destroy We shut the widget end PostScript :BEGIN IF lmgr demo EQ 1 THEN BEGIN dummy report impossible to save as postscript in demo mode return ENDIF widget_control event top get_uvalue top_uvalue We recuperate the list of instructions globalcommand extractatt top_uvalue globalcommand for i 0 n_elements globalcommand 1 do print globalcommand i We complete by first and last lines of the program createpro globalcommand filename myuniquetmpdir xxx2ps pro KWDLIST NOERASE noerase POSTSCRIPT postscript PORTRAIT portrait LANDSCAPE landscape DATE1IN date1in DATE2IN date2in POSTSCRIPT END Animated gif :begin IF float strmid version release 0 3 GE 6 2 THEN xcreateanim event top end Gif :BEGIN IF lmgr demo EQ 1 THEN BEGIN dummy report impossible to save as an image in demo mode return ENDIF widget_control event top get_uvalue top_uvalue smallin extractatt top_uvalue smallin numdessinin smallin 2 1 smallout extractatt top_uvalue smallout numdessinout smallout 2 1 tracecadre smallin erase tracecadre smallout erase filename xquestion In which GIF file do you want to save xxx screen xxx_image gif if rstrpos filename gif NE strlen filename 4 then filename filename gif filename isafile file filename io imagedir new saveimage filename quiet end IDL procedure :BEGIN IF lmgr demo EQ 1 THEN BEGIN dummy report impossible to save as a idl program file in demo mode return ENDIF We recuperate the name of the file filename xquestion In which IDL file do you want to save commands for this graph xxx_figure pro We complete it by a pro if rstrpos filename pro NE strlen filename 4 then filename filename pro filename isafile file filename io homedir new widget_control event top get_uvalue top_uvalue portrait or landscape options extractatt top_uvalue options optionsflag extractatt top_uvalue optionsflag portrait optionsflag where options EQ Portrait Landscape 0 0 We read commands to do a plot globalcommand extractatt top_uvalue globalcommand We complete by first and last lines of the program thisOS strupcase strmid version os_family 0 3 CASE thisOS of MAC :sep : WIN :sep ELSE:sep ENDCASE poslastsep rstrpos filename sep proname strmid filename poslastsep 1 strlen filename poslastsep 1 4 globalcommand pro proname NOERASE noerase POSTSCRIPT postscript PORTRAIT portrait LANDSCAPE landscape DATE1IN date1in DATE2IN date2in _extra ex globalcommand return end We write it in a program putfile filename globalcommand END RESTORE kwd of xxx :BEGIN IF lmgr demo EQ 1 THEN BEGIN dummy report impossible to save the widget in demo mode return ENDIF We recuperate the name of the file filename xquestion In which binary file do you want to save the widget xxx_widget dat We complete it by a dat if rstrpos filename dat NE strlen filename 4 then filename filename dat filename isafile file filename io homedir new widget_control event top get_uvalue uvalue widget_control extractatt uvalue graphid get_value win wshow win wset win image tvrd true save uvalue image filename filename END Print to prompt :BEGIN commande getfile myuniquetmpdir xxx_oneplot pro for i 0 n_elements commande 1 do print commande i end Portrait Landscape :begin widget_control event top get_uvalue top_uvalue options extractatt top_uvalue options index where options EQ Portrait Landscape index index 0 optionsflag extractatt top_uvalue optionsflag key_portrait 1 optionsflag index 0 top_uvalue 1 findline top_uvalue optionsflag index key_portrait Separated windows or windows stuck to the widget if widget_info event top find_by_uname graph EQ 0 then BEGIN We delete the window graphid extractatt top_uvalue graphid widget_control widget_info graphid parent destroy We recreate it basegraph widget_base title xxx window group_leader event top uvalue event top uname basegraph windsize givewindowsize graphid widget_draw basegraph uname graph uvalue name: graph press:0 click:0 x: 0 0 y: 0 0 button_events retain 2 xsize windsize 0 ysize windsize 1 widget_control basegraph realize xmanager xxx basegraph no_block We redraw what they were into it We recuperate the list of instructions globalcommand extractatt top_uvalue globalcommand We complete by first and last lines of the program createpro globalcommand filename myuniquetmpdir xxx2ps pro KWDLIST NOERASE noerase POSTSCRIPT postscript PORTRAIT portrait LANDSCAPE landscape KWDUSED noerase PORTRAIT portrait We reattribute the graphic element of the top_value top_uvalue 1 findline top_uvalue graphid graphid ENDIF ELSE BEGIN extra extractatt top_uvalue extra xxx CALLERWIDID event top redraw _extra extra widget_control event top destroy We shut the widget ENDELSE end Overlay :begin widget_control event top get_uvalue top_uvalue numdessinin extractatt top_uvalue smallin 2 1 options extractatt top_uvalue options flags extractatt top_uvalue optionsflag index where options EQ Overlay We change the flag on Longitude x index flag 1 flags index numdessinin flag flag 0 We reattribute it top_uvalue 1 findline top_uvalue optionsflag index numdessinin flag end Vecteur :BEGIN widget_control event top get_uvalue top_uvalue numdessinin extractatt top_uvalue smallin 2 1 options extractatt top_uvalue options flags extractatt top_uvalue optionsflag index where options EQ Vecteur We change the flag on Longitude x index flag 1 flags index numdessinin flag flag 0 We reattribute it top_uvalue 1 findline top_uvalue optionsflag index numdessinin flag end Longitude x index :BEGIN widget_control event top get_uvalue top_uvalue numdessinin extractatt top_uvalue smallin 2 1 options extractatt top_uvalue options flags extractatt top_uvalue optionsflag index where options EQ Longitude x index We change the flag on Longitude x index flag 1 flags index numdessinin flag flag 0 We reattribute it top_uvalue 1 findline top_uvalue optionsflag index numdessinin flag Now we will change sliders defining the boxzoom domainid widget_info event top find_by_uname domain boxzoom extractatt top_uvalue domaines numdessinin We want to find the type of grid which is used currentfile extractatt top_uvalue currentfile listgrid extractatt top_uvalue fileparameters currentfile listgrid listvar extractatt top_uvalue fileparameters currentfile listvar vlstid widget_info event top find_by_uname varlist namevar widget_info vlstid combobox_gettext indexvar where listvar EQ namevar vargrid strupcase listgrid indexvar if flag EQ 0 then BEGIN longitudes We do a domdef to find the lon1 lon2 corresponding to the boxzoom defined on the widget domdef boxzoom gridtype vargrid xindex yindex flags where options EQ Latitude y index numdessinin 0 widget_control domainid set_value lon1 lon2 boxzoom 2:3 ENDIF ELSE BEGIN xindex now we want to find firstx lastx corresponding to the boxzoom defined on the widget domdef boxzoom gridtype vargrid yindex flags where options EQ Latitude y index numdessinin 0 grille 1 1 1 1 nx ny nz firstx firsty firstz lastx lasty lastz widget_control domainid set_value firstx lastx boxzoom 2:3 ENDELSE We update the top_uvalue widget_control domainid get_value boxzoom top_uvalue 1 findline top_uvalue domaines numdessinin boxzoom end Latitude y index :begin widget_control event top get_uvalue top_uvalue numdessinin extractatt top_uvalue smallin 2 1 options extractatt top_uvalue options flags extractatt top_uvalue optionsflag index where options EQ Latitude y index We change the flag on Latitude y index flag 1 flags index numdessinin flag flag 0 We reattribute it top_uvalue 1 findline top_uvalue optionsflag index numdessinin flag Now we will change sliders defining the boxzoom domainid widget_info event top find_by_uname domain boxzoom extractatt top_uvalue domaines numdessinin We want to find the type of grid which is used currentfile extractatt top_uvalue currentfile listgrid extractatt top_uvalue fileparameters currentfile listgrid listvar extractatt top_uvalue fileparameters currentfile listvar vlstid widget_info event top find_by_uname varlist namevar widget_info vlstid combobox_gettext indexvar where listvar EQ namevar vargrid strupcase listgrid indexvar if flag EQ 0 then BEGIN latitudes We do a domdef to find the lat1 lat2 corresponding to the boxzoom defined on the widget domdef boxzoom gridtype vargrid yindex xindex flags where options EQ Longitude x index numdessinin 0 widget_control domainid set_value boxzoom 0:1 lat1 lat2 ENDIF ELSE BEGIN yindex now we want to find firsty lasty corresponding to the boxzoom defined on the widget domdef boxzoom gridtype vargrid xindex flags where options EQ Longitude x index numdessinin 0 grille 1 1 1 1 nx ny nz firstx firsty firstz lastx lasty lastz widget_control domainid set_value boxzoom 0:1 firsty lasty ENDELSE We update the top_uvalue widget_control domainid get_value boxzoom top_uvalue 1 findline top_uvalue domaines numdessinin boxzoom END endcase return end"); a[373] = new Array("./ToBeReviewed/WIDGET/COMPOUND_WIDGET/cw_bgroup.html", "cw_bgroup.pro", "", " file_comments categories Compound widget param ID param VALUE It is the default tick mark value a floating point number returns uses restrictions examples history version Id: cw_bgroup pro 327 2007 12 13 16:22:35Z pinsard PRO cw_bgroup_setv id value compile_opt hidden idl2 strictarrsubs ON_ERROR 2 return to caller stash WIDGET_INFO id CHILD WIDGET_CONTROL stash GET_UVALUE state NO_COPY case state type of 0: message unable to set plain button group value 1: begin WIDGET_CONTROL SET_BUTTON 0 state ids state excl_pos state excl_pos value WIDGET_CONTROL SET_BUTTON state ids value end 2: begin n n_elements value 1 for i 0 n do begin state nonexcl_curpos i value i WIDGET_CONTROL state ids i SET_BUTTON value i endfor end endcase WIDGET_CONTROL stash SET_UVALUE state NO_COPY end file_comments Compound widget categories param ID param VALUE It is the default tick mark value a floating point number returns uses restrictions examples history version Id: cw_bgroup pro 327 2007 12 13 16:22:35Z pinsard FUNCTION cw_bgroup_getv id value compile_opt hidden idl2 strictarrsubs ON_ERROR 2 return to caller stash WIDGET_INFO id CHILD WIDGET_CONTROL stash GET_UVALUE state NO_COPY case state type of 0: message unable to get plain button group value 1: ret state excl_pos 1: ret state ret_arr state excl_pos 2: ret state nonexcl_curpos 2: BEGIN index where state nonexcl_curpos NE 0 if index 0 EQ 1 then begin if size state ret_arr type EQ 7 then ret ELSE ret 1 ENDIF ELSE ret state ret_arr index END endcase WIDGET_CONTROL stash SET_UVALUE state NO_COPY return ret end file_comments Compound widget categories param EV returns uses restrictions examples history version Id: cw_bgroup pro 327 2007 12 13 16:22:35Z pinsard FUNCTION cw_bgroup_event ev compile_opt hidden idl2 strictarrsubs WIDGET_CONTROL ev handler GET_UVALUE stash WIDGET_CONTROL stash GET_UVALUE state NO_COPY WIDGET_CONTROL ev id get_uvalue uvalue ret 1 Assume we return a struct case state type of 0: 1: if ev select eq 1 then begin state excl_pos uvalue ENDIF else begin if state no_release ne 0 then ret 0 ENDELSE 2: begin Keep track of the current state state nonexcl_curpos uvalue ev select if state no_release ne 0 and ev select eq 0 then ret 0 end endcase if ret then begin Return a struct ret ID:state base TOP:ev top HANDLER:0L SELECT:ev select VALUE:state ret_arr uvalue efun state efun WIDGET_CONTROL stash SET_UVALUE state NO_COPY if efun ne then return CALL_FUNCTION efun ret else return ret endif else begin Trash the event WIDGET_CONTROL stash SET_UVALUE state NO_COPY return 0 endelse end file_comments CW_BGROUP is a compound widget that simplifies creating a base of buttons It handles the details of creating the proper base standard exclusive or non exclusive and filling in the desired buttons Events for the individual buttons are handled transparently and a CW_BGROUP event returned This event can return any one of the following: The Index of the button within the base The widget ID of the button The name of the button An arbitrary value taken from an array of User values categories Compound widget param PARENT in required The ID of the parent widget param NAMES type string array A string array containing one string per button giving the name of each button keyword BUTTON_UVALUE type array An array of user values to be associated with each button and returned in the event structure keyword COLUMN Buttons will be arranged in the number of columns specified by this keyword keyword EVENT_FUNCT The name of an optional user supplied event function for buttons This function is called with the return value structure whenever a button is pressed and follows the conventions for user written event functions keyword EXCLUSIVE Buttons will be placed in an exclusive base with only one button allowed to be selected at a time keyword FONT The name of the font to be used for the button titles If this keyword is not specified the default font is used keyword FRAME Specifies the width of the frame to be drawn around the base keyword IDS A named variable into which the button IDs will be stored as a longword vector keyword LABEL_LEFT Creates a text label to the left of the buttons keyword LABEL_TOP Creates a text label above the buttons keyword MAP If set the base will be mapped when the widget is realized the default keyword NONEXCLUSIVE Buttons will be placed in an non exclusive base The buttons will be independent keyword NO_RELEASE If set button release events will not be returned keyword RETURN_ID If set the VALUE field of returned events will be the widget ID of the button keyword RETURN_INDEX If set the VALUE field of returned events will be the zero based index of the button within the base THIS IS THE DEFAULT keyword RETURN_NAME If set the VALUE field of returned events will be the name of the button within the base keyword ROW Buttons will be arranged in the number of rows specified by this keyword keyword SCROLL If set the base will include scroll bars to allow viewing a large base through a smaller viewport keyword SET_VALUE The initial value of the buttons This is equivalent to the later statement: WIDGET_CONTROL widget set_value value keyword SPACE The space in pixels to be left around the edges of a row or column major base This keyword is ignored if EXCLUSIVE or NONEXCLUSIVE are specified keyword UVALUE The user value to be associated with the widget keyword UNAME The user name to be associated with the widget keyword XOFFSET The X offset of the widget relative to its parent keyword XPAD The horizontal space in pixels between children of a row or column major base Ignored if EXCLUSIVE or NONEXCLUSIVE are specified keyword XSIZE The width of the base keyword X_SCROLL_SIZE The width of the viewport if SCROLL is specified keyword YOFFSET The Y offset of the widget relative to its parent keyword YPAD The vertical space in pixels between children of a row or column major base Ignored if EXCLUSIVE or NONEXCLUSIVE are specified keyword YSIZE The height of the base keyword Y_SCROLL_SIZE The height of the viewport if SCROLL is specified returns The ID of the created widget is returned restrictions This widget generates event structures with the following definition: event ID:0L TOP:0L HANDLER:0L SELECT:0 VALUE:0 The SELECT field is passed through from the button event VALUE is either the INDEX ID NAME or BUTTON_UVALUE of the button depending on how the widget was created restrictions Only buttons with textual names are handled by this widget Bitmaps are not understood history 15 June 1992 AB 7 April 1993 AB Removed state caching 6 Oct 1994 KDB Font keyword is not applied to the label 10 FEB 1995 DJC fixed bad bug in event procedure getting id of stash widget 11 April 1995 AB Removed Motif special cases Copyright c 1992 2005 Research Systems Inc All rights reserved Unauthorized reproduction prohibited version Id: cw_bgroup pro 327 2007 12 13 16:22:35Z pinsard FUNCTION cw_bgroup parent names BUTTON_UVALUE button_uvalue COLUMN column EVENT_FUNCT efun EXCLUSIVE excl FONT font FRAME frame IDS ids LABEL_TOP label_top LABEL_LEFT label_left MAP map NONEXCLUSIVE nonexcl NO_RELEASE no_release RETURN_ID return_id RETURN_INDEX return_index RETURN_NAME return_name ROW row SCROLL scroll SET_VALUE sval SPACE space TAB_MODE tab_mode UVALUE uvalue XOFFSET xoffset XPAD xpad XSIZE xsize X_SCROLL_SIZE x_scroll_size YOFFSET yoffset YPAD ypad YSIZE ysize Y_SCROLL_SIZE y_scroll_size UNAME uname compile_opt hidden idl2 strictarrsubs IF N_PARAMS ne 2 THEN ras report Incorrect number of arguments ON_ERROR 2 return to caller Set default values for the keywords version WIDGET_INFO version if version toolkit eq OLIT then def_space_pad 4 else def_space_pad 3 IF N_ELEMENTS column eq 0 then column 0 IF N_ELEMENTS excl eq 0 then excl 0 IF N_ELEMENTS frame eq 0 then frame 0 IF N_ELEMENTS map eq 0 then map 1 IF N_ELEMENTS nonexcl eq 0 then nonexcl 0 IF N_ELEMENTS no_release eq 0 then no_release 0 IF N_ELEMENTS row eq 0 then row 0 IF N_ELEMENTS scroll eq 0 then scroll 0 IF N_ELEMENTS space eq 0 then space def_space_pad IF N_ELEMENTS uname eq 0 then uname CW_BGROUP_UNAME IF N_ELEMENTS uvalue eq 0 then uvalue 0 IF N_ELEMENTS xoffset eq 0 then xoffset 0 IF N_ELEMENTS xpad eq 0 then xpad def_space_pad IF N_ELEMENTS xsize eq 0 then xsize 0 IF N_ELEMENTS x_scroll_size eq 0 then x_scroll_size 0 IF N_ELEMENTS yoffset eq 0 then yoffset 0 IF N_ELEMENTS ypad eq 0 then ypad def_space_pad IF N_ELEMENTS ysize eq 0 then ysize 0 IF N_ELEMENTS y_scroll_size eq 0 then y_scroll_size 0 top_base 0L if n_elements label_top ne 0 then begin next_base WIDGET_BASE parent XOFFSET xoffset YOFFSET yoffset COLUMN if keyword_set font then junk WIDGET_LABEL next_base value label_top font font else junk WIDGET_LABEL next_base value label_top top_base next_base endif else next_base parent if n_elements label_left ne 0 then begin next_base WIDGET_BASE next_base XOFFSET xoffset YOFFSET yoffset ROW if keyword_set font then junk WIDGET_LABEL next_base value label_left font font else junk WIDGET_LABEL next_base value label_left if top_base eq 0L then top_base next_base endif We need some kind of outer base to hold the users UVALUE if top_base eq 0L then begin top_base WIDGET_BASE parent XOFFSET xoffset YOFFSET yoffset next_base top_base endif If top_base EQ next_base THEN next_base WIDGET_BASE top_base Xpad 1 Ypad 1 Space 1 Set top level base attributes WIDGET_CONTROL top_base MAP map FUNC_GET_VALUE CW_BGROUP_GETV PRO_SET_VALUE CW_BGROUP_SETV SET_UVALUE uvalue SET_UNAME uname Tabbing if n_elements tab_mode ne 0 then begin WIDGET_CONTROL top_base TAB_MODE tab_mode WIDGET_CONTROL next_base TAB_MODE tab_mode end The actual button holding base base WIDGET_BASE next_base COLUMN column EXCLUSIVE excl FRAME frame NONEXCLUSIVE nonexcl ROW row SCROLL scroll SPACE space XPAD xpad XSIZE xsize X_SCROLL_SIZE x_scroll_size YPAD ypad YSIZE ysize Y_SCROLL_SIZE y_scroll_size EVENT_FUNC CW_BGROUP_EVENT UVALUE WIDGET_INFO top_base child n n_elements names ids lonarr n for i 0 n 1 do begin if n_elements font eq 0 then begin ids i WIDGET_BUTTON base value names i UVALUE i UNAME uname _BUTTON STRTRIM i 2 endif else begin ids i WIDGET_BUTTON base value names i FONT font UVALUE i UNAME uname _BUTTON STRTRIM i 2 endelse endfor Keep the state info in the real inner base UVALUE Pick an event value type: 0 Return ID 1 Return INDEX 2 Return NAME ret_type 1 if KEYWORD_SET RETURN_ID then ret_type 0 if KEYWORD_SET RETURN_NAME then ret_type 2 if KEYWORD_SET BUTTON_UVALUE then ret_type 3 case ret_type of 0: ret_arr ids 1: ret_arr indgen n 2: ret_arr names 3: ret_arr button_uvalue endcase type 0 if excl ne 0 then type 1 if nonexcl ne 0 then type 2 if n_elements efun le 0 then efun state type:type 0 Standard 1 Exclusive 2 Non exclusive base: top_base cw_bgroup base ret_arr:ret_arr Vector of event values efun : efun Name of event fcn nonexcl_curpos:intarr n If non exclus tracks state excl_pos:0 If exclusive current button ids:ids Ids of buttons no_release:no_release WIDGET_CONTROL WIDGET_INFO top_base CHILD SET_UVALUE state NO_COPY if n_elements sval ne 0 then CW_BGROUP_SETV top_base sval return top_base END"); a[374] = new Array("./ToBeReviewed/WIDGET/COMPOUND_WIDGET/cw_calendar.html", "cw_calendar.pro", "", " IDL testwid julday 1 1 1980 lindgen 100 5 PRO testwid_event event ComboboxId widget_info event top find_by_uname c est lui widget_control event id get_uvalue uval if n_elements uval EQ 0 then return case uval of done :widget_control event top destroy set :BEGIN widget_control event id get_value value widget_control ComboboxId set_value value END get :BEGIN widget_control ComboboxId get_value value help value struct END ELSE: endcase return end PRO testwid calendar date0 _extra ex base widget_base COLUMN print base base nothing widget_label base value beginning of the test nothing cw_calendar base calendar date0 _extra ex uname c est lui uvalue c est lui print cw_calendar ID nothing nothing widget_label base value end of the test nothing widget_text base value string calendar 0 uvalue set editable nothing widget_button base value get uvalue get nothing widget_button base value done uvalue done widget_control base REALIZE xmanager testwid base return END file_comments categories Compound widget param ID param VALUE It is the default tick mark value a floating point number returns uses restrictions examples history version Id: cw_calendar pro 371 2008 08 07 09:32:02Z pinsard PRO cw_calendar_set_value id value compile_opt strictarr strictarrsubs cm_4cal get back the calendar and its related informations winfo_id widget_info id find_by_uname infocal widget_control winfo_id get_uvalue infowid key_caltype infowid caltype high freqeuncy calendar IF keyword_set infowid fakecal THEN BEGIN value2 date2jul long value infowid fakecal IF value2 LT n_elements infowid calendar AND value2 GE 0 THEN BEGIN stepid widget_info id find_by_uname step widget_control stepid set_value combobox_select:value2 infowid date jul2date value2 infowid fakecal widget_control winfo_id set_uvalue infowid ENDIF ENDIF ELSE BEGIN jdval date2jul value check that the date exists in the calendar if where abs infowid calendar jdval LT 1 d 86400 d 0 EQ 1 then return update the value of infocal infowid date value widget_control winfo_id set_uvalue infowid update the combobox if needed possiblecase day month year for name 2 0 1 do BEGIN call set_cal_combobox with out 2 to specify that the call is coming from cw_calendar_set_value if widget_info id find_by_uname possiblecase name NE 0 then set_cal_combobox handler:id out:2 possiblecase name value ENDFOR ENDELSE return end file_comments categories Compound widget param ID returns uses restrictions examples history version Id: cw_calendar pro 371 2008 08 07 09:32:02Z pinsard FUNCTION cw_calendar_get_value id compile_opt strictarr strictarrsubs winfo_id widget_info id find_by_uname infocal widget_control winfo_id get_uvalue infowid return infowid date END file_comments categories Compound widget param ID param WINFOID returns uses restrictions examples history version Id: cw_calendar pro 371 2008 08 07 09:32:02Z pinsard FUNCTION get_cal_value id winfoid compile_opt strictarr strictarrsubs winfo_id widget_info id find_by_uname infocal widget_control winfo_id get_uvalue infowid oldate infowid date day wid_id widget_info id find_by_uname day if wid_id NE 0 then BEGIN widget_control wid_id get_value wid_value widget_control wid_id get_uvalue wid_uvalue date double wid_value combobox_gettext wid_uvalue hms wid_value combobox_index ENDIF ELSE date oldate MOD 100L month wid_id widget_info id find_by_uname month if wid_id NE 0 then BEGIN widget_control wid_id get_value wid_value allmonths string format C CMoA 31 indgen 12 month where allmonths EQ wid_value combobox_gettext 0 1 date date 100L long month ENDIF ELSE date date oldate MOD 10000L 100L 100L year wid_id widget_info id find_by_uname year widget_control wid_id get_value wid_value date date 10000L long wid_value combobox_gettext IF arg_present winfoid NE 0 THEN BEGIN winfoid winfo_id infowid date date return infowid ENDIF ELSE return date end redefine the value and index position of the combobox file_comments categories Compound widget param EVENT param CASENAME param DATE0 returns uses restrictions examples history version Id: cw_calendar pro 371 2008 08 07 09:32:02Z pinsard PRO set_cal_combobox event casename date0 compile_opt strictarr strictarrsubs casename: Which widget shall we move: day month or year wid_id widget_info event handler find_by_uname casename we get back the calendar winfo_id widget_info event handler find_by_uname infocal widget_control winfo_id get_uvalue infowid caldat infowid calendar monthcal daycal yearcal hourcal mincal seccal and the current date IF n_elements date0 EQ 0 then date0 get_cal_value event handler jdate0 date2jul date0 month month0 day day0 year year0 index of days months years according to date0 case casename of day :BEGIN list of days corresponding to month0 and year0 index where monthcal EQ month0 AND yearcal EQ year0 current daycal index hms hourcal index 24 0d0 mincal index 1440 0d0 seccal index 86400 0d0 END month :BEGIN list of months corresponding to year0 index where yearcal EQ year0 current monthcal index keep only the uniq values indexbis uniq current index index indexbis current current indexbis END year :BEGIN keep only the uniq years index uniq yearcal current yearcal index END ENDCASE we update the uvalue of the widget IF casename EQ day THEN widget_control wid_id set_uvalue name:casename hms:hms for event out 0 we store the previous position of the combobox to use it as the default position IF event out EQ 0 THEN widget_control wid_id get_value oldselect we redefine the new list if casename EQ month then begin widget_control wid_id set_value string format C CMoA 31 current 1 ENDIF ELSE BEGIN widget_control wid_id set_value strtrim current 1 ENDELSE specify the index position within the new list of values widget_control wid_id get_value combobox CASE event out OF 1: we put to the biggest position 1:selected combobox combobox_number 1 0: same as the previous position is the best choice 0:selected oldselect combobox_index combobox combobox_number 1 1: we put to the smallest position 1:selected 0 2: a new date has been specified 2:BEGIN case casename of day :selected where current EQ day0 0 month :selected where current EQ month0 0 year :selected where current EQ year0 0 ENDCASE END ENDCASE widget_control wid_id set_value combobox_select:selected update the date infowid date get_cal_value event handler widget_control winfo_id set_uvalue infowid return end move cyclically the calendar to the value 0 if event out 1 or combobox_number 1 if event out 1 file_comments categories Compound widget param EVENT param CASENAME returns uses restrictions examples history version Id: cw_calendar pro 371 2008 08 07 09:32:02Z pinsard PRO cw_cal_move event casename compile_opt strictarr strictarrsubs possiblecase day month year impossiblecase id widget_info event handler find_by_uname casename widget_control id get_value wvalue we try to move but we are already at the beginning end of the combobox wvalue combobox_index EQ wvalue combobox_number 1 and event out EQ 1 wvalue combobox_index EQ 0 and event out EQ 1 move is not called when out eq 0 whichcase where possiblecase EQ casename 0 if wvalue combobox_index EQ wvalue combobox_number 1 event out EQ 1 THEN BEGIN if widget_info event handler find_by_uname possiblecase whichcase 1 EQ 0 then begin it is impossible to move the next combobox widget_control id get_value widvalue we set to widvalue combobox_number 1 when event out EQ 1 and to 0 when event out EQ 1 selected widvalue combobox_number 1 event out EQ 1 widget_control id set_value combobox_select:selected we call move for the next combobox ENDIF ELSE cw_cal_move event possiblecase whichcase 1 it is possible to move from 1 ENDIF ELSE widget_control id set_value combobox_select:wvalue combobox_index event out set_cal_combobox event possiblecase whichcase 1 return end file_comments categories Compound widget param EVENT returns uses restrictions examples history version Id: cw_calendar pro 371 2008 08 07 09:32:02Z pinsard FUNCTION cw_calendar_event event cm_4cal compile_opt strictarr strictarrsubs winfo_id widget_info event handler find_by_uname infocal widget_control winfo_id get_uvalue infowid key_caltype infowid caltype widget_control event id get_uvalue uval high frequency calendar IF uval name EQ step THEN BEGIN infowid date jul2date event index infowid fakecal ENDIF ELSE BEGIN possiblecase day month year impossiblecase whichcase where possiblecase EQ uval name 0 if event out NE 0 then BEGIN we use the button and we want to go out of the combobox: to index 1 event out 1 or to index combobox_number event out 1 we try to move the combobox just right with name: possiblecase whichcase 1 if widget_info event handler find_by_uname possiblecase whichcase 1 EQ 0 then BEGIN this widget do not exist we set cyclically the current widget to the value 0 if event out 1 or combobox_number 1 if event out 1 widget_control event id get_value widvalue selected widvalue combobox_number 1 event out EQ 1 widget_control event id set_value combobox_select:selected ENDIF ELSE cw_cal_move event possiblecase whichcase 1 ENDIF if we changed month year we need to update the day and month list if uval name NE day then begin event out 0 for name whichcase 1 0 1 do BEGIN if widget_info event handler find_by_uname possiblecase name NE 0 then set_cal_combobox event possiblecase name endfor ENDIF we update the date infowid get_cal_value event handler winfo_id ENDELSE widget_control winfo_id set_uvalue infowid return CW_CALENDAR ID:event handler TOP:event top HANDLER:0L VALUE:infowid date FAKECAL: infowid fakecal end file_comments categories Compound widget param PARENT in required The widget ID of the parent widget param CALENDAR param JDATE0 keyword CALTYPE keyword FAKECAL keyword UVALUE keyword UNAME keyword _EXTRA Used to pass keywords returns uses restrictions examples history version Id: cw_calendar pro 371 2008 08 07 09:32:02Z pinsard todo seb FUNCTION cw_calendar parent calendar jdate0 CALTYPE CALTYPE FAKECAL fakecal UVALUE uvalue UNAME uname _EXTRA ex cm_4cal compile_opt strictarr strictarrsubs if keyword_set caltype then key_caltype caltype months days years found in the calendar caldat calendar monthcal daycal yearcal hourcal mincal seccal hmscal hourcal 24 0d0 mincal 1440 0d0 seccal 86400 0d0 starting date if n_elements jdate0 EQ 0 then jdate0 calendar 0 if where calendar EQ jdate0 0 EQ 1 then jdate0 calendar 0 caldat jdate0 month0 day0 year0 test the type of calendar if n_elements calendar GT 1 then BEGIN each day have the same value if n_elements uniq daycal sort daycal EQ 1 then monthly 1 each month and each day have the same value if keyword_set monthly AND n_elements uniq monthcal sort monthcal EQ 1 then yearly 1 endif if NOT keyword_set uvalue then uvalue dummy: if NOT keyword_set uname then uname base0 widget_base parent ROW EVENT_FUNC cw_calendar_event FUNC_GET_VALUE cw_calendar_get_value PRO_SET_VALUE cw_calendar_set_value UVALUE uvalue UNAME uname space 0 _extra ex if n_elements fakecal eq 0 then fakecal 0 base widget_base base0 space 0 uname infocal uvalue calendar:calendar date:jul2date jdate0 fakecal:fakecal caltype: key_caltype IF keyword_set fakecal THEN BEGIN cmbbid cw_combobox_pm base UVALUE name: step UNAME step value strtrim indgen n_elements calendar 1 widget_control cmbbid set_value combobox_select: where calendar EQ jdate0 0 ENDIF ELSE BEGIN vallen widget_info base string_size m day if NOT keyword_set monthly then begin dayindex where monthcal EQ month0 AND yearcal EQ year0 currentday daycal dayindex currentday strtrim currentday 1 hms hmscal dayindex cmbbid cw_combobox_pm base UVALUE name: day hms:hms UNAME day value currentday widget_control cmbbid set_value combobox_select: where long currentday EQ day0 0 endif month if NOT keyword_set yearly then BEGIN monthindex where yearcal EQ year0 currentmonth long monthcal monthindex we suppress the repeted months monthindexbis uniq currentmonth sort currentmonth monthindex monthindex monthindexbis currentmonth currentmonth monthindexbis xoff 34 2 vallen 0 1 keyword_set monthly cmbbid cw_combobox_pm base UVALUE name: month UNAME month value string format C CMoA 31 currentmonth 1 xoffset xoff widget_control cmbbid set_value combobox_select: where long currentmonth EQ month0 0 endif year yearindex uniq yearcal sort yearcal currentyear strtrim yearcal yearindex 1 xoff 34 2 vallen 0 1 keyword_set monthly 33 3 vallen 0 1 keyword_set yearly cmbbid cw_combobox_pm base UVALUE name: year UNAME year value currentyear xoffset xoff widget_control cmbbid set_value combobox_select: where long currentyear EQ year0 0 ENDELSE return base end"); a[375] = new Array("./ToBeReviewed/WIDGET/COMPOUND_WIDGET/cw_combobox_pm.html", "cw_combobox_pm.pro", "", " file_comments categories Compound widget param ID param VALUE It is the default tick mark value a floating point number returns uses restrictions examples history version Id: cw_combobox_pm pro 327 2007 12 13 16:22:35Z pinsard PRO cw_combobox_pm_set_value id value compile_opt idl2 strictarrsubs ComboboxId widget_info id find_by_uname Combobox if size value type eq 8 then BEGIN this is a structure tagnames tag_names value for tag 0 n_tags value 1 do begin case strtrim strlowcase tagnames tag 2 of dynamic_resize :widget_control ComboboxId dynamic_resize value dynamic_resize for compatibility droplist_select :widget_control ComboboxId set_combobox_select value droplist_select combobox_select :widget_control ComboboxId set_combobox_select value combobox_select value :widget_control ComboboxId set_value value value ELSE:ras report wrong tag name in argument value of cw_combobox_pm_set_value endcase endfor ENDIF ELSE widget_control ComboboxId set_value value return end file_comments categories Compound widget param ID returns uses restrictions examples history version Id: cw_combobox_pm pro 327 2007 12 13 16:22:35Z pinsard FUNCTION cw_combobox_pm_get_value id compile_opt idl2 strictarrsubs ComboboxId widget_info id find_by_uname Combobox widget_control ComboboxId get_value cmbbval cmbbtxt widget_info ComboboxId combobox_gettext cmbbnumb widget_info ComboboxId combobox_number index where cmbbval EQ cmbbtxt 0 return combobox_number:cmbbnumb combobox_gettext:cmbbtxt combobox_index:index combobox_value:cmbbval dynamic_resize:widget_info ComboboxId dynamic_resize end file_comments categories Compound widget param EVENT returns uses restrictions examples history version Id: cw_combobox_pm pro 327 2007 12 13 16:22:35Z pinsard FUNCTION cw_combobox_pm_event event compile_opt idl2 strictarrsubs widget_control event id get_uvalue uval if uval EQ Combobox then return CW_COMBOBOX_PM ID:event handler TOP:event top HANDLER:0L INDEX:event index STR:event str OUT:0 ComboboxId widget_info event handler find_by_uname Combobox widget_control ComboboxId get_value cmbbval cmbbtxt widget_info ComboboxId combobox_gettext cmbbnumb widget_info ComboboxId combobox_number index where cmbbval EQ cmbbtxt 0 out 0 case uval OF plus :BEGIN if index LT cmbbnumb 1 then BEGIN index index 1 widget_control ComboboxId set_combobox_select index ENDIF ELSE out 1 END minus :BEGIN if index GT 0 then BEGIN index index 1 widget_control ComboboxId set_combobox_select index ENDIF ELSE out 1 END endcase return CW_COMBOBOX_PM ID:event handler TOP:event top HANDLER:0L INDEX:index STR:cmbbtxt OUT:out end file_comments Like WIDGET_COMBOBOX but here there are 2 buttons and to move the widget from 1 categories Compound widget param PARENT in required The widget ID of the parent widget keyword COLUMN Buttons will be arranged in the number of columns specified by this keyword keyword ROW Buttons will be arranged in the number of rows specified by this keyword keyword UVALUE The user value to be associated with the widget keyword UNAME The user name to be associated with the widget keyword VALUE keyword _EXTRA Used to pass keywords returns The returned value of this function is the widget ID of the newly created animation widget restrictions Widget Events Returned by Combobox Widgets Pressing the mouse button while the mouse cursor is over an element of a combobox widget causes the widget to change the label on the combobox button and to generate an event The appearance of any previously selected element is restored to normal at the same time The event structure returned by the WIDGET_EVENT function is defined by the following statement: CW_COMBOBOX_PM ID:0L TOP:0L HANDLER:0L INDEX:0L OUT:0 The first three fields are the standard fields found in every widget event INDEX returns the index of the selected item This can be used to index the array of names originally used to set the widget s value OUT:It is an integer which can take 3 values: 1 : If we press when the index is already at the max Comment: In this case the index stay at the max 1: If we press when the index is already at the min Comment: In this case the index stay at the min 0 : In other cases Keywords to WIDGET_CONTROL A number of keywords to the WIDGET_CONTROL procedure affect the behavior of cw_slider_pm widget: GET_VALUE and SET_VALUE 1 GET_VALUE widget_control wid_id get_value resultat Send back in the result variable a structure of 3 elements whose names are inspired by keywords we can pass at widget_control when we use WIDGET_COMBOBOX: COMBOBOX_NUMBER: the number of elements currently contained in the specified combobox widget COMBOBOX_SELECT: the zero based number of the currently selected element i e the currently displayed element in the specified combobox widget DYNAMIC_RESIZE: a True value 1 if the widget specified by Widget_ID is a button combobox or label widget that has had its DYNAMIC_RESIZE attribute set Otherwise False 0 is returned 2 SET_VALUE widget_control wid_id set_value impose Allows to modify the state of the combobox like we can do it for WIDGET_COMBOBOX May impose: a The contents of the list widget string or string array b A structure which can have for elements from 1 to 3 : DYNAMIC_RESIZE:Set this keyword to activate if set to 1 or deactivate if set to 0 dynamic resizing of the specified CW_COMBOBOX_PM widget see the documentation for the DYNAMIC_RESIZE keyword to WIDGET_COMBOBOX procedure for more information about dynamic widget resizing COMBOBOX_SELECT:Set this keyword to return the zero based number of the currently selected element i e the currently displayed element in the specified combobox widget VALUE: The contents of the list widget string or string array examples See the program provided above testwid and the associated procedure testwid_event history Sebastien Masson smasson lodyc jussieu fr 6 9 1999 version Id: cw_combobox_pm pro 327 2007 12 13 16:22:35Z pinsard FUNCTION cw_combobox_pm parent VALUE value UVALUE uvalue UNAME uname ROW row COLUMN column _EXTRA ex compile_opt idl2 strictarrsubs IF N_PARAMS NE 1 THEN ras report Incorrect number of arguments ON_ERROR 2 return to caller checking for row and column keywords row keyword_set row 1 keyword_set column column keyword_set column 1 keyword_set row keyword_set column EQ row if NOT keyword_set uvalue then uvalue if NOT keyword_set uname then uname base widget_base parent space 0 EVENT_FUNC cw_combobox_pm_event FUNC_GET_VALUE cw_combobox_pm_get_value PRO_SET_VALUE cw_combobox_pm_set_value UVALUE uvalue UNAME uname _extra ex vallen widget_info base string_size m vallen 35 vallen 0 1 max strlen value if keyword_set row THEN BEGIN nothing widget_button base value uvalue minus xoffset 0 yoffset 5 xsize 15 ysize 15 nothing widget_combobox base VALUE value UVALUE Combobox UNAME Combobox xoffset 13 yoffset 0 xsize vallen nothing widget_button base value uvalue plus xoffset vallen 11 yoffset 5 xsize 15 ysize 15 ENDIF ELSE BEGIN nothing widget_combobox base VALUE value UVALUE Combobox UNAME Combobox xoffset 0 yoffset 0 xsize vallen nothing widget_button base value uvalue minus xoffset vallen 2 15 yoffset 24 xsize 15 ysize 15 nothing widget_button base value uvalue plus xoffset vallen 2 yoffset 24 xsize 15 ysize 15 ENDELSE widget_control base realize return base end"); a[376] = new Array("./ToBeReviewed/WIDGET/COMPOUND_WIDGET/cw_domain.html", "cw_domain.pro", "", " IDL testwid PRO testwid_event event help event struct Id widget_info event top find_by_uname c est lui widget_control event id get_uvalue uval if n_elements uval EQ 0 then return case uval of done :widget_control event top destroy set :BEGIN widget_control event id get_value value value value 0 nothing execute boxzoom value widget_control Id set_value boxzoom END get :BEGIN widget_control Id get_value value print value END ELSE: endcase return end PRO testwid _extra ex base widget_base COLUMN print base base nothing widget_label base value beginning of the test nothing cw_domain base _extra ex uname c est lui uvalue c est lui print cw_domain ID nothing nothing widget_label base value end of the test nothing widget_text base value 40 100 10 10 uvalue set editable nothing widget_button base value get uvalue get nothing widget_button base value done uvalue done widget_control base REALIZE xmanager testwid base return end file_comments categories Compound widget param ID param VALUE It is the default tick mark value a floating point number returns uses restrictions examples history version Id: cw_domain pro 371 2008 08 07 09:32:02Z pinsard PRO cw_domain_set_value id value compile_opt idl2 strictarrsubs cm_4mesh topid findtopid id widget_control topid get_uvalue top_uvalue make sure that we have the good grid stored in the cm_4mesh common parameters currentfile extractatt top_uvalue currentfile currentgrid extractatt top_uvalue meshparameters currentfile change changegrid currentgrid What is the type of boxzoom currentplot extractatt top_uvalue smallin 2 1 options extractatt top_uvalue options flags extractatt top_uvalue optionsflag flags flags currentplot IF flags where options EQ Longitude x index 0 EQ 0 THEN xtype geographic ELSE xtype index IF flags where options EQ Latitude y index 0 EQ 0 THEN ytype geographic ELSE ytype index How to complete the boxzoom IF xtype EQ geographic then begin lonn1 lon1 lonn2 lon2 xtitle lon ENDIF ELSE BEGIN lonn1 firstxt lonn2 lastxt xtitle x ind ENDELSE IF ytype EQ geographic then begin latt1 lat1 latt2 lat2 ytitle lat ENDIF ELSE BEGIN latt1 firstyt latt2 lastyt ytitle y ind ENDELSE vertf1 floor min gdepw 0 gdept 0 vertf2 ceil max gdepw 0 gdept 0 Case N_Elements Value OF 0:boxzoom lonn1 lonn2 latt1 latt2 vertf1 vertf2 1:BEGIN if value EQ 1 then boxzoom lonn1 lonn2 latt1 latt2 vertf1 vertf2 ELSE boxzoom lonn1 lonn2 latt1 latt2 0 value 0 END 2:boxzoom lonn1 lonn2 latt1 latt2 value 0 value 1 4:boxzoom Value 5:boxzoom Value 0:3 0 Value 4 6:boxzoom Value Else:BEGIN rien report Wrong Definition of Boxzoom END ENDCASE boxzoom 0 floor boxzoom 0 boxzoom 1 ceil boxzoom 1 boxzoom 2 floor boxzoom 2 boxzoom 3 ceil boxzoom 3 if n_elements boxzoom GE 5 then begin boxzoom 4 floor boxzoom 4 boxzoom 5 ceil boxzoom 5 endif widget_control widget_info id find_by_uname lon1 get_uvalue uvalue strict uvalue strict Longitudes Possible min and max if xtype EQ geographic then BEGIN min floor min glamt glamf max max max ceil max ENDIF ELSE BEGIN min 0 max jpi 1 ENDELSE widgets s id lon1id widget_info id find_by_uname lon1 lon2id widget_info id find_by_uname lon2 Do we have to change the type of x axis: longitude index lonbase widget_info id find_by_uname lonbase widget_control lonbase get_uvalue lonbase_uvalue if lonbase_uvalue name NE xtype then BEGIN widget_control lonbase update 0 We break everything widget_control lon1id destroy widget_control lon2id destroy We reconstruct lon1id cw_slider_pm lonbase value min boxzoom 0 boxzoom 0 keyword_set strict boxzoom 1 boxzoom 0 keyword_set strict widget_control lonbase set_uvalue name:xtype widget_control lonbase update 1 ENDIF ELSE BEGIN The new value they will have cursorvalue1 min boxzoom 0 boxzoom 0 strict boxzoom 1 boxzoom 2 boxzoom 2 keyword_set strict boxzoom 3 boxzoom 2 keyword_set strict widget_control latbase set_uvalue name:ytype widget_control latbase update 1 ENDIF ELSE BEGIN cursorvalue1 min boxzoom 2 boxzoom 2 strict boxzoom 3 indice2 1 if indice1 EQ indice2 then BEGIN if where gdep1 GE boxzoom 4 AND gdep2 LE boxzoom 5 0 EQ 1 then begin indice1 0 indice1 dthlv1_uval grid_t EQ 1 indice2 indice1 endif boxzoom 4 gdep1 indice1 boxzoom 5 boxzoom 4 1 endif Now values and indexes are properly defined So we can apply them widget_control dthlv1id set_value combobox_select:indice1 widget_control dthlv2id set_value combobox_select:indice2 control mins and maxs of sliders if indice1 EQ 0 then min1 0 ELSE min1 gdep2 indice1 1 max1 min1 1 gdep1 indice2 widget_control depth1id set_value slider_min:min1 slider_max:max1 value:boxzoom 4 min2 gdep2 indice1 if indice2 EQ jpk 1 then BEGIN max2 max gdept gdepw max2 strtrim string max2 format e8 0 1 max2 float 1 strmid max2 1 float max2 ENDIF ELSE max2 gdep1 indice2 1 widget_control depth2id set_value slider_min:min2 slider_max:max2 value:boxzoom 5 return end file_comments categories Compound widget param ID returns uses restrictions examples history version Id: cw_domain pro 371 2008 08 07 09:32:02Z pinsard FUNCTION cw_domain_get_value id compile_opt idl2 strictarrsubs box fltarr 6 possiblecase lon1 lon2 lat1 lat2 depth1 depth2 for i 0 5 do begin widget_control widget_info id find_by_uname possiblecase i get_value value box i value value ENDFOR return box end file_comments categories Compound widget param EVENT returns uses restrictions examples history version Id: cw_domain pro 371 2008 08 07 09:32:02Z pinsard FUNCTION cw_domain_event event compile_opt idl2 strictarrsubs common help struct event if where tag_names event EQ OUT 0 NE 1 then if event out NE 0 then return 1 widget_control event id get_uvalue uval case uval name of lon1 :widget_control widget_info event handler find_by_uname lon2 set_value slider_min:event value uval strict lon2 :widget_control widget_info event handler find_by_uname lon1 set_value slider_max:event value uval strict lat1 :widget_control widget_info event handler find_by_uname lat2 set_value slider_min:event value uval strict lat2 :widget_control widget_info event handler find_by_uname lat1 set_value slider_max:event value uval strict unzoom :BEGIN id widget_info event handler find_by_uname lon1 widget_control id get_value value widget_control id set_value slider_min:value slider_min_max 0 widget_control id set_value value slider_min_max 0 id widget_info event handler find_by_uname lat1 widget_control id get_value value widget_control id set_value slider_min:value slider_min_max 0 widget_control id set_value value slider_min_max 0 id widget_info event handler find_by_uname lon2 widget_control id get_value value widget_control id set_value slider_max:value slider_min_max 1 widget_control id set_value value slider_min_max 1 id widget_info event handler find_by_uname lat2 widget_control id get_value value widget_control id set_value slider_max:value slider_min_max 1 widget_control id set_value value slider_min_max 1 END dthlv1 :BEGIN ids depth1id widget_info event handler find_by_uname depth1 depth2id widget_info event handler find_by_uname depth2 dthlv2id widget_info event handler find_by_uname dthlv2 Do we have to change dthlv2 widget_control event id get_value dthlv1_value gdep1 fix dthlv1_value combobox_value widget_control dthlv2id get_value dthlv2_value gdep2 fix dthlv2_value combobox_value if dthlv2_value combobox_index LT event index then BEGIN We redefine the dthlv2id s value widget_control dthlv2id set_value combobox_select:event index So we redefine the value and the max of the slider 2 if event index EQ jpk 1 then BEGIN max max gdept gdepw max strtrim string max format e8 0 1 max float 1 strmid max 1 float max ENDIF ELSE max gdep2 event index 1 1 widget_control depth2id set_value slider_max:max value:gdep2 event index So we redefine the max of the slider 1 widget_control depth1id set_value slider_max:gdep1 event index END We redefine the value and the min of the slider depth1 if event index EQ 0 then min 0 ELSE min gdep1 event index 1 1 widget_control depth1id set_value slider_min:min value:gdep1 event index S we change the value of the min of the slider depth 2 widget_control depth2id set_value slider_min:gdep1 event index 1 END dthlv2 :BEGIN ids depth1id widget_info event handler find_by_uname depth1 depth2id widget_info event handler find_by_uname depth2 dthlv1id widget_info event handler find_by_uname dthlv1 Do we have to change dthlv1 widget_control dthlv1id get_value dthlv1_value gdep1 fix dthlv1_value combobox_value widget_control event id get_value dthlv2_value gdep2 fix dthlv2_value combobox_value if dthlv1_value combobox_index GT event index then BEGIN We redfine the value of dthlv1id widget_control dthlv1id set_value combobox_select:event index So we redefine the value and the min of the slider 1 if event index EQ 0 then min 0 ELSE min gdep2 event index 1 widget_control depth1id set_value slider_min:min value:gdep1 event index Se we redefine the min of the slider 2 widget_control depth2id set_value slider_min:gdep2 event index END We redefine the value and the max of the slider depth 2 if event index EQ jpk 1 then BEGIN max max gdept gdepw max strtrim string max format e8 0 1 max float 1 strmid max 1 float max ENDIF ELSE max gdep2 event index 1 1 widget_control depth2id set_value slider_max:max value:gdep2 event index So we change the value of the max of the slider depth 1 widget_control depth1id set_value slider_max:gdep2 event index 1 END depth1 :BEGIN ids depth2id widget_info event handler find_by_uname depth2 dthlv1id widget_info event handler find_by_uname dthlv1 Do we have to change dthlv1 widget_control dthlv1id get_value dthlv1_value gdep1 fix dthlv1_value combobox_value rien where gdep1 LT event value indice indice indice indice 1 if indice NE dthlv2_value combobox_index then begin We change the min of depth1 widget_control depth1id set_value slider_max:gdep2 indice 1 We redefine the value of dthlv2id widget_control dthlv2id set_value combobox_select:indice So we redefine the min of the slider 2 if indice EQ jpk 1 then BEGIN max max gdept gdepw max strtrim string max format e8 0 1 max float 1 strmid max 1 float max ENDIF ELSE max gdep2 indice 1 1 widget_control event id set_value slider_max:max endif END ELSE: ENDCASE slidesliceid widget_info event top find_by_uname slide_slice if slidesliceid NE 0 then widget_control slidesliceid set_value 1 return ID:event handler TOP:event top HANDLER:0L BOX:cw_domain_get_value event handler end file_comments categories Compound widget param PARENT in required The widget ID of the parent widget keyword UVALUE The user value to be associated with the widget keyword UNAME The user name to be associated with the widget keyword STRICT keyword UNZOOM keyword BOXZOOM Vector indicating the geographic zone on which we want to cut the map If BOXZOOM has : 1 element : The extraction is made on lon1 lon2 lat1 lat2 0 boxzoom 0 2 elements: The extraction is made on lon1 lon2 lat1 lat2 boxzoom 0 boxzoom 1 4 elements: The extraction is made on Boxzoom 0 max gdept gdepw 5 elements: The extraction is made on Boxzoom 0:3 0 Boxzoom 4 6 elements: The extraction is made on Boxzoom Where lon1 lon2 lat1 lat2 are global variables defined at the last domdef keyword _EXTRA Used to pass keywords returns uses restrictions examples history version Id: cw_domain pro 371 2008 08 07 09:32:02Z pinsard todo seb: Documenter FUNCTION cw_domain parent BOXZOOM boxzoom STRICT strict UVALUE uvalue UNAME uname UNZOOM unzoom _EXTRA ex compile_opt idl2 strictarrsubs cm_4mesh cm_4data Definition of the boxzoom Case N_Elements Boxzoom OF 0:boxzoom lon1 lon2 lat1 lat2 min gdepw 0 gdept 0 max gdepw 0 gdept 0 1:boxzoom lon1 lon2 lat1 lat2 0 boxzoom 0 2:boxzoom lon1 lon2 lat1 lat2 boxzoom 0 boxzoom 1 4:boxzoom Boxzoom vert1 vert2 5:boxzoom Boxzoom 0:3 0 Boxzoom 4 6: Else: return report Mauvaise Definition de Boxzoom ENDCASE IF total Boxzoom EQ 0 THEN boxzoom lon1 lon2 lat1 lat2 min gdepw 0 gdept 0 max gdepw 0 gdept 0 boxzoom 0 floor boxzoom 0 boxzoom 1 ceil boxzoom 1 boxzoom 2 floor boxzoom 2 boxzoom 3 ceil boxzoom 3 boxzoom 4 floor boxzoom 4 boxzoom 5 ceil boxzoom 5 if NOT keyword_set uvalue then uvalue if NOT keyword_set uname then uname base widget_base parent row 2 space 0 EVENT_FUNC cw_domain_event FUNC_GET_VALUE cw_domain_get_value PRO_SET_VALUE cw_domain_set_value UVALUE uvalue UNAME uname _extra ex baseh widget_base base column 1 keyword_set unzoom space 0 baseh1 widget_base baseh row 2 space 0 longitude min floor min glamt glamf max max max ceil max IF max min GT 360 AND keyword_set key_periodic THEN max min 360 lonbase widget_base baseh1 column 2 space 0 uname lonbase uvalue name: geographic lon1id cw_slider_pm lonbase value min boxzoom 0 boxzoom 0 keyword_set strict boxzoom 1 boxzoom 0 keyword_set strict latitude min floor min gphit gphif max max max ceil max latbase widget_base baseh1 column 2 space 0 uname latbase uvalue name: geographic lat1id cw_slider_pm latbase value min boxzoom 2 boxzoom 2 keyword_set strict boxzoom 3 boxzoom 2 keyword_set strict unzoom if keyword_set unzoom then rien widget_button baseh value unzoom uvalue name: unzoom xsize 60 ysize 110 depth basez widget_base base column 3 space 0 base_align_center basezdrp widget_base basez row 2 space 0 if strupcase vargrid EQ W then gdep gdepw ELSE gdep gdept gdep1 floor gdep gdep2 ceil gdep same where gdep2 gdep1 EQ 0 if same 0 NE 1 then gdep2 same gdep2 same 1 sgdep1 strtrim gdep1 1 sgdep2 strtrim gdep2 1 dephtid cw_combobox_pm basezdrp value sgdep1 uvalue name: dthlv1 grid_t:strupcase vargrid NE W uname dthlv1 rien where gdep1 LT boxzoom 4 indice1 indice1 indice1 indice2 1 widget_control dephtid set_value combobox_select:indice2 basedepthslid widget_base base column 2 space 0 strminlen max strlen strtrim round gdept gdepw 1 if indice1 EQ 0 then min1 0 ELSE min1 gdep2 indice1 1 max1 min1 1 gdep1 indice2 rien cw_slider_pm basez value min1 boxzoom 4 boxzoom 4 boxzoom 5 max2 uvalue name: depth2 minimum min2 maximum max2 uname depth2 title z2 strminlen strminlen return base end"); a[377] = new Array("./ToBeReviewed/WIDGET/COMPOUND_WIDGET/cw_droplist_pm.html", "cw_droplist_pm.pro", "", " file_comments categories Compound widget param ID param VALUE It is the default tick mark value a floating point number returns uses restrictions examples history version Id: cw_droplist_pm pro 327 2007 12 13 16:22:35Z pinsard PRO cw_droplist_pm_set_value id value compile_opt idl2 strictarrsubs DroplistId widget_info id find_by_uname Droplist if size value type eq 8 then BEGIN this is a structure tagnames tag_names value for tag 0 n_tags value 1 do begin case strtrim strlowcase tagnames tag 2 of dynamic_resize :widget_control DroplistId dynamic_resize value dynamic_resize droplist_select :widget_control DroplistId set_droplist_select value droplist_select value :widget_control DroplistId set_value value value ELSE:ras report mauvais nom de l argument de la structure ds cw_droplist_pm_set_value endcase endfor ENDIF ELSE widget_control DroplistId set_value value return end file_comments Compound widget categories Compound widget param ID returns uses restrictions examples history version Id: cw_droplist_pm pro 327 2007 12 13 16:22:35Z pinsard FUNCTION cw_droplist_pm_get_value id compile_opt idl2 strictarrsubs DroplistId widget_info id find_by_uname Droplist return droplist_number:widget_info DroplistId droplist_number droplist_select:widget_info DroplistId droplist_select dynamic_resize:widget_info DroplistId dynamic_resize end file_comments Compound widget categories Compound widget param EVENT returns uses restrictions examples history version Id: cw_droplist_pm pro 327 2007 12 13 16:22:35Z pinsard FUNCTION cw_droplist_pm_event event compile_opt idl2 strictarrsubs widget_control event id get_uvalue uval if uval EQ Droplist then return CW_DROPLIST_PM ID:event handler TOP:event top HANDLER:0L INDEX:event index OUT:0 DroplistId widget_info event handler find_by_uname Droplist index widget_info DroplistId droplist_select case uval OF plus :BEGIN indexmax widget_info DroplistId droplist_number 1 if index NE indexmax then widget_control DroplistId set_droplist_select index 1 return CW_DROPLIST_PM ID:event handler TOP:event top HANDLER:0L INDEX: index 1 index 1 OUT: long index EQ 0 END endcase end file_comments Like WIDGET_DROPLIST but here there are 2 buttons and to move the widget from 1 categories Compound widget param PARENT in required The widget ID of the parent widget keyword COLUMN Buttons will be arranged in the number of columns specified by this keyword keyword ROW Buttons will be arranged in the number of rows specified by this keyword keyword UVALUE The user value to be associated with the widget keyword UNAME The user name to be associated with the widget keyword _EXTRA Used to pass keywords returns The returned value of this function is the widget ID of the newly created animation widget restrictions Widget Events Returned by Droplist Widgets Pressing the mouse button while the mouse cursor is over an element of a droplist widget causes the widget to change the label on the droplist button and to generate an event The appearance of any previously selected element is restored to normal at the same time The event structure returned by the WIDGET_EVENT function is defined by the following statement: CW_DROPLIST_PM ID:0L TOP:0L HANDLER:0L INDEX:0L OUT:0 The first three fields are the standard fields found in every widget event INDEX returns the index of the selected item This can be used to index the array of names originally used to set the widget s value OUT:It is an integer which can take 3 values: 1 : If we press when the index is already at the max Comment: In this case the index stay at the max 1: If we press when the index is already at the min Comment: In this case the index stay at the min 0 : In other cases Keywords to WIDGET_CONTROL A number of keywords to the WIDGET_CONTROL procedure affect the behavior of cw_slider_pm widget: GET_VALUE and SET_VALUE 1 GET_VALUE widget_control wid_id get_value resultat Send back in the result variable a structure of 3 elements whose names are inspired by keywords we can pass at widget_control when we use WIDGET_COMBOBOX: DROPLIST_NUMBER: the number of elements currently contained in the specified droplist widget DROPLIST_SELECT: the zero based number of the currently selected element i e the currently displayed element in the specified droplist widget DYNAMIC_RESIZE: a True value 1 if the widget specified by Widget_ID is a button droplist or label widget that has had its DYNAMIC_RESIZE attribute set Otherwise False 0 is returned 2 SET_VALUE widget_control wid_id set_value impose permet de modifier l etat de la droplist comme on peut le faire pour WIDGET_DROPLIST Impose peut etre: a The contents of the list widget string or string array b A structure which can have for elements from 1 to 3 : DYNAMIC_RESIZE:Set this keyword to activate if set to 1 or deactivate if set to 0 dynamic resizing of the specified CW_DROPLIST_PM widget see the documentation for the DYNAMIC_RESIZE keyword to WIDGET_DROPLIST procedure for more information about dynamic widget resizing DROPLIST_SELECT:Set this keyword to return the zero based number of the currently selected element i e the currently displayed element in the specified droplist widget VALUE: The contents of the list widget string or string array examples See the program provided above testwid and the associated procedure testwid_event history Sebastien Masson smasson lodyc jussieu fr 6 9 1999 version Id: cw_droplist_pm pro 327 2007 12 13 16:22:35Z pinsard FUNCTION cw_droplist_pm parent UVALUE uvalue UNAME uname ROW row COLUMN column _EXTRA ex compile_opt idl2 strictarrsubs IF N_PARAMS NE 1 THEN ras report Incorrect number of arguments ON_ERROR 2 return to caller checking for row and column keywords row keyword_set row 1 keyword_set column column keyword_set column 1 keyword_set row keyword_set column EQ row if NOT keyword_set uvalue then uvalue if NOT keyword_set uname then uname base widget_base parent space 1 xpad 1 ypad 1 ROW row COLUMN column EVENT_FUNC cw_droplist_pm_event FUNC_GET_VALUE cw_droplist_pm_get_value PRO_SET_VALUE cw_droplist_pm_set_value UVALUE uvalue UNAME uname _extra ex if keyword_set row THEN nothing widget_button base value uvalue minus nothing widget_droplist base UVALUE Droplist UNAME Droplist _extra ex if keyword_set column then begin base1 widget_base base row align_center space 1 xpad 1 ypad 1 nothing widget_button base1 value uvalue minus xsize 20 ysize 20 nothing widget_button base1 value uvalue plus xsize 20 ysize 20 ENDIF ELSE nothing widget_button base value uvalue plus widget_control base realize return base end"); a[378] = new Array("./ToBeReviewed/WIDGET/COMPOUND_WIDGET/cw_pagelayout.html", "cw_pagelayout.pro", "", " file_comments categories Compound widget param EVENT returns uses restrictions examples history version Id: cw_pagelayout pro 327 2007 12 13 16:22:35Z pinsard FUNCTION cw_pagelayout_event event compile_opt idl2 strictarrsubs widget_control event id get_uvalue uval widget_control event top get_uvalue top_uvalue smallin extractatt top_uvalue smallin numdessinin smallin 2 1 smallout extractatt top_uvalue smallout if uval name EQ undo then begin return ID:event handler TOP:event top HANDLER:0L ENDIF ELSE BEGIN common If we do not change the number of columns we send if uval name EQ column then if event index 1 EQ smallin 0 THEN return ID:event handler TOP:event top HANDLER:0L If we do not change the number of lines we send if uval name EQ row then if event index 1 EQ smallin 1 THEN return ID:event handler TOP:event top HANDLER:0L We erase the page graphid widget_info event top find_by_uname graph graphid extractatt top_uvalue graphid widget_control graphid get_value win wset win erase 255 case uval name of clear : column :BEGIN smallin event index 1 smallin 1 1 smallout event index 1 smallout 1 1 END row :BEGIN smallin smallin 0 event index 1 1 smallout smallout 0 event index 1 1 END endcase nbredessin smallin 0 smallin 1 We put all back to 0 for postscripts createhistory event top smallin options extractatt top_uvalue options flags extractatt top_uvalue optionsflag flag flags numdessinin update and reset all values of the top_uvalue top_uvalue 1 findline top_uvalue smallin smallin top_uvalue 1 findline top_uvalue smallout smallout top_uvalue 1 findline top_uvalue penvs replicate p nbredessin top_uvalue 1 findline top_uvalue xenvs replicate x nbredessin top_uvalue 1 findline top_uvalue yenvs replicate y nbredessin top_uvalue 1 findline top_uvalue nameprocedures strarr nbredessin top_uvalue 1 findline top_uvalue types strarr nbredessin top_uvalue 1 findline top_uvalue varinfo strarr 2 nbredessin top_uvalue 1 findline top_uvalue domaines fltarr 6 nbredessin top_uvalue 1 findline top_uvalue dates lonarr 2 nbredessin top_uvalue 1 findline top_uvalue txtcmd strarr nbredessin top_uvalue 1 findline top_uvalue optionsflag flag replicate 1 nbredessin ptr_free extractatt top_uvalue exextra top_uvalue 1 findline top_uvalue exextra ptrarr nbredessin allocate_heap top_uvalue 1 findline top_uvalue ENDELSE return ID:event handler TOP:event top HANDLER:0L end file_comments categories Compound widget param PARENT in required The widget ID of the parent widget param SMALL keyword COLUMN Buttons will be arranged in the number of columns specified by this keyword keyword ROW Buttons will be arranged in the number of rows specified by this keyword keyword UVALUE The user value to be associated with the widget keyword UNAME The user name to be associated with the widget keyword _EXTRA Used to pass keywords keyword UNZOOM returns uses restrictions examples history version Id: cw_pagelayout pro 327 2007 12 13 16:22:35Z pinsard todo seb: documenter FUNCTION cw_pagelayout parent small UVALUE uvalue UNAME uname UNZOOM unzoom COLUMN column ROW row _EXTRA ex compile_opt idl2 strictarrsubs row keyword_set row 1 keyword_set column if NOT keyword_set uvalue then uvalue if NOT keyword_set uname then uname base widget_base parent EVENT_FUNC cw_pagelayout_event FUNC_GET_VALUE cw_pagelayout_get_value PRO_SET_VALUE cw_pagelayout_set_value UVALUE uvalue UNAME uname space 0 _extra ex IF n_elements small eq 0 then small 1 1 1 dummy widget_label base value cln yoffset 3 id widget_combobox base value strtrim indgen 9 1 1 uvalue name: column uname column xoffset 20 xsize 40 widget_control id set_combobox_select small 0 1 IF keyword_set row THEN BEGIN xoff 60 yoff 0 ENDIF ELSE BEGIN xoff 0 yoff 20 ENDELSE dummy widget_label base value row xoffset xoff yoffset yoff 3 id widget_combobox base value strtrim indgen 9 1 1 uvalue name: row uname row xoffset xoff 20 xsize 40 yoffset yoff widget_control id set_combobox_select small 1 1 return base end"); a[379] = new Array("./ToBeReviewed/WIDGET/COMPOUND_WIDGET/cw_slide_slice.html", "cw_slide_slice.pro", "", " file_comments categories Compound widget param ID param VALUE It is the default tick mark value a floating point number returns uses restrictions examples history version Id: cw_slide_slice pro 327 2007 12 13 16:22:35Z pinsard PRO cw_slide_slice_set_value id value compile_opt idl2 strictarrsubs common topid findtopid id domainid widget_info topid find_by_uname domain widget_control domainid get_value boxzoom if boxzoom 1 boxzoom 0 LT boxzoom 3 boxzoom 2 then type y ELSE type x thickid widget_info topid find_by_uname thickness widget_control thickid get_uvalue thicknessuval widget_control thickid get_value thickness thickness thicknessuval choix thickness droplist_select sliderid widget_info topid find_by_uname slider if type EQ y then BEGIN mini floor min glamt glamf max maxi maxi ceil maxi thickness widget_control sliderid set_value slider_min:mini slider_max:maxi value:boxzoom 0 domdef keyword COLUMN Buttons will be arranged in the number of columns specified by this keyword keyword FRAME Specifies the width of the frame to be drawn around the base keyword ROW Buttons will be arranged in the number of rows specified by this keyword keyword UVALUE The user value to be associated with the widget keyword UNAME The user name to be associated with the widget keyword _EXTRA Used to pass keywords returns uses restrictions examples history version Id: cw_slide_slice pro 327 2007 12 13 16:22:35Z pinsard todo seb: documenter FUNCTION cw_slide_slice parent BOXZOOM boxzoom UVALUE uvalue UNAME uname FRAME frame ROW row COLUMN column _EXTRA ex compile_opt idl2 strictarrsubs common checking exclusive keywords column keyword_set column 1 keyword_set row row keyword_set row 1 keyword_set column keyword_set row EQ column if NOT keyword_set uvalue then uvalue if NOT keyword_set uname then uname base widget_base parent ROW row COLUMN column EVENT_FUNC cw_slide_slice_event FUNC_GET_VALUE cw_slide_slice_get_value PRO_SET_VALUE cw_slide_slice_set_value ROW row COLUMN column UVALUE uvalue UNAME uname FRAME frame _extra ex if NOT keyword_set boxzoom then boxzoom lon1 lon2 lat1 lat2 rien cw_bgroup base degre points exclusive column uname unite uvalue name: unite return_name set_value 0 no_release thicknessval indgen 21 1 thicknessval string thicknessval for i 0 n_elements thicknessval 1 do thicknessval i strtrim thicknessval i 1 droplistid cw_droplist_pm base value thicknessval uname thickness uvalue name: thickness choix:thicknessval if boxzoom 1 boxzoom 0 LT boxzoom 3 boxzoom 2 then type y ELSE type x if type EQ y then BEGIN mini floor min glamt glamf max maxi thickness boxzoom 1 boxzoom 0 maxi ceil maxi thickness rien cw_slider_pm base minimum mini maximum mini 1 maxi value mini boxzoom 0 maxi value mini boxzoom 2 maxi column uname slider uvalue name: slider ENDELSE index where thicknessval EQ thickness index index 0 if index EQ 1 then BEGIN index 20 thicknessval 20 strtrim thickness 1 widget_control droplistid set_value thicknessval widget_control droplistid set_uvalue name: thickness choix:thicknessval endif widget_control droplistid set_value droplist_select:index if type EQ xt then begin mini floor min glamt glamf max maxi maxi ceil maxi ENDIF ELSE BEGIN mini floor min gphit gphif max maxi maxi ceil maxi ENDELSE return base end"); a[380] = new Array("./ToBeReviewed/WIDGET/COMPOUND_WIDGET/cw_slider_pm.html", "cw_slider_pm.pro", "", " file_comments categories Compound widget param VALUE It is the default tick mark value a floating point number returns uses restrictions examples history version Id: cw_slider_pm pro 327 2007 12 13 16:22:35Z pinsard FUNCTION decvalue value compile_opt idl2 strictarrsubs a float value 0 return strtrim string floor a 0 1 indgen 10 format f15 1 2 end file_comments categories Compound widget param VALUE It is the default tick mark value a floating point number returns uses restrictions examples history version Id: cw_slider_pm pro 327 2007 12 13 16:22:35Z pinsard FUNCTION decind value compile_opt idl2 strictarrsubs a float value 0 return round 10 a floor a computation accuracy end file_comments categories Compound widget param ID param VALUE It is the default tick mark value a floating point number returns uses restrictions examples history version Id: cw_slider_pm pro 327 2007 12 13 16:22:35Z pinsard PRO cw_slider_pm_set_value id value compile_opt idl2 strictarrsubs sbid widget_info id find_by_uname SliderBar dcid widget_info id find_by_uname decimal minmax widget_info sbid SLIDER_MIN_MAX if size value type eq 8 then BEGIN this is a structure tagnames tag_names value for tag 0 n_tags value 1 do begin case strtrim strlowcase tagnames tag 2 of slider_min :BEGIN IF float value slider_min 0 LT minmax 1 THEN BEGIN minmax 0 value slider_min 0 widget_control sbid set_slider_min floor float value slider_min 0 valuedc float widget_info dcid combobox_gettext IF valuedc LT value slider_min THEN BEGIN widget_control sbid set_value floor float value slider_min 0 widget_control dcid set_value decvalue value slider_min widget_control dcid set_combobox_select decind value slider_min ENDIF ENDIF end slider_max :BEGIN IF float value slider_max 0 GT minmax 0 THEN BEGIN minmax 1 value slider_max 0 widget_control sbid set_slider_max ceil float value slider_max 0 valuedc float widget_info dcid combobox_gettext IF valuedc GT value slider_max THEN BEGIN widget_control sbid set_value ceil float value slider_max 0 widget_control dcid set_value decvalue value slider_max widget_control dcid set_combobox_select decind value slider_max ENDIF ENDIF end value :IF float value value 0 GE minmax 0 AND float value value 0 LE minmax 1 THEN value2 float value value 0 ELSE:ras report wrong tag name in argument value of cw_slider_pm_set_value endcase endfor ENDIF ELSE BEGIN IF float value 0 GE minmax 0 AND float value 0 LE minmax 1 THEN value2 float value 0 ENDELSE IF n_elements value2 NE 0 THEN BEGIN widget_control sbid set_value fix value2 widget_control dcid set_value decvalue value2 widget_control dcid set_combobox_select decind value2 ENDIF return end file_comments categories Compound widget param ID returns uses restrictions examples history version Id: cw_slider_pm pro 327 2007 12 13 16:22:35Z pinsard FUNCTION cw_slider_pm_get_value id compile_opt idl2 strictarrsubs sbid widget_info id find_by_uname SliderBar dcid widget_info id find_by_uname decimal minmax widget_info sbid SLIDER_MIN_MAX value float widget_info dcid combobox_gettext return value:value slider_min_max:minmax end file_comments categories Compound widget param EVENT returns uses restrictions examples history version Id: cw_slider_pm pro 327 2007 12 13 16:22:35Z pinsard FUNCTION cw_slider_pm_event event compile_opt idl2 strictarrsubs widget_control event id get_uvalue uval sbid widget_info event handler find_by_uname SliderBar dcid widget_info event handler find_by_uname decimal minmax widget_info sbid SLIDER_MIN_MAX IF uval EQ decimal THEN value float event str ELSE value float widget_info dcid combobox_gettext out 0 defaut case case uval OF plus : if value 1 LE minmax 1 then value2 value 1 ELSE out 1 minus :if value 1 GE minmax 0 then value2 value 1 ELSE out 1 SliderBar :if event value value floor value LE minmax 1 THEN value2 event value value floor value decimal :BEGIN CASE 1 OF value GT minmax 1 : value2 minmax 1 value LT minmax 0 : value2 minmax 0 ELSE: ENDCASE END ELSE: ENDCASE IF n_elements value2 NE 0 THEN BEGIN value value2 widget_control sbid set_value floor value widget_control dcid set_value decvalue value widget_control dcid set_combobox_select decind value ENDIF return CW_SLIDER_PM ID:event handler TOP:event top HANDLER:0L VALUE:value OUT:OUT end file_comments Like WIDGET_SLIDER but here there are 2 buttons and to move the widget from 1 categories Compound widget param PARENT in required The widget ID of the parent widget keyword UVALUE The user value to be associated with the widget keyword UNAME The user name to be associated with the widget keyword VALUE keyword MAXIMUM keyword MINIMUM keyword STRMINLEN keyword _EXTRA Used to pass keywords returns The returned value of this function is the widget ID of the newly created animation widget restrictions Widget Events Returned by the CW_SLIDER_PM Widget Slider widgets generate events when the mouse is used to change their value The event structure returned by the WIDGET_EVENT function is defined by the following statement: CW_SLIDER_PM ID:0L TOP:0L HANDLER:0L VALUE:0L DRAG:0 OUT:0 ID is the widget ID of the button generating the event TOP is the widget ID of the top level widget containing ID HANDLER contains the widget ID of the widget associated with the handler routine VALUE returns the new value of the slider DRAG returns integer 1 if the slider event was generated as part of a drag operation or zero if the event was generated when the user had finished positioning the slider Note that the slider widget only generates events during the drag operation if the DRAG keyword is set and if the application is running under Motif When the DRAG keyword is set the DRAG field can be used to avoid computationally expensive operations until the user releases the slider OUT:It is an integer which can take 3 values: 1 : If we press when the index is already at the max Comment: In this case the index stay at the max 1: If we press when the index is already at the min Comment: In this case the index stay at the min 0 : In other cases Keywords to WIDGET_CONTROL A number of keywords to the WIDGET_CONTROL procedure affect the behavior of cw_slider_pm widget: GET_VALUE and SET_VALUE 1 GET_VALUE widget_control wid_id get_value resultat Send back in the result variable a structure of 2 elements whose name are inspired from keywords we can pass at widget_control when we use WIDGET_SLIDER: VALUE:the value setting of the widget SLIDER_MIN_MAX: a 2 elements array: The minimum and the maximum value of the range encompassed by the slider 2 SET_VALUE widget_control wid_id set_value impose Allows to modify the state of the combobox like we can do it for WIDGET_COMBOBOX May impose: a a integer: give the new position of the slider b A structure which can have for elements from 1 to 3 : VALUE: an integer which give the new position of the slider SLIDER_MIN:Set to a new minimum value for the specified slider widget SLIDER_MAX:Set to a new minimum value for the specified slider widget examples See the program provided above testwid and the associated procedure testwid_event history Sebastien Masson smasson lodyc jussieu fr 5 9 1999 version Id: cw_slider_pm pro 327 2007 12 13 16:22:35Z pinsard todo seb: documenter FUNCTION cw_slider_pm parent MAXIMUM maximum MINIMUM minimum STRMINLEN strminlen VALUE value UVALUE uvalue UNAME uname TITLE title _EXTRA ex compile_opt idl2 strictarrsubs IF N_PARAMS NE 1 THEN ras report Incorrect number of arguments ON_ERROR 2 return to caller if n_elements minimum NE 0 then minimum floor minimum ELSE minimum 0 if n_elements maximum NE 0 then maximum ceil maximum ELSE maximum 100 if NOT keyword_set title then title checking exclusive keywords column keyword_set column 1 keyword_set row keyword_set vertical xsize lenstr max strlen strtrim minimum maximum 1 if keyword_set strminlen then lenstr strminlen lenstr xsize 35 mlen lenstr 1 3 lenstr lt 4 xsize 35 mlen lenstr 2 dummyid widget_combobox base value decvalue minimum UVALUE decimal UNAME decimal xoffset xoff yoffset 2 xsize xsize dummyid widget_slider base MAXIMUM maximum MINIMUM minimum UVALUE SliderBar UNAME SliderBar suppress_value drag yoffset 30 xsize xoff xsize if keyword_set value then cw_slider_pm_set_value base value return base end"); a[381] = new Array("./ToBeReviewed/WIDGET/COMPOUND_WIDGET/cw_specifie.html", "cw_specifie.pro", "", " file_comments categories Compound widget param ID param VALUE It is the default tick mark value a floating point number returns uses restrictions examples history version Id: cw_specifie pro 327 2007 12 13 16:22:35Z pinsard PRO cw_specifie_set_value id value compile_opt idl2 strictarrsubs cm_general if size value type NE 8 then return widget_control widget_info id find_by_uname min set_value strtrim value min 2 widget_control widget_info id find_by_uname max set_value strtrim value max 2 widget_control widget_info id find_by_uname int set_value strtrim value inter 2 widget_control widget_info id find_by_uname palnum set_value strtrim value lct 2 autres extractstru value min max inter lct nothing xindex yindex if size autres type EQ 8 then BEGIN autresid widget_info id find_by_uname autres widget_control widget_info id find_by_uname autres get_value autresautres autresautres autresautres 0 if strtrim autresautres 2 NE then begin autresautres createfunc get_extra autresautres filename myuniquetmpdir for_createfunc pro autres mixstru autres autresautres endif autres strkeywd autres widget_control widget_info id find_by_uname autres set_value autres endif return end file_comments categories Compound widget param ID returns uses restrictions examples history version Id: cw_specifie pro 327 2007 12 13 16:22:35Z pinsard FUNCTION cw_specifie_get_value id compile_opt idl2 strictarrsubs cm_general widget_control widget_info id find_by_uname min get_value min min float min 0 widget_control widget_info id find_by_uname max get_value max max float max 0 widget_control widget_info id find_by_uname int get_value int int float int 0 widget_control widget_info id find_by_uname palnum get_value palnum palnum long palnum 0 widget_control widget_info id find_by_uname autres get_value autres autres autres 0 exextra min:min max:max inter:int lct:palnum if strtrim autres 2 NE then exextra createfunc get_extra autres _extra exextra kwdlist exextra exextra exextra exextra filename myuniquetmpdir for_createfunc pro return exextra end file_comments categories Compound widget param EVENT returns uses restrictions examples history version Id: cw_specifie pro 327 2007 12 13 16:22:35Z pinsard FUNCTION cw_specifie_event event compile_opt idl2 strictarrsubs on recupere les ID des differents widgets widget_control event id get_uvalue uval widget_control event top get_uvalue top_uvalue smallin extractatt top_uvalue smallin numdessinin smallin 2 1 smallout extractatt top_uvalue smallout numdessinout smallout 2 1 case uval of default :BEGIN We find the name of the variable: vlstid widget_info event top find_by_uname varlist fieldname widget_info vlstid combobox_gettext exextra definedefaultextra fieldname widget_control widget_info event handler find_by_uname min set_value strtrim exextra min 1 widget_control widget_info event handler find_by_uname max set_value strtrim exextra max 1 widget_control widget_info event handler find_by_uname int set_value strtrim exextra inter 1 widget_control widget_info event handler find_by_uname palnum set_value strtrim exextra lct 1 widget_control widget_info event handler find_by_uname autres set_value END palcol :BEGIN ind fix strmid event value 0 strpos event value widget_control widget_info event handler find_by_uname palnum set_value strtrim ind 1 END ELSE: endcase return ID:event handler TOP:event top HANDLER:0L OK:uval EQ ok end file_comments categories Compound widget param PARENT in required The widget ID of the parent widget keyword COLUMN Buttons will be arranged in the number of columns specified by this keyword keyword ROW Buttons will be arranged in the number of rows specified by this keyword keyword UVALUE The user value to be associated with the widget keyword UNAME The user name to be associated with the widget keyword FRAME keyword FORXXX keyword _EXTRA Used to pass keywords returns uses restrictions examples history version Id: cw_specifie pro 327 2007 12 13 16:22:35Z pinsard todo seb: documenter FUNCTION cw_specifie parent ROW row COLUMN column UVALUE uvalue UNAME uname FRAME frame FORXXX forxxx _EXTRA ex compile_opt idl2 strictarrsubs checking exclusive keywords column keyword_set column 1 keyword_set row row keyword_set row 1 keyword_set column keyword_set row EQ column if NOT keyword_set uvalue then uvalue if NOT keyword_set uname then uname base widget_base parent space 0 frame EVENT_FUNC cw_specifie_event FUNC_GET_VALUE cw_specifie_get_value PRO_SET_VALUE cw_specifie_set_value UVALUE uvalue UNAME uname _extra ex base1 base1 widget_base base rien widget_label base1 value Min xoffset 85 yoffset 15 rien widget_label base1 value Max xoffset 145 yoffset 15 rien widget_label base1 value Int xoffset 210 yoffset 15 lct get_name nomcouleur nbrligne 30 nbrlist n_elements nomcouleur nbrligne nomcouleur strtrim sindgen n_elements nomcouleur 1 nomcouleur nomcouleur 0 nomcouleur nomcouleur 1 Color nomcouleur if nbrlist GT 1 then for i 1 nbrlist do nomcouleur nomcouleur 0:nbrligne i 1 i 1 nomcouleur nbrligne i i:n_elements nomcouleur 1 rien cw_pdmenu base1 nomcouleur RETURN_NAME uvalue palcol uname palcol xoffset 250 yoffset 0 base2 base2 widget_base base column 4 keyword_set forxxx yoffset 30 if keyword_set forxxx then rien widget_button base2 value Default uvalue default frame tooltip see find definedefaultextra 0 rien widget_text base2 value editable xsize 7 uname min uvalue min rien widget_text base2 value editable xsize 7 uname max uvalue max rien widget_text base2 value editable xsize 7 uname int uvalue int if keyword_set forxxx then colvalue ELSE colvalue 39 rien widget_text base2 value colvalue editable xsize 2 uname palnum uvalue palnum widget text containing other keywords pass into top_uvalue exextra Does it remain some If yes we have to put them as string rien widget_text base value editable uname autres uvalue autres xsize 54 ysize 3 yoffset 65 wrap no_newline if keyword_set forxxx then cw_specifie_set_value base definedefaultextra rien_du_tout return base end "); a[382] = new Array("./ToBeReviewed/WIDGET/findtopid.html", "findtopid.pro", "", " file_comments Find from an Id of widget the Id of the widget which is the top level base i e it has no parent categories widget param WIDGET_ID This argument should be the widget ID of the widget for which information is desired returns The Id of the widget which is the top level base history Sebastien Masson smasson lodyc jussieu fr 22 9 1999 version Id: findtopid pro 325 2007 12 06 10:04:53Z pinsard FUNCTION findtopid widget_id compile_opt idl2 strictarrsubs id long WIDGET_ID exist widget_info id managed if exist EQ 0 then return 1 topid id topid2 id while topid2 NE 0 do begin topid topid2 topid2 widget_info topid2 parent endwhile return long topid end"); a[383] = new Array("./ToBeReviewed/WIDGET/slec.html", "slec.pro", "", " file_comments categories param NAME param DEBUT param FIN param NOMEXP keyword PARENT in required The widget ID of the parent widget keyword BOXZOOM Vector indicating the geographic zone on which we want to cut the map If BOXZOOM has : 1 element : The extraction is made on lon1 lon2 lat1 lat2 0 boxzoom 0 2 elements: The extraction is made on lon1 lon2 lat1 lat2 boxzoom 0 boxzoom 1 4 elements: The extraction is made on Boxzoom 0 max gdept gdepw 5 elements: The extraction is made on Boxzoom 0:3 0 Boxzoom 4 6 elements: The extraction is made on Boxzoom where lon1 lon2 lat1 lat2 are global variables defined at the last domdef keyword _EXTRA Used to pass keywords returns uses restrictions examples history version Id: slec pro 327 2007 12 13 16:22:35Z pinsard todo Seb: documenter FUNCTION slec name debut fin nomexp PARENT parent BOXZOOM boxzoom _EXTRA ex compile_opt idl2 strictarrsubs cm_4data IF NOT keyword_set key_forgetold THEN BEGIN updatenew updatekwd ENDIF case n_params of 1:tab nlec name PARENT parent BOXZOOM boxzoom _EXTRA ex 2:tab nlec name debut PARENT parent BOXZOOM boxzoom _EXTRA ex 3:tab nlec name debut fin PARENT parent BOXZOOM boxzoom _EXTRA ex 4:tab nlec name debut fin nomexp PARENT parent BOXZOOM boxzoom _EXTRA ex endcase return tab:tab grille:vargrid unite:varunit experience:varexp nom:varname end"); a[384] = new Array("./ToBeReviewed/WIDGET/xnotice.html", "xnotice.pro", "", " file_comments Create a widget with some text at the middle of the window categories Information param TEXT in required type string vector or scalar it is a string or a vector of string If it is a scalar we look for the line separator C to create a text with several lines keyword CHKWIDGET Force to verify that they are some active widget to create a widget otherwise print at the prompt returns The identity of the created widget restrictions It do not call xmanager It do not create any event We have to delete this widget manually: widget_control widgetid destroy examples IDL id xnotice ca marche C ou pas IDL widget_control id destroy history Sebastien Masson smasson lodyc jussieu fr 2000 3 17 version Id: xnotice pro 371 2008 08 07 09:32:02Z pinsard FUNCTION xnotice text CHKWIDGET chkwidget We separate the text in different lines separated by C if it is not done yet compile_opt idl2 strictarrsubs if n_elements text EQ 1 then text str_sep text C trim if keyword_set chkwidget then makewid widget_info managed 0 ELSE makewid 1 if makewid EQ 0 then BEGIN for i 0 n_elements text 1 do print text i noticebase 0 endif noticebase widget_base column title information align_center screensize get_screen_size widget_control noticebase tlb_set_xoffset screensize 0 2 2 tlb_set_yoffset screensize 1 2 2 nothing widget_label noticebase value for i 0 n_elements text 1 do nothing widget_label noticebase value text i nothing widget_label noticebase value widget_control noticebase realize return noticebase end"); a[385] = new Array("./ToBeReviewed/WIDGET/xquestion.html", "xquestion.pro", "", " file_comments categories param EVENT returns uses restrictions examples history version Id: xquestion pro 371 2008 08 07 09:32:02Z pinsard PRO xquestion_event event compile_opt idl2 strictarrsubs we get the answer widget_control widget_info event top find_by_uname text get_value answer answer answer 0 now we give the answer to xquestion pro by using the pointer uvalue widget_control event top get_uvalue ptranswer ptranswer answer we destroy the widget widget_control event top destroy return end file_comments A small widget who ask a question and give an answer WARNING: For a binary question with yes no answer use DIALOG_MESSAGE categories Widget param QUESTION type A scalar string or a array of string If this argument is set to : an array of strings: each array element is displayed as a separate line of text a scalar string: we are looking for the separate line character C param PROPOSEDANSWER type string proposing a answer keyword CHKWIDGET Active this keyword if you want that xquestion check if managed widget are present If not xquestion do not open a widget but print the question in the IDL window keyword _EXTRA Used to pass keywords returns answer: a string restrictions The function does not return to its caller until the user press Enter key in the widget examples IDL help xquestion Postscript name STRING toto ps history Sebastien Masson smasson lodyc jussieu fr 13 10 1999 version Id: xquestion pro 371 2008 08 07 09:32:02Z pinsard FUNCTION xquestion question proposedanswer CHKWIDGET chkwidget _EXTRA ex compile_opt idl2 strictarrsubs is separate line a scalar we must cut it into pieces if n_elements question EQ 1 then question str_sep question C trim is a widget necessary if keyword_set chkwidget then BEGIN if widget_info managed 0 EQ 0 then BEGIN if n_elements proposedanswer EQ 0 then BEGIN proposedanswer answer complete ENDIF ELSE BEGIN answer proposedanswer complete default answer is proposedanswer ENDELSE if n_elements question GT 1 THEN for i 0 n_elements question 2 do print question i read question n_elements question 1 complete answer if keyword_set answer EQ 0 then answer proposedanswer return answer endif endif definition of the widget BaseId widget_base column title Question _extra ex screensize get_screen_size widget_control BaseId tlb_set_xoffset screensize 0 2 2 tlb_set_yoffset screensize 1 2 2 for i 0 n_elements question 1 DO trash widget_label BaseId value question i align_left if n_elements proposedanswer EQ 0 then answer ELSE answer proposedanswer trash widget_text BaseId value answer editable _extra ex uname text trash widget_button BaseId value ok ptranswer ptr_new allocate_heap widget_control BaseId set_uvalue ptranswer we realize the widget and wait for an answer widget_control BaseId realize xmanager xquestion BaseId we get the answer answer ptranswer we freeing the pointer ptr_free ptranswer return answer end"); a[386] = new Array("./ToBeReviewed/WIDGET/xx.html", "xx.pro", "", " file_comments categories keyword JOUR keyword MESHFILENAME keyword LISTVAR keyword LISTGRID keyword FUNCLEC_NAME keyword CALENDAR keyword _EXTRA Used to pass keywords uses restrictions examples history version Id: xx pro 327 2007 12 13 16:22:35Z pinsard todo seb documenter PRO xx JOUR jour MESHFILENAME meshfilename LISTVAR listvar LISTGRID listgrid FUNCLEC_NAME funclec_name CALENDAR calendar _EXTRA ex compile_opt idl2 strictarrsubs common Name of the part to be changed Name of the reading function if NOT keyword_set funclec_name then funclec_name slec varexp INF list of variables if NOT keyword_set listvar then listvar tn sn un vn taux tauy hdep20 hdep28 hdep15 hturb hpycn htoth emp qn qs smltot11 smltot12 smltot13 smltot14 smltot15 smltot16 tmltot11 tmltot12 tmltot13 tmltot14 tmltot15 tmltot16 list of grids to which variables refer to if NOT keyword_set listgrid then BEGIN listgrid replicate T n_elements listvar listgrid 2 4 U listgrid 3 5 V ENDIF calendar to be used in IDL julian days if NOT keyword_set calendar then BEGIN if keyword_set jour then calendar calendriertotem julian_day ELSE calendar calendriertotem julian_day mensuel ENDIF Name of the file refering to the mask if NOT keyword_set meshfilename then meshfilename usr1 com smasson IDL INIT inittotem pro meshparameters whichgrid meshfilename parameters specifing how the field must be read readparameters funclec_name: funclec_name jpidta: jpidta jpjdta: jpjdta jpkdta: jpkdta ixmindta: ixmindta ixmaxdta: ixmaxdta iymindta: iymindta iymaxdta: iymaxdta izmindta: izmindta izmaxdta: izmaxdta End of the part to be change fileparameters filename: many time_counter: calendar listvar: listvar listgrid: strupcase listgrid multistructure fileparameters: temporary fileparameters readparameters: temporary readparameters meshparameters: temporary meshparameters xxx multistructure temporary multistructure _extra ex return end"); a[387] = new Array("./ToBeReviewed/WIDGET/xxx.html", "xxx.pro", "", " file_comments see Mini Guide for Basic Commands in the XXX Program categories param EVENT returns uses restrictions examples history version Id: xxx pro 370 2008 08 07 07:59:15Z pinsard PRO xxx_event event compile_opt idl2 strictarrsubs common widget_info event top find_by_uname What is the type of event if event id EQ 622 then help event struct widget_control event id get_uvalue uval if tag_names event structure_name 0 EQ WIDGET_TRACKING then uval name: ActiverFenetre if keyword_set uval EQ 0 then return help event struct help uval struct case on the type of event widget_control event top get_uvalue top_uvalue If we activate the keyword separate at the call of xxx if size top_uvalue type EQ 3 then begin event top top_uvalue widget_control event top get_uvalue top_uvalue endif we delete the small widget created by notice pro if it exists noticebase extractatt top_uvalue noticebase if noticebase NE 0 then BEGIN widget_control noticebase destroy top_uvalue 1 findline top_uvalue noticebase 0l endif options extractatt top_uvalue options case uval name OF menubar :xxxmenubar_event event ok :nouveaudessin 1 specifie : action : calendar1 :BEGIN date2id widget_info event top find_by_uname calendar2 widget_control date2id get_value date2 if event value GT date2 then widget_control date2id set_value event value END calendar2 :BEGIN date1id widget_info event top find_by_uname calendar1 widget_control date1id get_value date1 if event value LT date1 then widget_control date1id set_value event value END domain : varlist :BEGIN currentfile extractatt top_uvalue currentfile listvar extractatt top_uvalue fileparameters currentfile listvar name listvar event index changefield event top name END txtcmd : filelist :BEGIN changefile event top event index END ActiverFenetre :BEGIN if event enter EQ 1 AND d name NE PS then BEGIN graphid widget_info event top find_by_uname graph graphid extractatt top_uvalue graphid widget_control graphid get_value win wset win widget_control event top get_uvalue top_uvalue numdessinin extractatt top_uvalue smallin 2 1 p extractatt top_uvalue penvs numdessinin x extractatt top_uvalue xenvs numdessinin y extractatt top_uvalue yenvs numdessinin endif END graph :BEGIN quelclick identifyclick event case quelclick type of inutile :return long :longclickaction event single :singleclickaction event double :doubleclickaction event endcase END endcase if keyword_set nouveaudessin then letsdraw event top return end file_comments A maximum of possibilities with a minimum of clics categories Widget param DATAFILENAME param IDLFILE param ARGSPRO keyword SEPARATE To separate the button part and the drawing part in 2 windows Useful for small screens but be careful to do not saturate the video memory of some antiquated Tx keyword RESTORE toto dat or toto dat is a file created at the time of a precedent use of xxx thanks to the command Widget of the menu save as keyword _EXTRA Used to pass keywords keyword CALLERWIDID keyword REDRAW keyword SEPARATE keyword UVALUE The user value to be associated with the widget uses common history Sebastien Masson smasson lodyc jussieu fr version Id: xxx pro 370 2008 08 07 07:59:15Z pinsard todo seb: documenter le reste des keywords PRO xxx datafilename idlfile argspro CALLERWIDID callerwidid REDRAW redraw SEPARATE separate UVALUE uvalue RESTORE restore _EXTRA ex compile_opt idl2 strictarrsubs all_cm reinitialize the p x y z variables reinitplt we get back the uvalue of the widget that called xxx to create a new widget if keyword_set restore then BEGIN restore isafile filename restore iodir homedir _extra ex if size restore type NE 7 then restore 0 ELSE BEGIN restore isafile file restore iodir homedir _extra ex newgrid extractatt uvalue meshparameters 0 change changegrid newgrid ENDELSE endif if n_elements CallerWidId NE 0 THEN widget_control CallerWidId get_uvalue uvalue ELSE CallerWidId 0 list of files we want to look at if keyword_set uvalue then BEGIN currentfile extractatt uvalue currentfile filelist extractatt uvalue filelist fileparameters extractatt uvalue fileparameters readparameters extractatt uvalue readparameters meshparameters extractatt uvalue meshparameters ENDIF ELSE BEGIN newfile selectfile datafilename idlfile argspro _extra ex if size newfile type NE 8 then return fileparameters ptrarr 1 allocate_heap fileparameters 0 newfile fileparameters readparameters ptrarr 1 allocate_heap readparameters 0 newfile readparameters meshparameters ptrarr 1 allocate_heap meshparameters 0 newfile meshparameters currentfile 0 filelist newfile fileparameters filename ENDELSE if keyword_set uvalue THEN BEGIN smallin extractatt uvalue smallin smallout extractatt uvalue smallout ENDIF ELSE BEGIN smallin 1 1 1 smallout 1 1 1 ENDELSE nbredessin smallin 0 smallin 1 numdessinin smallin 2 1 warning flg definition must be consistent with cw_pdmenu argument see also flag definition in cw_pagelayout if keyword_set uvalue then BEGIN flag extractatt uvalue optionsflag key_portrait flag 0 numdessinin ENDIF ELSE flag key_portrait 0 0 0 0 replicate 1 nbredessin We start the widget definition widget and screen size scrsize get_screen_size 0 95 windsize givewindowsize xxxsize windsize 0 1 keyword_set separate 350 windsize 1 The top base IF xxxsize 0 LE scrsize 0 AND xxxsize 1 LE scrsize 1 THEN BEGIN base widget_base title xxx GROUP_LEADER group tracking_events uname base space 0 ENDIF ELSE BEGIN base widget_base title xxx GROUP_LEADER group tracking_events uname base space 0 xsize xxxsize 0 ysize xxxsize 1 x_scroll_size xxxsize 0 selectact ENDIF ELSE selectfile 0 menu options xoff xoff 110 if keyword_set uvalue then begin options extractatt uvalue options ENDIF ELSE options Portrait Landscape Overlay Vecteur Longitude x index Latitude y index desc 1 File 0 Open 0 New xxx 2 Quit 1 Save as 0 PostScript 0 Animated gif 0 Gif 0 IDL procedure 0 RESTORE kwd of xxx 2 Print to prompt 1 Flag options descsuite options if n_elements descsuite GE 2 then descsuite 0:n_elements descsuite 2 0 descsuite 0:n_elements descsuite 2 descsuite n_elements descsuite 1 2 descsuite n_elements descsuite 1 desc desc descsuite menu cw_pdmenu base desc RETURN_NAME uname menubar uvalue name: menubar xoffset xoff yoffset yoff Ok button yoff yoff 37 xoff 5 button OK baseok widget_button base value OK uvalue name: ok uname ok button frame xoffset xoff yoffset yoff Page Layout page layout xoff xoff 65 dummyid cw_pagelayout base smallin row frame xoffset xoff yoffset yoff List of Variables xoff xoff 140 currentlistvar fileparameters currentfile listvar vlstid widget_combobox base value currentlistvar uvalue name: varlist uname varlist xoffset xoff yoffset yoff 1 if keyword_set uvalue then BEGIN selectvar extractatt uvalue varinfo 1 numdessinin selectvar where currentlistvar EQ selectvar 0 widget_control vlstid set_combobox_select 0 selectvar ENDIF ELSE selectvar 0 List of files yoff yoff 35 flstid widget_combobox base value file_basename filelist uname filelist xsize 345 yoffset yoff uvalue name: filelist if keyword_set uvalue then BEGIN selectfile extractatt uvalue varinfo 0 numdessinin selectfile where file_basename filelist EQ selectfile 0 widget_control flstid set_combobox_select 0 selectfile ENDIF ELSE selectfile 0 Text for computation yoff yoff 32 computation done on the files if keyword_set uvalue then txtvalue extractatt uvalue txtcmd numdessinin ELSE txtvalue varexp dummyid widget_text base value txtvalue uvalue name: txtcmd uname txtcmd editable yoffset yoff xsize 54 frame Calendar yoff yoff 40 currentcalendar fileparameters currentfile time_counter key_caltype fileparameters currentfile caltype fakecal fileparameters currentfile fakecal if keyword_set uvalue then begin dates extractatt uvalue dates numdessinin date1 date2jul dates 0 date2 date2jul dates 1 ENDIF basecalid widget_base base column 2 space 0 yoffset yoff uname basecal dummyid cw_calendar basecalid currentcalendar date1 FAKECAL fakecal uname calendar1 uvalue name: calendar1 frame dummyid cw_calendar basecalid currentcalendar date2 FAKECAL fakecal uname calendar2 uvalue name: calendar2 frame Domain yoff yoff 60 vargrid strupcase fileparameters currentfile listgrid selectvar IF vargrid EQ W then zgrid W ELSE zgrid T if keyword_set uvalue then boxzoom extractatt uvalue domaines numdessinin dummyid cw_domain base uname domain uvalue name: domain unzoom frame boxzoom boxzoom yoffset yoff xoffset 15 Plots specifications yoff yoff 230 speid cw_specifie base uname specifie uvalue name: specifie frame column forxxx yoffset yoff if keyword_set uvalue then BEGIN exextra extractatt uvalue exextra numdessinin IF n_elements exextra NE 0 THEN widget_control speid set_value exextra ENDIF drawing part if keyword_set separate then basegraph widget_base title xxx window group_leader base uvalue base ELSE basegraph base graphid widget_draw basegraph uname graph button_events retain 2 uvalue name: graph press:0 click:0 x: 0 0 y: 0 0 xoffset 350 1 keyword_set separate xsize windsize 0 ysize windsize 1 tooltip toto realize the widget widget_control base realize if keyword_set separate then begin widget_control basegraph realize xmanager xxx basegraph no_block endif if keyword_set uvalue then BEGIN We recopy the pointer uvalue in top_uvalue Beware we have to redefine completely top_value from variables pointed by uvalue Otherwise if we simply do top_value uvalue when we delete by uvalue and variables on which it point we also delete variables on which point top_value case 1 of keyword_set redraw :BEGIN top_uvalue uvalue widget_control base set_uvalue top_uvalue we find homedir homedir isadirectory io homedir title Bad definition of homedir We recuperae the list of instructions globalcommand extractatt top_uvalue globalcommand We complete by first and last lines of the program createpro globalcommand filename myuniquetmpdir xxx2ps pro KWDLIST NOERASE noerase POSTSCRIPT postscript PORTRAIT portrait LANDSCAPE landscape noerase END keyword_set restore :begin top_uvalue uvalue widget_control base set_uvalue top_uvalue widget_control graphid get_value win wshow win wset win tv image true widgets s state updatewidget base END ELSE:BEGIN top_uvalue ptrarr 2 29 allocate_heap FOR i 0 28 do top_uvalue 0 i uvalue 0 i FOR i 0 14 do top_uvalue 1 i uvalue 1 i FOR i 18 27 do top_uvalue 1 i uvalue 1 i numfile n_elements extractatt uvalue filelist top_uvalue 1 15 ptrarr numfile allocate_heap top_uvalue 1 16 ptrarr numfile allocate_heap top_uvalue 1 17 ptrarr numfile allocate_heap for i 0 numfile 1 do begin top_uvalue 1 15 i uvalue 1 15 i top_uvalue 1 16 i uvalue 1 16 i top_uvalue 1 17 i uvalue 1 17 i endfor top_uvalue 1 28 ptrarr nbredessin allocate_heap for i 0 nbredessin 1 do top_uvalue 1 28 i uvalue 1 28 i widget_control base set_uvalue top_uvalue Copy the screen of the widget of uvalue in top_value s one if keyword_set CallerWidId then begin widget_control extractatt uvalue graphid get_value win wshow win wset win image tvrd true widget_control graphid get_value win wshow win wset win tv image true ENDIF END endcase top_uvalue 1 findline top_uvalue graphid graphid ENDIF ELSE BEGIN Otherwise we will define all elements we will hook at the widget thanks to the top_value which is a pointer array with 2 columns: names and variables We initialize all these elements Variables concerning the widget in its generality if NOT keyword_set ex then ex nothing:0 variables se rapportant aux differents fichiers que l on peut lire variables specifiques a chaque dessin creation of the pointer we will hook at the widget top_uvalue ptrarr 2 29 allocate_heap variables refering to the widget top_uvalue 0 0 options top_uvalue 1 0 options top_uvalue 0 1 smallin top_uvalue 1 1 smallin top_uvalue 0 2 smallout top_uvalue 1 2 smallout top_uvalue 0 3 graphid top_uvalue 1 3 graphid top_uvalue 0 4 alreadyvector top_uvalue 1 4 1 top_uvalue 0 5 alreadyover top_uvalue 1 5 1 top_uvalue 0 6 alreadyread top_uvalue 1 6 1 top_uvalue 0 7 currentreadcmd top_uvalue 1 7 top_uvalue 0 8 globalcommand top_uvalue 1 8 top_uvalue 0 9 globaloldcommand top_uvalue 1 9 top_uvalue 0 10 no more used top_uvalue 1 10 9999 top_uvalue 0 11 noticebase top_uvalue 1 11 0l top_uvalue 0 12 extra top_uvalue 1 12 ex variables refering to different files we can read top_uvalue 0 13 currentfile top_uvalue 1 13 currentfile top_uvalue 0 14 filelist top_uvalue 1 14 filelist top_uvalue 0 15 fileparameters top_uvalue 1 15 fileparameters top_uvalue 0 16 readparameters top_uvalue 1 16 readparameters top_uvalue 0 17 meshparameters top_uvalue 1 17 meshparameters variables refering to different drawing we can do top_uvalue 0 18 penvs top_uvalue 1 18 replicate p nbredessin top_uvalue 0 19 xenvs top_uvalue 1 19 replicate x nbredessin top_uvalue 0 20 yenvs top_uvalue 1 20 replicate y nbredessin top_uvalue 0 21 nameprocedures top_uvalue 1 21 strarr nbredessin top_uvalue 0 22 types top_uvalue 1 22 strarr nbredessin top_uvalue 0 23 varinfo top_uvalue 1 23 strarr 2 nbredessin top_uvalue 0 24 domaines top_uvalue 1 24 fltarr 6 nbredessin top_uvalue 0 25 dates top_uvalue 1 25 lonarr 2 nbredessin top_uvalue 0 26 txtcmd top_uvalue 1 26 strarr nbredessin top_uvalue 0 27 optionsflag top_uvalue 1 27 flag top_uvalue 0 28 exextra top_uvalue 1 28 ptrarr nbredessin allocate_heap widget_control base set_uvalue top_uvalue createhistory base smallin ENDELSE xmanager xxx base no_block return end"); a[388] = new Array("./Utilities/createfunc.html", "createfunc.pro", "", " file_comments write an IDL function compile it and execute it useful to avoid the use of execute param command in required type scalar string defining the result to be given back by the function see examples keyword FILENAMEIN in default for_createfunc pro name of the function to be created keyword KWDLIST in type vector string to specify a list of keywords that must be included in the function definition Warning: the string must start with a for example: KWDLIST TOTO toto keyword _EXTRA Used to pass keywords to the created function restrictions arguments can be given only through keywords ends the function name with pro if needed examples IDL print createfunc 3 2 FILENAMEIN test IDL print createfunc 3 two FILENAMEIN test IDL KWDLIST two two TWO 2 history Sebastien Masson smasson lodyc jussieu fr May 2005 version Id: createfunc pro 375 2008 08 08 15:55:40Z pinsard FUNCTION createfunc command FILENAMEIN filenamein KWDLIST kwdlist _EXTRA ex compile_opt idl2 hidden strictarrsubs usage result createfunc command FILENAMEIN filenamein KWDLIST kwdlist _EXTRA ex IF n_elements command NE 1 THEN BEGIN dummy report Input parameter command empty Usage : usage stop ENDIF define filename if needed if NOT keyword_set filenamein then filename for_createfunc pro ELSE filename filenamein get the name of the function not the name of the file containing the function shortfilename file_basename filename pro check if the directory exists dirname isadirectory file_dirname filename title Redefine shortfilename pro directory IF size dirname type NE 7 THEN return 1 filename dirname shortfilename pro create the file if NOT keyword_set kwdlist then kwdlist kwdlist kwdlist _EXTRA ex IF strmid kwdlist 0 1 NE THEN kwdlist kwdlist putfile filename function shortfilename kwdlist compile_opt idl2 hidden strictarrsubs res command return res end is dirname in path cd current here pathlist here strsplit path path_sep search_path extract inpath total file_search dirname fully_qualify_path 0 EQ pathlist IF inpath EQ 0 THEN path dirname path_sep search_path path update the list of pro and sav in PATH path_cache rebuild do we really use shortfilename list find shortfilename onlypro firstfound IF list 0 NE filename THEN BEGIN it is ok if filename is the first one dummy report Several files shortfilename are found in the path and list 0 we be used instead of filename We stop simple stop ENDIF compile it resolve_routine shortfilename is_function execute it res call_function shortfilename _EXTRA ex return res end"); a[389] = new Array("./Utilities/createpro.html", "createpro.pro", "", " file_comments write an idl procedure compile it and execute it param command in required type string array array defining the procedure to be created each element will be a line of the created procedure keyword FILENAMEIN in default for_createpro pro name of the procedure to be created keyword KWDLIST in type vector string to specify a list of keywords that must be included in the procedure definition Warning: the string must start with a for example: KWDLIST TOTO toto keyword KWDUSED obsolete please pass directly your keywords through _EXTRA keyword _EXTRA Used to pass keywords to the created procedure restrictions is not working with functions use createfunc instead arguments can be given only through keywords ends the procedure name with pro if needed examples IDL createpro print OK FILENAMEIN test IDL createpro if keyword_set ok then print OK else print No IDL FILENAMEIN test KWDLIST ok ok IDL createpro if keyword_set ok then print OK else print No IDL FILENAMEIN test KWDLIST ok ok ok history Sebastien Masson smasson lodyc jussieu fr cleaning new keywords: October 2005 Feb 2006: supress keyword kwdused and use call_procedure instead of execute version Id: createpro pro 375 2008 08 08 15:55:40Z pinsard PRO createpro command FILENAMEIN filenamein KWDLIST kwdlist KWDUSED kwdused _EXTRA ex compile_opt idl2 hidden strictarrsubs IF keyword_set kwdused THEN BEGIN dummy report keyword KWDUSED has been suppressed please pass directly your keywords through _EXTRA see examples in createpro header return ENDIF define filename if needed if NOT keyword_set filenamein then filename for_createpro pro ELSE filename filenamein get the name of the procedure not the name of the file containing the procedure shortfilename file_basename filename pro check if the directory exists dirname isadirectory file_dirname filename title Redefine shortfilename pro directory IF size dirname type NE 7 THEN return filename dirname shortfilename pro create the file if NOT keyword_set kwdlist then kwdlist kwdlist kwdlist _extra ex kwdlist strtrim kwdlist 2 IF strmid kwdlist 0 1 NE THEN kwdlist kwdlist for i 0 n_elements command 1 do print command i putfile filename pro shortfilename kwdlist compile_opt idl2 hidden strictarrsubs command return end is dirname in path cd current here pathlist here strsplit path path_sep search_path extract inpath total file_search dirname fully_qualify_path 0 EQ pathlist IF inpath EQ 0 THEN path dirname path_sep search_path path update the list of pro and sav in PATH path_cache rebuild do we really use shortfilename list find shortfilename onlypro firstfound IF list 0 NE filename THEN BEGIN it is ok if filename is the first one dummy report Several files shortfilename are found in the path and list 0 we be used instead of filename We stop simple stop ENDIF compile it resolve_routine shortfilename help ex structure print ex ex execute it call_procedure shortfilename _extra ex return end"); a[390] = new Array("./Utilities/def_myuniquetmpdir.html", "def_myuniquetmpdir.pro", "", " file_comments if needed define and create myuniquetmpdir common variable from cm_general and add it to path categories Utilities examples IDL def_myuniquetmpdir uses cm_general history Sebastien Masson smasson lodyc jussieu fr June 2005 version Id: def_myuniquetmpdir pro 371 2008 08 07 09:32:02Z pinsard PRO def_myuniquetmpdir compile_opt idl2 strictarrsubs cm_general IF n_elements myuniquetmpdir EQ 0 THEN BEGIN define a new and unique directory in getenv IDL_TMPDIR by using systime 1 if possible look for the login to make a more explicite name IF file_which getenv PATH whoami ne THEN spawn whoami login noshell ELSE login unknown myuniquetmpdir file_search getenv IDL_TMPDIR mark_directory myuniquetmpdir myuniquetmpdir 0 saxo_ login 0 strtrim long systime 1 1 create it file_mkdir myuniquetmpdir add it to path path myuniquetmpdir path_sep search_path path check that each element of path is unique splpath strsplit path path_sep search_path extract count ndir nouniq different lindgen ndir uniq splpath sort splpath IF nouniq 0 NE 1 THEN BEGIN allpro find pro iodirectory path onlypro nall n_elements allpro allpro strmid allpro reform strpos allpro reverse_search 1 nall 1 nouniqpro different lindgen nall uniq allpro sort allpro IF nouniqpro 0 NE 1 THEN BEGIN nouniqcnt n_elements nouniq nouniqprocnt n_elements nouniqpro text WARNING Your path contains strtrim nouniqcnt 1 duplicate elements This can create bugs for files with the same name located in several directories strtrim nouniqprocnt 1 found dummy report text text duplicate directories in the path: splpath nouniq 0:9 nouniqcnt 1 IF nouniqcnt GT 10 THEN text text dummy report text simple text files with the same name: allpro nouniqpro 0:9 nouniqprocnt 1 IF nouniqprocnt GT 10 THEN text text dummy report text simple ENDIF ENDIF ENDIF return end"); a[391] = new Array("./Utilities/demomode_compatibility.html", "demomode_compatibility.pro", "", " categories Utilities uses cm_general version Id: demomode_compatibility pro 371 2008 08 07 09:32:02Z pinsard PRO demomode_compatibility compile_opt idl2 strictarrsubs cm_general 1 remove all cm_demomode_used pro found in path to_rm find cm_demomode_used IF to_rm 0 NE NOT FOUND THEN file_delete to_rm 2 copy oldcm_full _empty to myuniquetmpdir oldcm_used pro select which file should be copied to oldcm_used pro IF lmgr demo EQ 1 THEN BEGIN democm find cm_demomode file_copy democm myuniquetmpdir cm_demomode_used pro overwrite ENDIF ELSE BEGIN create an empty file close the journal if already open IF journal NE 0 THEN journal open a new one journal myuniquetmpdir cm_demomode_used pro close it it will be empty journal ENDELSE update the path cache to include cm_demomode_used path_cache rebuild return END"); a[392] = new Array("./Utilities/find.html", "find.pro", "", " file_comments based on FILE_SEARCH but it is possible to specify a set of possibles names and a different set of possibles directories names By default look for files included in path all FILE_SEARCH keywords can be used categories find a file param FILEIN in required type scalar string or array of strings File name s to match Input names specifications may contain wildcard characters enabling them to match multiple files see FILE_SEARCH for more informations By default and if necessary find is looking for filename and also for filename completed with pro keyword FIRSTFOUND activate this keyword to stop looking for the file as soon as we found one Return a scalar string containing the first file found keyword IODIRECTORY type scalar string or array of strings default path Directories names where we are looking for the file Different directories can be separated by path_sep search_path : on unix type machine as it is done to define path Note that if filename s dirname is different from this keyword is not taken into account keyword LOOKALLDIR activate to look for the file with a recursive search if needed in iodir homedir path the DATA:TestsData directory if it exists keyword NOPRO activate to avoid the automatic search of filename completed with pro keyword ONLYPRO force to look only at file ending with pro keyword ONLYNC force to look only at file ending with nc keyword RECURSIVE performs recursive searching of directory hierarchies In a recursive search find looks recursively for any and all subdirectories in the file hierarchy rooted at the IODIRECTORY argument keyword REPERTOIRE obsolete keep for compatibility use IODIRECTORY keyword keyword UNIQUE activate to make sure that each element of the output vector is unique keyword TRYFIND if the file was not found and this keyword is activated find will call itself with the keywords LOOKALLDIR and FIRSTFOUND to try to find the file we are looking for Note that if the file was found at the first try this keyword as no effect which is not the case with LOOKALLDIR keyword _EXTRA Used to pass keywords returns A scalar or array variable of string type containing the name with the full path of the matching files If no files exist with names matching the input arguments find returns the scalar string : NOT FOUND examples IDL print find loadct usr local rsi idl_6 0 lib utilities xloadct pro usr local rsi idl_6 0 lib loadct pro IDL print find loadct iodir dir recursive usr local rsi idl_6 0 lib loadct pro usr local rsi idl_6 0 lib utilities xloadct pro IDL print find loadct pro usr local rsi idl_6 0 lib utilities xloadct pro usr local rsi idl_6 0 lib loadct pro IDL print find loadct nopro NOT FOUND IDL print find loadct iodir usr local rsi idl_6 0 lib usr local rsi idl_6 0 lib loadct pro IDL print find loadct iodir usr local rsi idl_6 0 lib test_write NOT FOUND IDL print find loadct iodir usr local rsi idl_6 0 lib recursive usr local rsi idl_6 0 lib loadct pro usr local rsi idl_6 0 lib utilities xloadct pro IDL print find mesh iodirectory iodir path Users sebastie DATA ORCA2 meshmaskORCA2closea nc Users sebastie IDL meshmaskclosesea pro Users sebastie IDL meshmaskclosesea pro Users sebastie SAXO_RD Obsolete meshlec pro usr local rsi idl_6 0 lib mesh_obj pro history Sebastien Masson smasson lodyc jussieu fr 28 4 1999 6 7 1999: compatibility mac and windows June 2005: Sebastien Masson: cleaning use for file_ functions version Id: find pro 375 2008 08 08 15:55:40Z pinsard FUNCTION find filein IODIRECTORY iodirectory RECURSIVE recursive REPERTOIRE repertoire NOPRO nopro ONLYPRO onlypro ONLYNC onlync UNIQUE unique FIRSTFOUND firstfound LOOKALLDIR LOOKALLDIR TRYFIND tryfind _EXTRA ex compile_opt idl2 strictarrsubs define where we look for the file cd current current current current path_sep CASE 1 OF keyword_set lookalldir :BEGIN cm_general dirnames current iodir homedir path tstdtadir file_dirname find find onlypro mark_directory parent path_sep parent_directory path_sep tstdtadir file_search tstdtadir parent parent DATA TestsData 0 IF tstdtadir NE THEN dirnames tstdtadir dirnames END keyword_set iodirectory : dirnames iodirectory keyword_set repertoire : dirnames repertoire ELSE: dirnames current path ENDCASE tmp dirnames dirnames dummy FOR i 0 n_elements tmp 1 DO dirnames dirnames strsplit tmp i path_sep search_path extract dirnames dirnames 1: fileout dummy FOR i 0 n_elements filein 1 DO BEGIN dir file_dirname filein i base file_basename filein i try to complete the file name with pro or nc if needed CASE 1 OF keyword_set onlypro :BEGIN promiss strpos base pro reverse_search promiss promiss strlen base 4 bad where promiss NE 0 OR strlen base LE 4 cnt IF cnt NE 0 THEN base bad base bad pro end keyword_set onlync :BEGIN ncmiss strpos base nc reverse_search ncmiss ncmiss strlen base 3 bad where ncmiss NE 0 OR strlen base LE 3 cnt IF cnt NE 0 THEN base bad base bad nc END ELSE:if strmid base 0 1 reverse_offset NE AND NOT keyword_set nopro THEN base base pro ENDCASE use dirnames only if dir eq IF dir EQ THEN BEGIN if keyword_set recursive THEN found file_search dirnames base _extra ex ELSE found file_search dirnames base _extra ex ENDIF ELSE found file_search dir base _extra ex IF found 0 NE THEN BEGIN IF keyword_set firstfound THEN return found 0 fileout fileout found ENDIF ENDFOR IF n_elements fileout EQ 1 THEN fileout NOT FOUND ELSE fileout fileout 1: IF n_elements fileout GT 1 THEN BEGIN IF keyword_set unique THEN fileout fileout uniq fileout sort fileout ENDIF ELSE fileout fileout 0 IF keyword_set lookalldir AND fileout 0 EQ NOT FOUND AND NOT keyword_set recursive THEN filout find file_basename filein 0 lookalldir recursive _extra ex IF keyword_set tryfind AND fileout 0 EQ NOT FOUND THEN BEGIN fileout find file_basename filein 0 lookalldir firstfound _extra ex fileout fileout 0 ENDIF RETURN fileout END"); a[393] = new Array("./Utilities/fitintobox.html", "fitintobox.pro", "", " file_comments Check that the input array has size and dimensions compatible with the domain that was defined with the previous call of domdef categories Compatibility param sz in required param nx in required param ny in required param nz in required param jpi in required param jpj in required param jpk in required param jpt in required returns 1 history Sebastien Masson smasson lodyc jussieu fr 10 juin 2000 June 2005: S Masson rewrite all version Id: fitintobox pro 388 2008 12 09 09:36:41Z smasson hidden FUNCTION err_mess sz jpi nx jpj ny jpk nz jpt compile_opt idl2 strictarrsubs IF n_elements sz EQ 1 THEN RETURN report Error: the vector size tostr sz is incompatible with the domain dimensions jpi nx jpj ny jpk nz jpt strtrim jpi 1 strtrim nx 1 strtrim jpj 1 strtrim ny 1 strtrim jpk 1 strtrim nz 1 strtrim jpt 1 simple RETURN report Error: the array dimensions tostr sz are incompatible with the domain dimensions jpi nx jpj ny jpk nz jpt strtrim jpi 1 strtrim nx 1 strtrim jpj 1 strtrim ny 1 strtrim jpk 1 strtrim nz 1 strtrim jpt 1 simple END categories Compatibility param field in required type array or struct an array or a structure that can be read by the function litchamp param nx in optional default define by grille param ny in optional default define by grille param nz in optional default define by grille param firstx in optional default define by grille param firsty in optional default define by grille param firstz in optional default define by grille param lastx in optional default define by grille param lasty in optional default define by grille param lastz in optional default define by grille keyword GRID default vargrid defined in cm_4data To specify on which grid are located the data see grille keyword WDEPTH default 0 To specify that we are at W level see grille returns an array with dimensions matching the domain or 1 if there is an error uses cm_4mesh cm_4cal examples IDL help fitintobox findgen jpi jpj FLOAT Array 41 3 IDL help fitintobox findgen jpi jpj 78 Error: the array dimensions 180 148 78 are incompatible with the domain dimensions jpi nx jpj ny jpk nz jpt 180 41 148 3 31 31 1 INT 1 history Sebastien Masson smasson lodyc jussieu fr 10 juin 2000 June 2005: S Masson rewrite all version Id: fitintobox pro 388 2008 12 09 09:36:41Z smasson FUNCTION fitintobox field nx ny nz firstx firsty firstz lastx lasty lastz GRID GRID WDEPTH wdepth compile_opt idl2 strictarrsubs cm_4mesh cm_4cal IF NOT keyword_set key_forgetold THEN BEGIN updatenew ENDIF arr litchamp field IF n_params EQ 1 THEN grille 1 1 1 1 nx ny nz firstx firsty firstz lastx lasty lastz GRID GRID WDEPTH wdepth case according the number of dimensions of the array sz size arr case sz 0 of 0:BEGIN scalar return report Error: scalar value strtrim arr 1 simple END 1:BEGIN 1D arrays CASE 1 OF x arrays sz 1 EQ jpi :arr temporary arr firstx:lastx sz 1 EQ nx : y arrays sz 1 EQ jpj :arr temporary arr firsty:lasty sz 1 EQ ny : z arrays sz 1 EQ jpk :arr temporary arr firstz:lastz sz 1 EQ nz : t arrays sz 1 EQ jpt : ELSE:return err_mess sz 1 jpi nx jpj ny jpk nz jpt ENDCASE END 2:BEGIN 2D arrays CASE 1 OF xy arrays sz 1 EQ jpi AND sz 2 EQ jpj :arr temporary arr firstx:lastx firsty:lasty sz 1 EQ jpi AND sz 2 EQ ny :arr temporary arr firstx:lastx sz 1 EQ nx AND sz 2 EQ jpj :arr temporary arr firsty:lasty sz 1 EQ nx AND sz 2 EQ ny :arr temporary arr x y z arrays sz 1 EQ jpi AND ny EQ 1 AND sz 2 EQ jpk :arr temporary arr firstx:lastx firstz:lastz sz 1 EQ jpi AND ny EQ 1 AND sz 2 EQ nz :arr temporary arr firstx:lastx sz 1 EQ nx AND ny EQ 1 AND sz 2 EQ jpk :arr temporary arr firstz:lastz sz 1 EQ nx AND ny EQ 1 AND sz 2 EQ nz : x yz arrays nx EQ 1 AND sz 1 EQ jpj AND sz 2 EQ jpk :arr temporary arr firsty:lasty firstz:lastz nx EQ 1 AND sz 1 EQ jpj AND sz 2 EQ nz :arr temporary arr firsty:lasty nx EQ 1 AND sz 1 EQ ny AND sz 2 EQ jpk :arr temporary arr firstz:lastz nx EQ 1 AND sz 1 EQ ny AND sz 2 EQ nz : xt arrays sz 1 EQ jpi AND sz 2 EQ jpt:arr temporary arr firstx:lastx sz 1 EQ nx AND sz 2 EQ jpt: yt arrays sz 1 EQ jpj AND sz 2 EQ jpt:arr temporary arr firsty:lasty sz 1 EQ ny AND sz 2 EQ jpt: zt arrays sz 1 EQ jpk AND sz 2 EQ jpt:arr temporary arr firstz:lastz sz 1 EQ nz AND sz 2 EQ jpt: ELSE:return err_mess sz 1:2 jpi nx jpj ny jpk nz jpt ENDCASE END 3:BEGIN 3D arrays CASE 1 OF xyz arrays sz 1 EQ jpi AND sz 2 EQ jpj AND sz 3 EQ jpk :arr temporary arr firstx:lastx firsty:lasty firstz:lastz sz 1 EQ jpi AND sz 2 EQ ny AND sz 3 EQ jpk :arr temporary arr firstx:lastx firstz:lastz sz 1 EQ nx AND sz 2 EQ jpj AND sz 3 EQ jpk :arr temporary arr firsty:lasty firstz:lastz sz 1 EQ nx AND sz 2 EQ ny AND sz 3 EQ jpk :arr temporary arr firstz:lastz sz 1 EQ jpi AND sz 2 EQ jpj AND sz 3 EQ nz :arr temporary arr firstx:lastx firsty:lasty sz 1 EQ jpi AND sz 2 EQ ny AND sz 3 EQ nz :arr temporary arr firstx:lastx sz 1 EQ nx AND sz 2 EQ jpj AND sz 3 EQ nz :arr temporary arr firsty:lasty sz 1 EQ nx AND sz 2 EQ ny AND sz 3 EQ nz : xyt arrays sz 1 EQ jpi AND sz 2 EQ jpj AND sz 3 EQ jpt:arr temporary arr firstx:lastx firsty:lasty sz 1 EQ jpi AND sz 2 EQ ny AND sz 3 EQ jpt:arr temporary arr firstx:lastx sz 1 EQ nx AND sz 2 EQ jpj AND sz 3 EQ jpt:arr temporary arr firsty:lasty sz 1 EQ nx AND sz 2 EQ ny AND sz 3 EQ jpt: x yzt arrays nx EQ 1 AND sz 1 EQ jpj AND sz 2 EQ jpk AND sz 3 EQ jpt:arr temporary arr firsty:lasty firstz:lastz nx EQ 1 AND sz 1 EQ jpj AND sz 2 EQ nz AND sz 3 EQ jpt:arr temporary arr firsty:lasty nx EQ 1 AND sz 1 EQ ny AND sz 2 EQ jpk AND sz 3 EQ jpt:arr temporary arr firstz:lastz nx EQ 1 AND sz 1 EQ ny AND sz 2 EQ nz AND sz 3 EQ jpt: x y zt arrays sz 1 EQ jpi AND ny EQ 1 AND sz 2 EQ jpk AND sz 3 EQ jpt:arr temporary arr firstx:lastx firstz:lastz sz 1 EQ jpi AND ny EQ 1 AND sz 2 EQ nz AND sz 3 EQ jpt:arr temporary arr firstx:lastx sz 1 EQ nx AND ny EQ 1 AND sz 2 EQ jpk AND sz 3 EQ jpt:arr temporary arr firstz:lastz sz 1 EQ nx AND ny EQ 1 AND sz 2 EQ nz AND sz 3 EQ jpt: ELSE:return err_mess sz 1:3 jpi nx jpj ny jpk nz jpt ENDCASE END 4:BEGIN 4D arrays CASE 1 OF xyzt arrays sz 1 EQ jpi AND sz 2 EQ jpj AND sz 3 EQ jpk AND sz 4 EQ jpt:arr temporary arr firstx:lastx firsty:lasty firstz:lastz sz 1 EQ jpi AND sz 2 EQ ny AND sz 3 EQ jpk AND sz 4 EQ jpt:arr temporary arr firstx:lastx firstz:lastz sz 1 EQ nx AND sz 2 EQ jpj AND sz 3 EQ jpk AND sz 4 EQ jpt:arr temporary arr firsty:lasty firstz:lastz sz 1 EQ nx AND sz 2 EQ ny AND sz 3 EQ jpk AND sz 4 EQ jpt:arr temporary arr firstz:lastz sz 1 EQ jpi AND sz 2 EQ jpj AND sz 3 EQ nz AND sz 4 EQ jpt:arr temporary arr firstx:lastx firsty:lasty sz 1 EQ jpi AND sz 2 EQ ny AND sz 3 EQ nz AND sz 4 EQ jpt:arr temporary arr firstx:lastx sz 1 EQ nx AND sz 2 EQ jpj AND sz 3 EQ nz AND sz 4 EQ jpt:arr temporary arr firsty:lasty sz 1 EQ nx AND sz 2 EQ ny AND sz 3 EQ nz AND sz 4 EQ jpt: ELSE:return err_mess sz 1:4 jpi nx jpj ny jpk nz jpt ENDCASE END ELSE:return report Error: fitintobox is managing arrays with a maximum of 4 dimensions simple ENDCASE return arr end"); a[394] = new Array("./Utilities/isadirectory.html", "isadirectory.pro", "", " file_comments check if a directory exists and make sure that it ends with the directory separator mark categories Input Output param DIRECTORYIN in optional a proposed directory If neither dirname input parameter of IODIRECTORY keyword are defined we ask the user to choose a directory keyword IODIRECTORY a proposed directory keyword TITLE the title of the window keyword _EXTRA Used to pass keywords to DIALOG_PICKFILE returns the directory name examples IDL print dir usr local rsi idl_6 0 IDL print isadirectory dir usr local rsi idl_6 0 IDL print isadirectory dir notgood history Sebastien Masson smasson lodyc jussieu fr June 28 2000 June 2005: Sebastien Masson: cleaning use for file_ functions version Id: isadirectory pro 371 2008 08 07 09:32:02Z pinsard FUNCTION isadirectory directoryin TITLE title IODIRECTORY iodirectory _EXTRA ex compile_opt idl2 strictarrsubs CASE 1 OF size directoryin type 0 EQ 7:directory directoryin keyword_set iodirectory :directory iodirectory ELSE:directory directory that is not existing ENDCASE testfile file_test directory directory if directory doesn t exist we ask the user to provide a directory name IF total testfile NE n_elements directory THEN BEGIN IF NOT keyword_set title THEN title choose a directory FOR i 0 n_elements directory 1 DO BEGIN IF testfile i EQ 0 THEN BEGIN directory i dialog_pickfile directory title title must_exist _extra ex if directory i EQ THEN RETURN report check find directory canceled ENDIF ENDFOR ENDIF directory file_search directory mark_directory test_directory fully_qualify_path IF n_elements directory EQ 1 THEN RETURN directory 0 ELSE RETURN directory END"); a[395] = new Array("./Utilities/isafile.html", "isafile.pro", "", " file_comments same as find except that as long as the file is NOT FOUND isafile calls DIALOG_PICKFILE to ask the user to select a file categories Input Output param filein in optional a proposed name If neither filein input parameter or filename keyword are defined we ask the user to choose a file keyword FILENAME a proposed filename keyword IODIRECTORY a directory where we look for the file this keyword is taken into account only if the dirname of filein or filename is keyword NEW to specify that filename is a new file and that we should check only its path keyword ONLYPRO force to look only at file ending with pro keyword ONLYNC force to look only at file ending with nc keyword RECURSIVE performs recursive searching of directory hierarchies In a recursive search find looks recursively for any and all subdirectories in the file hierarchy rooted at the IODIRECTORY argument keyword _EXTRA Used to pass keywords to find FILE_SEARCH and DIALOG_PICKFILE returns the filename with its path examples IDL print isafile Users sebastie SAXO_RD Commons cm_4mesh pro Users sebastie SAXO_RD Commons cm_4mesh pro IDL print isafile cm_4mesh pro iodir Users sebastie SAXO_RD Commons Users sebastie SAXO_RD Commons cm_4mesh pro IDL print isafile cm_4mesh pro iodir path Users sebastie SAXO_RD Commons cm_4mesh pro IDL print isafile cm_4mesh pro iodir Users sebastie SAXO_RD recursive Users sebastie SAXO_RD Commons cm_4mesh pro IDL print isafile cm_4mesh pro iodir getenv HOME recursive Users sebastie SAXO_RD Commons cm_4mesh pro IDL print isafile fake_file pro history Sebastien Masson smasson lodyc jussieu fr 11 2 2000 June 2005: Sebastien Masson: cleaning use for file_ functions version Id: isafile pro 392 2009 02 10 09:34:16Z smasson FUNCTION isafile filein FILENAME filename IODIRECTORY iodirectory NEW new RECURSIVE RECURSIVE ONLYPRO onlypro ONLYNC onlync _EXTRA ex compile_opt idl2 strictarrsubs CASE 1 OF size filein type 0 EQ 7:fileout filein keyword_set filename :fileout filename 0 ELSE:fileout file that is not existing ENDCASE if size fileout type NE 7 THEN return 1 CASE 1 OF keyword_set onlypro : filter pro keyword_set onlync : filter nc else: filter ENDCASE basename file_basename fileout dirname file_dirname fileout should we redefine dirname if fileout NE dirname basename AND dirname EQ AND NOT keyword_set iodirectory then dirname if keyword_set iodirectory AND dirname EQ then dirname iodirectory if keyword_set new then return dirname n_elements dirname 1 path_sep basename fileout find basename iodirectory dirname recursive recursive unique firstfound ONLYPRO onlypro ONLYNC onlync _extra ex WHILE fileout 0 EQ NOT FOUND DO BEGIN fileout dialog_pickfile path dirname 0 filter filter _extra ex if fileout EQ THEN RETURN report check find file canceled check again everything basename file_basename fileout dirname file_dirname fileout check if the name of the dirname is ok dirname isadirectory dirname title choose a directory for the file basename if we cancel the check IF size dirname type NE 7 THEN return report check find file canceled fileout find basename iodirectory dirname recursive recursive unique firstfound ONLYPRO onlypro ONLYNC onlync _extra ex ENDWHILE RETURN fileout END"); a[396] = new Array("./Utilities/linearequation.html", "linearequation.pro", "", " file_comments Calculate a linear equation of the type ax by c 0 thanks to coordinates of 2 points comment: we can have a table with pairs of points categories Utilities param POINT1 in required This is the first point of the straight line s whose we want to calculate equation s param POINT2 in required This is the second point of the straight line s whose we want to calculate equation s There is 2 possibilities: 1 point is a complex or a table of complex where each element is the coordinates of the point 2 point is a table of real of dimension 2 number_of_straight_line For each row of the table we have coordinates of the point returns abc is a table of dimension 3 number_of_straight_line where for each line of the table we obtain the 3 parameters a b and c of the linear equation ax by c 0 examples IDL abc linearequation complex 1 2 3 4 IDL print abc 0 1 abc 1 2 abc 2 0 00000 history Sebastien Masson smasson lodyc jussieu fr 10 juin 2000 version Id: linearequation pro 371 2008 08 07 09:32:02Z pinsard FUNCTION linearequation point1 point2 compile_opt idl2 strictarrsubs if size point1 type EQ 6 OR size point1 type EQ 9 then begin x1 float point1 y1 imaginary point1 ENDIF ELSE BEGIN x1 float reform point1 0 y1 float reform point1 1 ENDELSE if size point2 type EQ 6 OR size point2 type EQ 9 then begin x2 float point2 y2 imaginary point2 ENDIF ELSE BEGIN x2 float reform point2 0 y2 float reform point2 1 ENDELSE vertical where x1 EQ x2 novertical where x1 NE x2 abc fltarr 3 n_elements x1 IF novertical 0 NE 1 then BEGIN y mx p nele n_elements novertical m y2 novertical y1 novertical x2 novertical x1 novertical p x2 novertical y1 novertical y2 novertical x1 novertical x2 novertical x1 novertical abc novertical reform m 1 nele replicate 1 1 nele reform p 1 nele ENDIF IF vertical 0 NE 1 then BEGIN x ny p nele n_elements vertical n x2 vertical x1 vertical y2 vertical y1 vertical p y2 vertical x1 vertical x2 vertical y1 vertical y2 vertical y1 vertical abc vertical replicate 1 1 nele reform n 1 nele reform p 1 nele ENDIF return abc end"); a[397] = new Array("./Utilities/lineintersection.html", "lineintersection.pro", "", " file_comments Calculate coordinates of the intersection between 2 straight lines or of a succession of 2 straight lines categories Utilities param ABC1 in required type 3d array is the first array of dimension 3 number_of_pairs_of_straight_lines whose each line contain the 3 parameters a b and c of the first linear equation of the type ax by c 0 param ABC2 in required type 3d array is second array of dimension 3 number_of_pairs_of_straight_lines whose each line contain the 3 parameters a b and c of the second linear equation of the type ax by c 0 keyword FLOAT To return the output as a array of real numbers instead of vectors of complex by default returns 2 possibilities: 1 by default: it is a vector of complex whose each element is the coordinates of the intersection point of a pair of straight lines 2 if FLOAT is activated it is a array of reals of dimension 2 number_of_pairs_of_straight_lines whose each row is the coordinates of the intersection point of a pair of straight line restrictions If the 2 straight lines are parallel we return coordinates values f_nan values f_nan Beware of the precision of the machine which make that calculated coordinates may not exactly verify equations of the pair of straight lines examples IDL abc1 linearequation complex 1 2 3 4 IDL abc2 linearequation complex 1 2 8 15 IDL print lineintersection abc1 abc2 1 00000 2 00000 IDL print lineintersection abc1 abc2 float 1 00000 2 00000 history Sebastien Masson smasson lodyc jussieu fr 10 juin 2000 version Id: lineintersection pro 375 2008 08 08 15:55:40Z pinsard FUNCTION lineintersection abc1 abc2 FLOAT float compile_opt idl2 strictarrsubs a1 float reform abc1 0 b1 float reform abc1 1 c1 float reform abc1 2 a2 float reform abc2 0 b2 float reform abc2 1 c2 float reform abc2 2 determinant a1 b2 a2 b1 nan where determinant EQ 0 if nan 0 NE 1 THEN determinant values f_nan x b1 c2 c1 b2 determinant y c1 a2 a1 c2 determinant if keyword_set float then begin npts n_elements x res reform x 1 npts over reform y 1 npts over ENDIF ELSE res complex x y return res end"); a[398] = new Array("./Utilities/mergeonline_help.html", "mergeonline_help.pro", "", " file_comments Have one unique online help for IDL and SAXO categories Documentation restrictions Needs at least version 6 2 history Sept 2006: Sebastien Masson smasson lodyc jussieu fr version Id: mergeonline_help pro 325 2007 12 06 10:04:53Z pinsard PRO mergeonline_help compile_opt idl2 strictarrsubs is the IDL version at least 6 2 idlversion float strmid version release 0 3 IF idlversion LT 6 2 THEN BEGIN ras report Warning: You need at least IDL 6 2 to use SAXO IDL merged online help return ENDIF check directories get the environment variable HOME home getenv HOME is it defined IF home EQ THEN return is HOME a writable directory home file_search home test_directory test_write mark_directory 0 IF home EQ THEN return is dir help online_help a directory homeidl dir help online_help homeidl file_search homeidl test_directory mark_directory 0 IF homeidl EQ THEN return is HOME assistant a directory if not create it homeassist home assistant IF file_test homeassist directory EQ 0 THEN file_mkdir homeassist is HOME assistant a writable directory homeassist file_search homeassist test_directory test_write mark_directory 0 IF homeassist EQ THEN return is HOME assistant src a directory if not create it homesrc homeassist src IF file_test homesrc directory EQ 0 THEN file_mkdir homesrc is HOME assistant src a writable directory homesrc file_search homesrc test_directory test_write mark_directory 0 IF homesrc EQ THEN return homesaxo file_dirname find buildinit pro 0 mark_directory Documentation idldoc_assistant_output IF file_test homesaxo idldoc lib adp EQ 0 THEN BEGIN print Error when looking for the file homesaxo idldoc lib adp return ENDIF check existence and version of the file that need to be created do idl adp and home html already exists IF file_test homesrc home html AND file_test homesrc idl adp AND file_test homesrc aboutsaxo txt THEN BEGIN is the revision version of homesrc idl adp the same of homesaxo idldoc lib adp is Id found in homesrc idl adp idladp getfile homesrc idl adp line strmatch idladp Id line where line EQ 1 0 IF line NE 1 THEN BEGIN new idladp line is Id found in homesaxo idldoc lib adp saxoadp getfile homesaxo idldoc lib adp line strmatch saxoadp Id line where line EQ 1 0 IF line NE 1 THEN BEGIN old saxoadp line are the 2 revision tags the same IF array_equal old new THEN BEGIN is IDL version the same of homesrc home html homehtml getfile homesrc home html line strmatch homehtml IDL string idlversion format f3 1 line where line EQ 1 0 IF line NE 1 THEN BEGIN help_path homesrc print Use SAXO IDL merged online help return ENDIF ENDIF ENDIF ENDIF ENDIF build homesrc idl adp modify the original idl adp idladp getfile homeidl idl adp extract part from to line1 strmatch idladp line1 where line1 EQ 1 0 line2 strmatch idladp line2 where line2 EQ 1 0 1L idladp idladp line1:line2 put the complete path of the references idladp strsed idladp ref ref homeidl modify the original idldoc lib adp saxoadp getfile homesaxo idldoc lib adp extract part from line1 strmatch saxoadp line1 where line1 EQ 1 0 1 saxoadp saxoadp line1: put the complete path of the references saxoadp strsed saxoadp ref ref homesaxo merge idl adp and idldoc lib adp add an header and write it in a new file header SAXO IDL version release Help SAXO IDL version release Help homesrc home html About SAXO homesrc aboutsaxo txt homeidl newadp temporary header temporary idladp temporary saxoadp putfile homesrc idl adp temporary newadp build homesrc home html homehtml getfile homeidl home html put the complete path of the references homehtml strsed homehtml ref ref homeidl find the first line containing line strmatch homehtml line where line EQ 1 0 insert one line after this line homehtml homehtml 0:line 160 160 SAXO Directory homehtml line 1: find the last line containing line strmatch homehtml line where line EQ 1 cnt cnt 1 insert one line after this line homehtml homehtml 0:line 160 160 SAXO Home Page homehtml line 1: put the complete path of the images homehtml strsed homehtml src src homeidl except for SAXOIDL_OnlineHelp_title png parent path_sep parent_directory path_sep homehtml strsed homehtml src IDL_OnlineHelp_Title gif src homesaxo parent xmldoc images SAXOIDL_OnlineHelp_title png putfile homesrc home html temporary homehtml build homesrc aboutsaxo txt about getfile homesaxo parent parent overview remove the lines containing lines strmatch about about about where lines EQ 0 add some informattions: about about More informations on http: forge ipsl jussieu fr saxo putfile homesrc aboutsaxo txt temporary about ras report Merge of SAXO and IDL online help done help_path homesrc RETURN END"); a[399] = new Array("./Utilities/protype.html", "protype.pro", "", " file_comments test is a pro file corresponds to an IDL procedure function or batch file categories Utilities param FILE in required type string the name of the pro file to be tested if necessary the input name is completed with pro and its path found in path returns 1 if not found A scalar of string type: proc func or batch examples IDL print protype protype func IDL print protype protype pro func IDL print protype init batch IDL print protype plt proc history Sebastien Masson smasson lodyc jussieu fr Feb 2006 version Id: protype pro 371 2008 08 07 09:32:02Z pinsard FUNCTION protype file compile_opt idl2 strictarrsubs filepro find file 0 onlypro firstfound if filepro EQ NOT FOUND then return 1 name file_basename filepro pro allines getfile filepro CASE 1 OF this is a procedure max stregex allines pro name fold_case boolean :RETURN proc this is a function max stregex allines function name fold_case boolean :RETURN func this is an IDL batch file ELSE:RETURN batch ENDCASE RETURN 1 END"); a[400] = new Array("./Utilities/pwd.html", "pwd.pro", "", " file_comments print the current directory categories like unix function history Sebastien Masson smasson lodyc jussieu fr version Id: pwd pro 325 2007 12 06 10:04:53Z pinsard PRO pwd compile_opt idl2 strictarrsubs cd current pwd print pwd return end"); a[401] = new Array("./Utilities/report.html", "report.pro", "", " file_comments Like DIALOG_MESSAGE if there is already some widget active or like MESSAGE if there is not any widget active To ask a question whose answer is not yes no use xquestion param textin in required type scalar string or arrays of string If textin is a scalar string we look for the line feed character C If textin is set to an array of strings each array element is displayed as a separate line of text keyword SIMPLE activate to print only the message without the name and the line of the routine defined by calling routine_name or Activate to print the error message without printing the routine name with its full path keyword PARENT same as DIALOG_PARENT of DIALOG_MESSAGE keyword QUESTION default Warning Set this keyword to create a Question dialog keyword DEFAULT_NO default Yes Set this keyword to make the No button the default selection for Question dialog keyword _EXTRA Used to pass keywords to DIALOG_MESSAGE and MESSAGE returns 1 if the keyword QUESTION is not activated If the keyword QUESTION is activated return 1 for yes and 0 for no examples If there is not any widget activated: IDL help report toto tata MAIN : toto tata INT 1 IDL help report does it works question does it works y n default answer is y BYTE 1 IDL help report question1: C does it works question question1: does it works y n default answer is y BYTE 1 If widgets are already activated it is the same thing but with widgets history Sebastien Masson smasson lodyc jussieu fr 21 10 1999 version Id: report pro 375 2008 08 08 15:55:40Z pinsard FUNCTION report textin DEFAULT_NO default_no PARENT parent QUESTION question SIMPLE simple _EXTRA ex compile_opt idl2 strictarrsubs res 1 we separate the text in different lines separated by C if it is not already done if n_elements textin EQ 1 then text str_sep textin C trim ELSE text textin we get the line routine name and revision version IF NOT keyword_set simple THEN BEGIN Look for the revsion in the code of the procedure function calling this report function ie the one where an problem was detected in the first occurence of the form : Id: report pro 375 2008 08 08 15:55:40Z pinsard prefix routine_name 1 split STRSPLIT prefix EXTRACT count cnt IF cnt GT 1 THEN BEGIN coderoutine getfile split 1 idline where stregex coderoutine Id: boolean EQ 1 0 IF idline GT 0 THEN BEGIN split STRSPLIT coderoutine idline EXTRACT prefix prefix rev split 3 : ENDIF ELSE BEGIN prefix prefix : ENDELSE ENDIF text prefix text ENDIF there is some widgets activated it is easy we call dialog_massage if widget_info managed 0 NE 0 then BEGIN res dialog_message text dialog_parent parent QUESTION question title routine_name 1 DEFAULT_NO default_no _extra ex if keyword_set question THEN res res EQ Yes ELSE res 1 ENDIF ELSE BEGIN there is not any widget activated do we ask a question IF keyword_set question THEN BEGIN what is the answer by default if keyword_set default_no then answer n ELSE answer y default_answer answer if n_elements text GT 1 THEN for i 0 n_elements text 2 do print text i read text n_elements text 1 y n default answer is default_answer answer answer strlowcase answer if the answer is not appropriated while answer NE and answer NE y and answer NE n do begin read text n_elements text 1 y n default answer is default_answer answer answer strlowcase answer ENDWHILE we adjust res in function of the answer case answer of :res default_answer EQ y y :res 1 n :res 0 endcase ENDIF ENDELSE If we do not ask any question we just make a print IF NOT keyword_set question THEN BEGIN FOR i 0 n_elements text 1 do print text i ENDIF return res end"); a[402] = new Array("./Utilities/routine_name.html", "routine_name.pro", "", " file_comments Give us the name of the routine procedure or function where we are categories Utilities param PILINGNUM in optional A whole number which give us how many level we have to reascend in the piling up of routines and subroutines to find the looked for routine returns a string giving either the full name of the routine with the path or MAIN restrictions This function use the keyword OUTPUT in HELP and it is specified in the on line help that the return syntax of this word can change in function of the version of the code This version works with IDL 5 2 examples IDL print routine_name usr1 com smasson IDL_RD UTILITAIRE report pro IDL print routine_name 1 usr1 com smasson IDL_RD PLOTS DIVERS determineminmax pro IDL print routine_name 2 usr1 com smasson IDL_RD PLOTS DESSINE plt pro IDL print routine_name 3 MAIN IDL print routine_name 4 MAIN history Sebastien Masson smasson lodyc jussieu fr 21 10 1999 version Id: routine_name pro 386 2008 12 03 13:26:28Z smasson FUNCTION routine_name pilingnum compile_opt idl2 strictarrsubs help traceback output name IF d name EQ WIN THEN BEGIN name 0 name 0 FOR i 1 n_elements name 1 DO BEGIN IF strmid name i 0 1 EQ THEN name i name i ENDFOR ENDIF name strtrim name 1 we remove blanks at the beginning of lines and we put elements of the vector stuck ones with each others to make an unique string allnames for i 0 n_elements name 1 do allnames allnames name i name str_sep allnames we cut it out again name strtrim name 2 we remove blanks in front of and behind name strcompress name we compress blanks we do not hold back the two first elements who are a blanck and the line concerning routine_name name name 2: n_elements name 1 we choose the line which concern us if NOT keyword_set pilingnum then pilingnum 0 if pilingnum GE n_elements name then return MAIN name name pilingnum if strpos name MAIN NE 1 then return MAIN name str_sep name if n_elements name LT 3 then name name 0 ELSE name L name 1 name 2 return name end"); a[403] = new Array("./Utilities/testvar.html", "testvar.pro", "", " file_comments A kind of KEYWORD_SET but when the value exist it send it back categories Utilities keyword VAR any kind of returns 0 if the variable does not exist examples IDL print testvar var toto 0 IDL print testvar var toto toto history Sebastien Masson smasson lodyc jussieu fr 14 12 1999 version Id: testvar pro 371 2008 08 07 09:32:02Z pinsard FUNCTION testvar VAR var compile_opt idl2 strictarrsubs if keyword_set var then return var ELSE return 0 end"); a[404] = new Array("./Utilities/text_box.html", "text_box.pro", "", " file_comments This procedure writes a short text message within a box shaped area in a graphic window The message may be split at word boundaries into several lines and the character size and orientation may be adjusted for the text to fit within the box param TEXT in required type string message in ASCII keyword POS 4 elements vector specifying the box position and size pos 0 pos 1 specify the lower left corner coordinate pos 2 pos 3 specify the upper right corner coordinate data window normalized coordinates are used keyword FG_COLOR default 0 color of box and legend titles keyword BG_COLOR background color Setting BG_COLOR erases the area covered by the text box filling it with color BG_COLOR prior to writing the text If both BG_COLOR and p color are zero then the background color is reset to 255 to guarantee a readability keyword RIGHT if set right justify text keyword CENTER if set center the text keyword VERT_SPACE default 1 5 vertical spacing of lines in units of character height keyword _EXTRA Used to pass keywords keyword BOX activate to show the box on graphic window history Paul Ricchiazzi 7Jul93 Institute for Computational Earth System Science University of California Santa Barbara version Id: text_box pro 375 2008 08 08 15:55:40Z pinsard PRO text_box text POS pos FG_COLOR fg_color BG_COLOR bg_color CENTER center RIGHT right BOX box VERT_SPACE vert_space _EXTRA ex compile_opt idl2 strictarrsubs ON_ERROR 2 Check the number of parameters justify 1 if keyword_set right ne 0 then justify 1 if keyword_set center ne 0 then justify 0 if keyword_set vert_space eq 0 then vert_space 1 5 IF n_elements text eq 0 then message must specify text nnx x window d x_vsize nny y window d y_vsize nnx 0 1 d x_vsize nny 0 1 d y_vsize if n_elements pos eq 0 then begin box_cursor xx1 yy1 nx ny xx2 xx1 nx yy2 yy1 ny pos xx1 nnx 0 nnx 1 nnx 0 yy1 nny 0 nny 1 nny 0 xx2 nnx 0 nnx 1 nnx 0 yy2 nny 0 nny 1 nny 0 posstring string form a 4 f5 2 a pos pos 0 pos 1 pos 2 pos 3 print strcompress posstring remove_all endif else begin xx1 nnx 0 pos 0 nnx 1 nnx 0 xx2 nnx 0 pos 2 nnx 1 nnx 0 yy1 nny 0 pos 1 nny 1 nnx 0 yy2 nny 0 pos 3 nny 1 nnx 0 endelse calculate the height and width of the box in characters width xx2 xx1 d x_ch_size height yy2 yy1 d y_ch_size decompose the message into words words str_sep text print f 20a words nwords n_elements words wordlen lenstr words d x_vsize blanklen lenstr d x_vsize maxcharsize xx2 xx1 4 blanklen max wordlen charsize 1 lpnt intarr nwords nomore 0 ntries 0 repeat begin ntries ntries 1 if ntries gt 20 then message Can not fit message into box ychsiz vert_space d y_ch_size charsize wlen wordlen charsize blen blanklen charsize n_lines fix yy2 yy1 ychsiz 1 sum 0 ilines 0 print f 8a8 charsz i ilines n_lines lpnt wlen sum xwdth for i 0 nwords 1 do begin sum sum wlen i blen if sum 3 blen gt xx2 xx1 then begin ilines ilines 1 sum wlen i blen endif lpnt i ilines print f f8 2 4i8 3f8 2 charsize i ilines n_lines lpnt i wlen i blen sum 3 blen xx2 xx1 endfor case 1 of ilines 1 lt n_lines: if charsize 1 1 gt maxcharsize then vert_space yy2 yy1 n_lines 1 d y_ch_size charsize else charsize charsize 1 1 ilines 1 eq n_lines: nomore 1 ilines 1 gt n_lines: charsize charsize 9 endcase endrep until nomore lines strarr n_lines maxlen 0 for i 0 n_lines 1 do begin ii where lpnt eq i nc maxlen total wlen ii nc blen maxlen lines i string f 200a words ii print i words ii print i lines i endfor align 5 1 justify case justify of 1:xx xx1 5 xx2 xx1 maxlen 0:xx 0 5 xx1 xx2 1:xx xx2 5 xx2 xx1 maxlen endcase dy d y_ch_size charsize vert_space yy yy2 0 5 dy xbox xx1 xx2 xx2 xx1 xx1 ybox yy1 yy1 yy2 yy2 yy1 if n_elements bg_color ne 0 then begin if p color eq 0 and bg_color eq 0 then bgc 255 else bgc bg_color polyfill xbox ybox color bgc device endif if n_elements fg_color eq 0 then color 0 else color fg_color for i_line 0 n_lines 1 do begin yy yy dy print xx yy lines i_line charsize xyouts xx yy lines i_line device charsize charsize alignment align color color font 1 _extra ex endfor if keyword_set box then plots xbox ybox color color device return end"); a[405] = new Array("./Utilities/undefine.html", "undefine.pro", "", " file_comments erase a variable same thing like DELVAR but usable in a program and usable for one variable simultaneously categories Utilities param VARNAME in required The name of the variable we want erase examples IDL a 1 IDL undefine a Compiled module: UNDEFINE IDL help a A UNDEFINED history trouve sur la page web de D Fanning : QUESTION: How do I make an IDL variable have a type undefined ANSWER: At the main IDL level you can use the IDL procedure DELVAR to delete an IDL variable and make it undefined Inside of procedures and functions I use this little program named undefine that I got from Andrew Cool at the DSTO High Frequency Radar Division in Adelaide Australia version Id: undefine pro 389 2009 01 27 08:59:35Z smasson PRO undefine varname compile_opt idl2 strictarrsubs IF n_elements varname NE 0 THEN tempvar SIZE TEMPORARY varname END"); a[406] = new Array("./Utilities/xfile.html", "xfile.pro", "", " file_comments display an ASCII file in a widget It is the same thing that XDISPLAYFILE but here we use it to display the content of a procedure or of a function located in the path pro suffix will be appended if needed categories Utilities Widget param FILENAME in required type scalar string It is the name of the procedure or of the function we want to display with or without pro at the end FILENAME should be located in path pro suffix will be appended if needed keyword _EXTRA Used to pass keywords to XDISPLAYFILE restrictions Triggers the XMANAGER if it is not already in use examples IDL xfile plt history Sebastien Masson smasson lodyc jussieu fr 7 1 99 6 7 1999: compatibility mac and windows version Id: xfile pro 375 2008 08 08 15:55:40Z pinsard PRO xfile filename _EXTRA ex compile_opt idl2 strictarrsubs usage xfile filename _EXTRA ex check parameters check_param N_PARAMS if check_param EQ 0 then begin dummy report No input parameter Usage : usage return endif check arguments if arg_present filename then begin dummy report No input parameter filename Usage : usage return endif Are we sure filename is a string intype size filename type if intype NE 7 then begin dummy report Input parameter filename type : size filename TNAME Input parameter filename must be a string return endif find the file and display it pfile find filename firstfound if pfile NE NOT FOUND then begin xdisplayfile pfile 0 _EXTRA ex endif else begin dummy report Input parameter filename : filename filename does not exist endelse return end"); a[407] = new Array("./Utilities/xhelp.html", "xhelp.pro", "", " file_comments Display an IDL procedure header using widgets and the widget manager categories Utilities Widget param filename in required type scalar string It is the name of the procedure or of the function we want to display with or without pro at the end FILENAME should be located in path pro suffix will be appended if needed keyword _EXTRA Used to pass keywords to XDISPLAYFILE restrictions Triggers the XMANAGER if it is not already in use examples IDL xhelp plt history Written By Steve Richards December 1990 Graceful error recovery DMS Feb 1992 Modified to extract pro documentation headers PJR ESRG mar94 Paul Ricchiazzi jun93 Institute for Computational Earth System Science University of California Santa Barbara 7 1 99 : legeres modification par Sebastien Masson : utilisation de XDISPLAYFILE de FINDFILE et de _extra 6 7 1999: compatibility mac and windows version Id: xhelp pro 378 2008 08 12 12:35:46Z pinsard PRO xhelp filename _EXTRA ex compile_opt idl2 strictarrsubs usage xhelp filename _EXTRA ex check parameters check_param N_PARAMS if check_param EQ 0 then begin dummy report No input parameter Usage : usage return endif check arguments if arg_present filename then begin dummy report No input parameter filename Usage : usage return endif Are we sure filename is a string intype size filename type if intype NE 7 then begin dummy report Input parameter filename type : size filename TNAME Input parameter filename must be a string return endif find the file and display it pfile find filename firstfound read it IF pfile NE NOT FOUND THEN BEGIN fulltext getfile pfile find the and start where stregex fulltext boolean EQ 1 cnt1 ending where stregex fulltext boolean EQ 1 cnt2 IF cnt1 EQ 0 OR cnt1 NE cnt2 THEN BEGIN dummy report file pfile is badly written no proper header found Use xfile return ENDIF do we have hidden parts hide where stregex fulltext hidden boolean EQ 1 buid the text to display header sepbloc string replicate byte 60 FOR i 0 cnt1 1 DO BEGIN is this part hidden st start i ed ending i IF st NE ed 1 THEN BEGIN non empty bloc dummy where hide GT st AND hide LT ed cnt IF cnt EQ 0 THEN header header sepbloc fulltext st 1:ed 1 ENDIF ENDFOR remove the first useless lines IF n_elements header GT 1 THEN header header 4: ELSE BEGIN dummy report file pfile has empty header Use xfile return ENDELSE xdisplayfile dummy text header 1: title pfile _extra ex endif else begin dummy report Input parameter filename : filename filename does not exist endelse return end"); a[408] = new Array("./buildinit.html", "buildinit.pro", "", " file_comments slightly modified version of cw_field categories param parent in required The ID of the parent widget keyword COLUMN Buttons will be arranged in the number of columns specified by this keyword keyword ROW Buttons will be arranged in the number of rows specified by this keyword keyword EVENT_FUNC The name of an optional user supplied event function for buttons This function is called with the return value structure whenever a button is pressed and follows the conventions for user written event functions keyword FLOATING keyword INTEGER keyword LONG keyword STRING keyword FONT The name of the font to be used for the button titles If this keyword is not specified the default font is used keyword FRAME Specifies the width of the frame to be drawn around the base keyword TITLE The title of the window keyword UVALUE The user value to be associated with the widget keyword VALUE keyword RETURN_EVENTS keyword ALL_EVENTS keyword FIELDFONT keyword NOEDIT keyword TEXT_FRAME keyword XSIZE The width of the base keyword YSIZE The height of the base keyword UNAME The user name to be associated with the widget returns uses restrictions examples history version Id: buildinit pro 327 2007 12 13 16:22:35Z pinsard FUNCTION cw_field2 parent COLUMN column ROW row EVENT_FUNC efun FLOATING float INTEGER int LONG long STRING string FONT labelfont FRAME frame TITLE title UVALUE uvalue VALUE textvaluein RETURN_EVENTS returnevents ALL_EVENTS allupdates FIELDFONT fieldfont NOEDIT noedit TEXT_FRAME text_frame XSIZE xsize YSIZE ysize UNAME uname FLOOR vmin CEILING vmax compile_opt idl2 strictarrsubs resolve_routine cw_field compile_full_file is_function Examine our keyword list and set default values for keywords that are not explicitly set Column KEYWORD_SET Column Row 1 Column AllEvents 1 KEYWORD_SET NoEdit Enum Update None All CRonly Update 0 IF KEYWORD_SET AllUpdates THEN Update 1 IF KEYWORD_SET ReturnEvents THEN Update 2 IF N_ELEMENTS efun LE 0 THEN efun IF N_ELEMENTS Title EQ 0 THEN Title Input Field: TextValue N_ELEMENTS TextValueIn gt 0 TextValueIn : Convert non string values to strings if SIZE TextValue TNAME ne STRING then TextValue STRTRIM TextValue 2 IF N_ELEMENTS YSize EQ 0 THEN YSize 1 IF N_ELEMENTS uname EQ 0 THEN uname CW_FIELD_UNAME Type 0 string is default IF KEYWORD_SET Float THEN Type 1 IF KEYWORD_SET Int THEN Type 2 IF KEYWORD_SET Long THEN Type 3 Don t allow multiline non string widgets if Type ne 0 then YSize 1 YSize YSize 1 Build Widget Base WIDGET_BASE parent ROW row COLUMN column UVALUE uvalue EVENT_FUNC CW_FIELD_EVENT PRO_SET_VALUE CW_FIELD_SET FUNC_GET_VALUE CW_FIELD_GET FRAME Frame UNAME uname FOR i 0 n_elements title 1 DO Label WIDGET_LABEL Base VALUE Title i FONT LabelFont UNAME uname _LABEL align_left Text WIDGET_TEXT Base VALUE TextValue XSIZE XSize YSIZE YSize FONT FieldFont ALL_EVENTS AllEvents EDITABLE AllEvents AND TYPE EQ 0 FRAME Text_Frame UNAME uname _TEXT NO_ECHO AllEvents AND TYPE NE 0 Save our internal state in the first child widget State efun: efun TextId:Text Title:Title Update:Update Type:Type WIDGET_CONTROL WIDGET_INFO Base CHILD SET_UVALUE State NO_COPY RETURN Base END file_comments get back the ids of the cw_field widgets categories param EVENT returns uses restrictions examples history version Id: buildinit pro 327 2007 12 13 16:22:35Z pinsard PRO printerdef_event event compile_opt idl2 strictarrsubs widget_control event id get_uvalue cwids IF size cwids n_dimensions EQ 1 THEN cwids reform cwids 3 1 help cwids dims size cwids dimensions help dims print dims results strarr dims FOR i 0 dims 1 1 DO BEGIN widget_control cwids 0 i get_value res results 0 i res widget_control cwids 1 i get_value res results 1 i res widget_control cwids 2 i get_value res results 2 i res ENDFOR nothing where results EQ count IF count NE 0 THEN BEGIN nothing dialog_message Some of the text box are still empty dialog_parent event top information return ENDIF now we give the result to buildinit pro by using the pointer uvalue widget_control event top get_uvalue ptresult ptresult temporary results we destroy the widget widget_control event top destroy RETURN END file_comments get back the ids of the cw_field widgets categories param EVENT returns uses restrictions examples history version Id: buildinit pro 327 2007 12 13 16:22:35Z pinsard PRO papsize_event event compile_opt idl2 strictarrsubs widget_control event id get_uvalue uvalue IF uvalue 0 NE ok THEN return idist widget_info event top find_by_uname list id widget_info idist list_select widget_control idist get_uvalue selected selected selected id selected strsplit selected extract now we give the result to buildinit pro by using the pointer uvalue widget_control event top get_uvalue ptresult ptresult float selected 3 float selected 4 we destroy the widget widget_control event top destroy RETURN END file_comments now we give the answer to buildinit pro by using the pointer uvalue categories param event returns uses restrictions examples history version Id: buildinit pro 327 2007 12 13 16:22:35Z pinsard PRO xask_event event compile_opt idl2 strictarrsubs widget_control event top get_uvalue ptranswer ptranswer event value we destroy the widget widget_control event top destroy RETURN END file_comments categories keyword _EXTRA Used to pass keywords returns uses restrictions examples history version Id: buildinit pro 327 2007 12 13 16:22:35Z pinsard FUNCTION xask _EXTRA ex compile_opt idl2 strictarrsubs base widget_base field cw_field2 base frame return_events column _extra ex ptranswer ptr_new allocate_heap we realize the widget and wait for an answer widget_control base realize set_uvalue ptranswer xmanager xask base we get the answer answer ptranswer we freeing the pointer ptr_free ptranswer RETURN answer END file_comments categories keyword TITLE The title of the window keyword NOMARK keyword NOWRITE returns uses restrictions examples history version Id: buildinit pro 327 2007 12 13 16:22:35Z pinsard FUNCTION getdir TITLE title NOMARK nomark NOWRITE nowrite compile_opt idl2 strictarrsubs REPEAT BEGIN dir dialog_pickfile directory must_exist title title make sure dir is ok check read write access and directory separator mark dir file_search dir test_directory test_read test_write 1 keyword_set nowrite mark_directory 1 keyword_set nomark dir dir 0 ENDREP UNTIL dir NE RETURN dir END file_comments categories returns uses restrictions examples history version Id: buildinit pro 327 2007 12 13 16:22:35Z pinsard PRO buildinit compile_opt idl2 strictarrsubs IF fix strmid version release 0 1 LT 6 THEN BEGIN print print ERROR print print This version of SAXO needs at least IDL version 6 0 print print ERROR print return ENDIF IF lmgr demo EQ 1 THEN BEGIN print impossible to use buildinit in demo mode return ENDIF init This is the initialisation file it defines the path and the defaut values of some of the common variables this is supposed to speed up IDL a fltarr 1000 1000 100 a 0 path definition define myIDL directory myIDL getdir title Select the home directory my IDL nomark define SAXO directory saxodir getdir title Select SAXO directory nomark nowrite define the path init init path expand_path myIDL path_sep search_path expand_path saxodir path_sep search_path expand_path dir should we keep the compatibility with the old version yes dialog_message shall we keep the compatibility with the old version question default_no yes strlowcase yes init init compatibility with the old version keep_compatibility strtrim fix yes EQ yes 2 define all the commons init init define all the commons all_cm define default directories init init define default directories homedir isadirectory myIDL title Select the default HOME directory iodir getdir title Select the default IO directory init init iodir isadirectory iodir title Select the default IO directory psdir getdir title Select the default postscripts directory init init psdir isadirectory psdir title Select the default postscripts directory imagedir getdir title Select the default images directory init init imagedir isadirectory imagedir title Select the default images directory animdir getdir title Select the default animations directory init init animdir isadirectory animdir title Select the default animations directory number of printer ptnumb xask title Number of accessible printers value 0 long define all the printer parameters init init define printer parameters IF ptnumb NE 0 THEN BEGIN base widget_base column frame cwids lonarr 3 ptnumb FOR i 0 ptnumb 1 DO BEGIN subbase widget_base base row cwids 0 i cw_field subbase string Title printer_human_names strtrim i 2 cwids 1 i cw_field subbase string Title printer_machine_names strtrim i 2 cwids 2 i cw_field subbase string value lpr P Title print_command strtrim i 2 ENDFOR trash widget_button base value ok uvalue cwids ptresult ptr_new allocate_heap we realize the widget and wait for an answer widget_control base realize set_uvalue ptresult xmanager printerdef base init init printer_human_names strarr strtrim ptnumb 2 printer_machine_names strarr strtrim ptnumb 2 print_command strarr strtrim ptnumb 2 FOR i 0 ptnumb 1 DO BEGIN init init printer_human_names strtrim i 2 ptresult 0 i printer_machine_names strtrim i 2 ptresult 1 i print_command strtrim i 2 ptresult 2 i ENDFOR we freeing the pointer ptr_free ptresult ENDIF ELSE BEGIN init init printer_human_names printer_machine_names print_command ENDELSE Colors init init colors device decomposed 0 device retain 2 default color tables loadct get_names names ntables 40 title Choose the default color table the following lines come from loadct procedure nlines ntables 2 3 of lines to print nend nlines nlines 3 ntables for i 0 nend 1 do Print each line title title string format i2 a17 3x i2 a17 3x i2 a17 i names i i nlines names i nlines i 2 nlines xask title title value 39 long xask title title value 0 long 2 init init archive_ps strtrim archive_ps 2 end of the part that should be modified by the users if needed keep compatibility with the old version updateold filename xask title name of the init file written in homedir: myIDL value init pro string journal myIDL filename FOR i 0 n_elements init 1 DO journal init i journal RETURN END"); var URL = 0; var FILENAME = 1; var DESCRIPTION = 2; var CONTENTS = 3; var MATCH_TYPE = 4; var N_MATCHES = 5; var SCORE = 6; var i = 7; var MATCHES = 8; var html; var searchString; var wildcard; var invalidSearchString; var origSearchString; var styles = "" FILENAME_SCORE_ORDER = 0; URL_SCORE_ORDER = 1; DESCRIPTION_SCORE_ORDER = 2; CONTENT_SCORE_ORDER = 3; SCORE_PER_TYPE = 15000; var sortResultsByType = true; var omitDescriptions = false; var addMatchSummary = true; var searchTitles = true; var searchDescriptions = true; var searchContent = true; var footer = ""; function isAlnumAmp(ch) { if ((ch >= "a" && ch <= "z") || (ch == "&") ||(ch >= "A" && ch <= "Z") || (ch >= "0" && ch <="9")) { return true; } else { return false; } } function searchElement(fileNumber, matchType, upperSearchString) { var element = a[fileNumber][matchType].toUpperCase(); var w, x, y; var z = 0; a[fileNumber][N_MATCHES] = 0; w = element.indexOf(upperSearchString); while (w >= 0){ z = z + w + 1; if ((wildcard == -2) || (wildcard == -5)) { x = false; } else { if (w == 0) { x = false; } else { x = isAlnumAmp(element.charAt(w - 1)); } } if ((wildcard == -3) || (wildcard == -5)) { y = false; } else { if (element.length - w == upperSearchString.length) { y = false; } else { y = isAlnumAmp(element.charAt(w + upperSearchString.length)); } } if (!x && !y) { a[fileNumber][MATCHES + a[fileNumber][N_MATCHES]] = z - 1; a[fileNumber][N_MATCHES]++; } element = element.substring(w + 1, element.length); while (isAlnumAmp(element.charAt(0)) && element.length > 0) { element = element.substring(1, element.length); z++; } w = element.indexOf(upperSearchString); } } function searchFile(fileNumber, upperSearchString) { var matchIndex = -1, matchType; a[fileNumber][MATCH_TYPE] = -1; while (++matchIndex <= CONTENTS && a[fileNumber][MATCH_TYPE] == -1) { matchType = matchIndex == 0 ? FILENAME : (matchIndex == 1 ? DESCRIPTION : (matchIndex == 2 ? URL : CONTENTS)); if ((matchType == FILENAME || matchType == URL) && !searchTitles) { continue; } if (matchType == DESCRIPTION && !searchDescriptions) { continue; } if (matchType == CONTENTS && !searchContent) { continue; } searchElement(fileNumber, matchType, upperSearchString); if (a[fileNumber][N_MATCHES] > 0) { a[fileNumber][MATCH_TYPE] = matchType; } } } function sortResults() { var fileNumber, t, tempScore, E; for (fileNumber = 1; fileNumber < a.length; fileNumber++) { a[fileNumber][i] = fileNumber; } if (sortResultsByType) { for (fileNumber = 1; fileNumber < a.length; fileNumber++) { if (a[fileNumber][MATCH_TYPE] == FILENAME) { a[fileNumber][SCORE] = (4 - FILENAME_SCORE_ORDER) * SCORE_PER_TYPE; } else if (a[fileNumber][MATCH_TYPE] == DESCRIPTION) { a[fileNumber][SCORE] = (4 - DESCRIPTION_SCORE_ORDER) * SCORE_PER_TYPE; } else if (a[fileNumber][MATCH_TYPE] == URL) { a[fileNumber][SCORE] = (4 - URL_SCORE_ORDER) * SCORE_PER_TYPE; } else { a[fileNumber][SCORE] = (4 - CONTENT_SCORE_ORDER) * SCORE_PER_TYPE + a[fileNumber][N_MATCHES]; } } for (fileNumber = 2; fileNumber < a.length; fileNumber++) { tempScore = a[fileNumber][SCORE]; E = a[fileNumber][i]; for (t = fileNumber; t > 1 && tempScore > a[t-1][SCORE]; t--) { a[t][SCORE] = a[t-1][SCORE]; a[t][i] = a[t-1][i]; } a[t][SCORE] = tempScore; a[t][i] = E; } } } function putMatchSummary(fileNumber) { var pluralSuffix = a[fileNumber][N_MATCHES]==1 ? "" : "es"; html += ""; html += ""; if (a[fileNumber][MATCH_TYPE] == FILENAME) { html += " - matched title"; } else { if (a[fileNumber][MATCH_TYPE] == DESCRIPTION) { html += " - matched description"; } else { if (a[fileNumber][MATCH_TYPE] == URL) { html += " - matched URL"; } else { html += " - " + a[fileNumber][N_MATCHES] + " match" + pluralSuffix + ""; } } } html += ""; } function putMatchDescription(fileNumber, curMatch) { var matchLocation = a[fileNumber][MATCHES + curMatch - 1]; var matchStart = matchLocation < 35 ? 0 : matchLocation - 35; var matchEnd = (matchLocation + 35 > a[fileNumber][CONTENTS].length) ? a[fileNumber][CONTENTS].length : matchLocation + 35; var Q = false; while ((matchStart >= 0) && !Q) { if (isAlnumAmp(a[fileNumber][CONTENTS].charAt(matchStart))) { matchStart--; } else { Q = true; } } matchStart++; Q = false; while ((matchEnd > matchLocation) && !Q) { if (isAlnumAmp(a[fileNumber][CONTENTS].charAt(matchEnd))) { matchEnd--; } else { Q = true; } } html += "
\".. " + a[fileNumber][CONTENTS].substring(matchStart, matchLocation); html += "" + a[fileNumber][CONTENTS].substring(matchLocation, matchLocation + searchString.length) + ""; html += a[fileNumber][CONTENTS].substring(matchLocation + searchString.length, matchEnd) + " ..\""; } function putAllMatchDescriptions(fileNumber) { if (omitDescriptions == false) { var curMatch = 1; while ((curMatch < 4) && (curMatch <= a[fileNumber][N_MATCHES])) { putMatchDescription(fileNumber, curMatch); curMatch++; } } } function putFoundString(v, R) { html += v.substring(0, R); html += "" + v.substring(R, R + searchString.length) + ""; html += v.substring(R + searchString.length, v.length); } function putItem(fileNumber, itemNumber) { html += "

" + itemNumber + ". "; html += "" + a[fileNumber][FILENAME] + ""; if (a[fileNumber][MATCH_TYPE] == CONTENTS) { putAllMatchDescriptions(fileNumber); } else { html += ""; } if (a[fileNumber][MATCH_TYPE] == DESCRIPTION) { html += ""; html += "
Description: "; html += "
"; html += ""; putFoundString(a[fileNumber][DESCRIPTION], a[fileNumber][MATCHES]); } else { if( a[fileNumber][DESCRIPTION].length > 0 ) { html += ""; html += "
Description: "; html += "
"; html += "" + a[fileNumber][DESCRIPTION]; } else { } } html += "
"; html += ""; if (a[fileNumber][MATCH_TYPE] == URL) { putFoundString(a[fileNumber][URL], a[fileNumber][MATCHES]); } else { html += a[fileNumber][URL]; } html += ""; if (addMatchSummary) { putMatchSummary(fileNumber); } html += "
"; } function putResults() { var itemNumber = 0; if (!(invalidSearchString)) { for (var fileNumber = 1; fileNumber < a.length; fileNumber++) { if (a[a[fileNumber][i]][N_MATCHES] > 0) { putItem(a[fileNumber][i], ++itemNumber); } } } else { if (wildcard == -4) { html += "

ERROR: The wildcard chararcter (*) must be at the beginning or end of the text.

"; } } } function putHeader() { html += "Search results for \"" + origSearchString + "\""; html += styles; html += ""; html += "

Search Results

"; html += "
"; html += "

You searched for " + origSearchString +".

"; } function putFooter() { var nMatches = 0; if (!(invalidSearchString)) { for (var fileNumber = 1; fileNumber < a.length; fileNumber++) { if (a[fileNumber][N_MATCHES] > 0) { nMatches++; } } } if (nMatches == 0) { html += "

No pages matched your search.

"; } else { var plural = nMatches == 1 ? "" : "s"; html += "

" + nMatches + " page" + plural + " listed.

"; } html += footer; html += "
"; } function launchBrowser() { var htmlCode = html; iu = open("", "Object", "resizable=yes,scrollbars=yes,toolbar=no,menubar=no,location=no,directories=no,width=475,height=600"); if ((navigator.appName.indexOf("Microsoft")!=-1) && (navigator.appVersion.indexOf("3.0") != -1)) { alert("Click to see results"); } iu.document.open(); iu.document.write(htmlCode); iu.document.close(); } function replaceSpecialChars(str) { var returnStr = ""; for (var index = 0; index < str.length; index++) { if (str.charAt(index) == "<") { returnStr += "<"; } else if (str.charAt(index) == ">") { returnStr += ">"; } else if (str.charAt(index) == "\"") { returnStr += """; } else { returnStr += str.charAt(index); } } return(returnStr); } function checkSearchString() { wildcard = searchString.indexOf("*"); if (wildcard == 0) { wildcard = -2; invalidSearchString = false; } else if (wildcard == searchString.length -1) { wildcard = -3; invalidSearchString = false; } else if (wildcard > 0 ) { wildcard = -4; invalidSearchString = true; } else { invalidSearchString = false; } if (searchString.indexOf("*") != searchString.lastIndexOf("*")) { if (wildcard == -2) { if (searchString.lastIndexOf("*") == searchString.length - 1) { wildcard = -5; } else { wildcard = -4; invalidSearchString = true; } } } if ((wildcard == -2) || (wildcard == -5)) { searchString = searchString.substring(1, searchString.length); } if ((wildcard == -3) || (wildcard == -5)) { searchString = searchString.substring(0, searchString.length - 1); } } function toggleOmitDescriptions() { omitDescriptions = !omitDescriptions; } function toggleSortResults() { sortResultsByType = !sortResultsByType; } function toggleMatchSummary() { addMatchSummary = !addMatchSummary; } function toggleSearchTitles() { searchTitles = !searchTitles; } function toggleSearchDescriptions() { searchDescriptions = !searchDescriptions; } function toggleSearchContent() { searchContent = !searchContent; } function startsearch() { var upperSearchString; searchString = document.formSearch.txtSearch.value; if ((searchString.length > 0) && (searchString != "*")) { html = ""; origSearchString = searchString; searchString = replaceSpecialChars(searchString); checkSearchString(); upperSearchString = searchString.toUpperCase(); if (!(invalidSearchString)) { for (var fileNumber = 1; fileNumber < a.length; fileNumber++) { searchFile(fileNumber, upperSearchString); } sortResults(); } putHeader(); putResults(); putFooter(); launchBrowser(); } }