config.options.chkHttpReadOnly = false;\n
/***\n| Name:|CloseOnCancelPlugin|\n| Description:|Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open|\n| Version:|6.9.3|\n| Date:|30-Sep-2006|\n| Source:||\n| Author:|Simon Baird <>|\n| CoreVersion:|2.1.x|\n***/\n//{{{\nmerge(config.commands.cancelTiddler,{\n\n handler_orig_closeUnsaved: config.commands.cancelTiddler.handler,\n\n handler: function(event,src,title) {\n this.handler_orig_closeUnsaved(event,src,title);\n if (!store.tiddlerExists(title) && !store.isShadowTiddler(title))\n story.closeTiddler(title,true);\n return false;\n }\n\n});\n\n//}}}\n\n
//{{{\nconfig.options.chkHttpReadOnly = false; // means web visitors can experiment with your site by clicking edit\nconfig.options.chkInsertTabs = true; // tab inserts a tab when editing a tiddler\nconfig.views.wikified.defaultText = ""; // don't need message when a tiddler doesn't exist\nconfig.views.editor.defaultText = ""; // don't need message when creating a new tiddler \n//}}}\n
[[Overview]] RomsPlots DownLoad
''As of 7 Apr 2008 I now manage changes to the Matlab functions documented here using svn (SubVersion) for version control.'' \nThere is some help on using Subversion on the ROMS Wiki at\n\nTo download my Matlab codes using svn, you enter the command:\n\n svn checkout\n\nThis will create a folder roms_wilkin at the level where you entered the command. To update the code from time to time (in the event I fix bugs, etc) you should cd into that directory and execute the command "svn update". This also works in cygwin on a WindowsXP machine, or you can install a Windows svn client). \n\nJohn Evans' [[snctools]] can be downloaded at For Matlab verisons from 2008b onward this is al you need.\n\n\n\n\n
Input FileName can be any ROMS netcdf file on the full model grid such as an Initial, History, Average, or Diagnostics file. If it is an appropriate usage, the data in Forcing files can also be plotted.\n\nFor function [[roms_bview]], the input file is a ROMS boundary conditions file. \n\nIt is possible to link MatlabNetcdf mexnc tools with both the OPeNDAP libraries and Unidata netcdf libraries. This makes it possible to access remote OPeNDAP datasets as if they were local by replacing the string FileName with a valid UrlName that serves ROMS output via OPeNDAP (or a Grads-DODS server).\n\nInstead of a single netcdf file, FileName can be a [[ctl]] structure output by function [[roms_timectl]]. This allows the user to access a set of files in a single directory without needing to handle the time index counting in each file.
A Matlab GUI tool for browsing and plotting arbitrary vertical sections written by John Evans.\n\nThis will be distributed and documented here some time.
To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:\n* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)\n* MainMenu: The menu (usually on the left)\n* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened\nYou'll also need to enter your username for signing your edits: <<option txtUserName>>\n\nSee also MonkeyPirateTiddlyWiki.
A ROMS file containing the horizontal grid coordinates. This is generally the input grd_file used by the model. However, the grid information is written to all output FileName unless CPP option NO_WRITE_GRID is defined. So for most of these RomsMat routines any ROMS FileName can be used for Grd_File.
/***\n| Name:|HideWhenPlugin|\n| Description:|Allows conditional inclusion/exclusion in templates|\n| Version:|6.9.3|\n| Date:|30-Sep-2006|\n| Source:||\n| Author:|Simon Baird <>|\nFor use in ViewTemplate and EditTemplate. Eg\n{{{<div macro="showWhen tiddler.tags.contains('Task')">[[TaskToolbar]]</div>}}}\n{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}\n***/\n//{{{\nmerge(config.macros,{\n\n hideWhen: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n if (eval(paramString)) {\n removeChildren(place);\n place.parentNode.removeChild(place);\n }\n }},\n\n showWhen: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n config.macros.hideWhen.handler(place,macroName,params,wikifier,'!('+paramString+')',tiddler);\n }}\n\n});\n\n//}}}\n\n
/***\n|''Name:''|LegacyStrikeThroughPlugin|\n|''Description:''|Support for legacy (pre 2.1) strike through formatting|\n|''Version:''|1.0.1|\n|''Date:''|Jul 21, 2006|\n|''Source:''||\n|''Author:''|MartinBudden (mjbudden (at) gmail (dot) com)|\n|''License:''|[[BSD open source license]]|\n|''CoreVersion:''|2.1.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n\n***/\n\n//{{{\n\n// Ensure that the LegacyStrikeThrough Plugin is only installed once.\nif(!version.extensions.LegacyStrikeThroughPlugin)\n {\n version.extensions.LegacyStrikeThroughPlugin = true;\n\nconfig.formatters.push(\n{\n name: "legacyStrikeByChar",\n match: "==",\n termRegExp: /(==)/mg,\n element: "strike",\n handler: config.formatterHelpers.createElementAndWikify\n});\n\n} // end of "install only once"\n//}}}\n
RomsPlots RomsSlices RomsAnalysis GSlice DownLoad MatlabNetcdf GettingStarted
Tools for handling netcdf files within Matlab:\n\n[[snctools]] by John Evans provide an interface within Matlab to read and write netcdf files.
/***\n| Name:|MptwLayoutPlugin|\n| Description:|A package containing templates and css for the MonkeyPirateTiddlyWiki layout|\n| Version:|6.1.2|\n| Date:|02-Oct-2006|\n| Source:||\n| Author:|Simon Baird <>|\n| CoreVersion:|2.1.x|\n!Notes\nPresumes you have TagglyTaggingPlugin installed.\n***/\n//{{{\nconfig.shadowTiddlers.GettingStarted += "\sn\snSee also MonkeyPirateTiddlyWiki.";\n\n//}}}\n\n//{{{\nmerge(config.shadowTiddlers,{\n\nMonkeyPirateTiddlyWiki:[\n "[[MonkeyPirateTiddlyWiki|]] is a distribution of [[TiddlyWiki|]] created by Simon Baird. See [[the web site|]] for more information.",\n "!!Upgrading ~MonkeyPirateTiddlyWiki",\n "This \s"empty\s" ~MonkeyPirateTiddlyWiki file comes pre-installed with the core ~MonkeyPirateTiddlyWiki plugins. You can upgrade these core plugins to the latest version by doing the following:",\n "# Click ImportTiddlers",\n "# Click \s"Choose...\s" and select \s"~MptwUpgradeURL\s"",\n "# Click \s"fetch\s"",\n "# Click the checkbox in the first column heading to select all tiddlers",\n "# Click \s"More actions...\s" and select \s"Import these tiddlers\s"",\n "# Click \s"OK\s" to confirm you want to overwrite the tiddlers",\n ""\n].join("\sn"),\n\nMptwStyleSheet:[\n "/*{{{*/",\n "/* a contrasting background so I can see where one tiddler ends and the other begins */",\n "body {",\n " background: [[ColorPalette::TertiaryLight]];",\n "}",\n "",\n "/* sexy colours and font for the header */",\n ".headerForeground {",\n " color: [[ColorPalette::PrimaryPale]];",\n "}",\n ".headerShadow, .headerShadow a {",\n " color: [[ColorPalette::PrimaryMid]];",\n "}",\n ".headerForeground, .headerShadow {",\n " padding: 1em 1em 0;",\n " font-family: 'Trebuchet MS' sans-serif;",\n " font-weight:bold;",\n "}",\n ".headerForeground .siteSubtitle {",\n " color: [[ColorPalette::PrimaryLight]];",\n "}",\n ".headerShadow .siteSubtitle {",\n " color: [[ColorPalette::PrimaryMed]];",\n "}",\n "",\n "/* make shadow go and down right instead of up and left */",\n ".headerShadow {",\n " left: 1px;",\n " top: 1px;",\n "}",\n "",\n "/* prefer monospace for editing */",\n ".editor textarea {",\n " font-family: 'Consolas' monospace;",\n "}",\n "",\n "/* sexy tiddler titles */",\n ".title {",\n " font-size: 250%;",\n " color: [[ColorPalette::PrimaryLight]];",\n " font-family: 'Trebuchet MS' sans-serif;",\n "}",\n "",\n "/* more subtle tiddler subtitle */",\n ".subtitle {",\n " padding:0px;",\n " margin:0px;",\n " padding-left:0.5em;",\n " font-size: 90%;",\n " color: [[ColorPalette::TertiaryMid]];",\n "}",\n ".subtitle .tiddlyLink {",\n " color: [[ColorPalette::TertiaryMid]];",\n "}",\n "",\n "/* a little bit of extra whitespace */",\n ".viewer {",\n " padding-bottom:3px;",\n "}",\n "",\n "/* don't want any background color for headings */",\n "h1,h2,h3,h4,h5,h6 {",\n " background: [[ColorPalette::Background]];",\n " color: [[ColorPalette::Foreground]];",\n "}",\n "",\n "/* give tiddlers 3d style border and explicit background */",\n ".tiddler {",\n " background: [[ColorPalette::Background]];",\n " border-right: 2px [[ColorPalette::TertiaryMid]] solid;",\n " border-bottom: 2px [[ColorPalette::TertiaryMid]] solid;",\n " margin-bottom: 1em;",\n " padding-bottom: 2em;",\n "}",\n "",\n "/* make options slider look nicer */",\n "#sidebarOptions .sliderPanel {",\n " border:solid 1px [[ColorPalette::PrimaryLight]];",\n "}",\n "",\n "",\n "/* the borders look wrong with the body background */",\n "#sidebar .button {",\n " border-style: none;",\n "}",\n "",\n "/* displays the list of a tiddler's tags horizontally. used in ViewTemplate */",\n ".tagglyTagged li.listTitle {",\n " display:none",\n "}",\n ".tagglyTagged li {",\n " display: inline; font-size:90%;",\n "}",\n ".tagglyTagged ul {",\n " margin:0px; padding:0px;",\n "}",\n "",\n "/* this means you can put line breaks in SidebarOptions for readability */",\n "#sidebarOptions br {",\n " display:none;",\n "}",\n "/* undo the above in OptionsPanel */",\n "#sidebarOptions .sliderPanel br {",\n " display:inline;",\n "}",\n "",\n "/* horizontal main menu stuff */",\n "#displayArea {",\n " margin: 1em 15.7em 0em 1em; /* use the freed up space */",\n "}",\n "#topMenu br {",\n " display: none;",\n "}",\n "#topMenu {",\n " background: [[ColorPalette::PrimaryMid]];",\n " color:[[ColorPalette::PrimaryPale]];",\n "}",\n "#topMenu {",\n " padding:2px;",\n "}",\n "#topMenu .button, #topMenu .tiddlyLink, #topMenu a {",\n " margin-left: 0.5em;",\n " margin-right: 0.5em;",\n " padding-left: 3px;",\n " padding-right: 3px;",\n " color: [[ColorPalette::PrimaryPale]];",\n " font-size: 115%;",\n "}",\n "#topMenu .button:hover, #topMenu .tiddlyLink:hover {",\n " background: [[ColorPalette::PrimaryDark]];",\n "}",\n "@media print {",\n " #topMenu {",\n " display: none ! important;",\n " }",\n "}",\n "/*}}}*/",\n ""\n].join("\sn"),\n\nMptwViewTemplate:[\n "<!--{{{-->",\n "<div class='toolbar'>",\n " <!-- some custom contextual checkboxes -->",\n " <span style=\s"padding-right:2em;\s">",\n " <span macro=\s"showWhen tiddler.tags.contains('systemConfig')\s">",\n " <span macro=\s"toggleTag systemConfigDisable . '[[disable|systemConfigDisable]]'\s"></span>",\n " <!-- <span macro=\s"toggleTag systemConfigForce . '[[force|systemConfigForce]]'\s"></span> -->",\n " </span>",\n " <span macro=\s"showWhen config.macros.applyLayout && tiddler.tags.contains('layout')\s">",\n " <span macro=\s"applyLayout\s"></span>",\n " </span>",\n " </span>",\n " <!-- regular toolbar -->",\n " <span macro='toolbar closeTiddler closeOthers +editTiddler deleteTiddler undoChanges permalink references jump newHere newJournalHere'></span>",\n "</div>",\n "<!-- regular tags macro but uses taggly css -->",\n "<div class=\s"tagglyTagged\s" macro=\s"tags\s"></div>",\n "<div>",\n " <span class='title' macro='view title'></span>",\n " <span macro=\s"miniTag\s"></span>",\n "</div>",\n "<div class='subtitle'>",\n " <span macro='view modifier link'></span>,",\n " <span macro='view modified date [[DD-mmm-YY]]'></span>",\n " (<span macro='message views.wikified.createdPrompt'></span>",\n " <span macro='view created date [[DD-mmm-YY]]'></span>)",\n "</div>",\n "<!-- using taggly versions of these two",\n "<div class='tagging' macro='tagging'></div>",\n "<div class='tagged' macro='tags'></div> -->",\n "<div macro=\s"hideWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')\s">",\n " <div class='viewer' macro='view text wikified'></div>",\n "</div>",\n "<div macro=\s"showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')\s">",\n " <div class='viewer'><pre macro='view text'></pre></div>",\n "</div>",\n "<div class=\s"tagglyTagging\s" macro=\s"tagglyTagging\s"></div>",\n "<div class='tagClear'></div>",\n "<!--}}}-->",\n ""\n].join("\sn"),\n\nMptwPageTemplate:[\n "<!--{{{-->",\n "<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>",\n " <div class='headerShadow'>",\n " <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;",\n " <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>",\n " </div>",\n " <div class='headerForeground'>",\n " <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;",\n " <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>",\n " </div>",\n "</div>",\n "<!-- horizontal MainMenu -->",\n "<div id='topMenu' refresh='content' tiddler='MainMenu'></div>",\n "<!-- original MainMenu menu -->",\n "<!-- <div id='mainMenu' refresh='content' tiddler='MainMenu'></div> -->",\n "<div id='sidebar'>",\n " <div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>",\n " <div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>",\n "</div>",\n "<div id='displayArea'>",\n " <div id='messageArea'></div>",\n " <div id='tiddlerDisplay'></div>",\n "</div>",\n "<!--}}}-->",\n ""\n].join("\sn"),\n\nMptwEditTemplate:[\n "<!--{{{-->",\n "<div class=\s"toolbar\s" macro=\s"toolbar +saveTiddler closeOthers cancelTiddler deleteTiddler\s"></div>",\n "<div class=\s"title\s" macro=\s"view title\s"></div>",\n "<div class=\s"editLabel\s">Title</div><div class=\s"editor\s" macro=\s"edit title\s"></div>",\n "<div class=\s"editLabel\s">Tags</div><div class=\s"editor\s" macro=\s"edit tags\s"></div>",\n "<div class=\s"editorFooter\s"><span macro=\s"message views.editor.tagPrompt\s"></span><span macro=\s"tagChooser\s"></span></div>",\n "<div class=\s"editor\s" macro=\s"edit text\s"></div>",\n "<!--}}}-->",\n ""\n].join("\sn")\n\n});\n//}}}\n
/***\n| Name:|NewHerePlugin|\n| Description:|Creates the new here and new journal toolbar commands|\n| Version:|6.1.6|\n| Date:|06-Oct-2006|\n| Source:||\n| Author:|Simon Baird <>|\n| CoreVersion:|2.1.x|\nTo use edit your ViewTemplate and add newHere to the toolbar div, eg\n{{{<div class='toolbar' macro='toolbar ... newHere'></div>}}}\nNote: would be good if we could do this instead some day\n{{{<<newTiddler tag:{{tiddler.title}} label:'new here'>>}}}\n***/\n//{{{\nmerge(config.commands,{\n\n newHere: {\n text: 'new here',\n tooltip: 'Create a new tiddler tagged as this tiddler',\n hideReadOnly: true,\n handler: function(e,src,title) {\n if (!readOnly) {\n clearMessage();\n var t=document.getElementById('tiddler'+title);\n story.displayTiddler(t,config.macros.newTiddler.title,DEFAULT_EDIT_TEMPLATE);\n story.setTiddlerTag(config.macros.newTiddler.title, title, 0);\n story.focusTiddler(config.macros.newTiddler.title,"title"); // doesn't work??\n return false;\n }\n }\n },\n\n newJournalHere: {\n //text: 'new journal here', // too long\n text: 'new journal',\n hideReadOnly: true,\n dataFormat: 'DD MMM YYYY', // adjust to your preference\n //dataFormat: 'YYYY-0MM-0DD', \n tooltip: 'Create a new journal tiddler tagged as this tiddler',\n handler: function(e,src,title) {\n if (!readOnly) {\n clearMessage();\n var now = new Date();\n var t=document.getElementById('tiddler'+title);\n var newtitle = now.formatString(this.dataFormat)\n story.displayTiddler(t,newtitle,DEFAULT_EDIT_TEMPLATE);\n story.setTiddlerTag(newtitle, title, 0);\n story.focusTiddler(newtitle,"title");\n return false;\n }\n }\n }\n\n});\n//}}}\n
The majority of the Matlab functions and scripts described here were created by John Wilkin with help from Gordon Zhang, John Evans and other members of the Rutgers Ocean Modeling Group. The tools are intended for straightforward plotting and analysis of ROMS ocean model output, and other ROMS related analysis and Netcdf input/output file manipulation. \n\nThe routines under heading RomsPlots allow plotting directly from an output FileName or [[ctl]] control structure. \n\nThe routines under heading RomsSlices allow slicing of analyzed output already in the Matlab workspace. \n\nSee DownLoad for where to get the code.\n\nThis is a continual work in progress. Presently I am trying to standardize on:\n\n(1) using John Evans' [[snctools]] as the MatlabNetcdf interface. I have expunged all usage of the old Chuck Denham mexnc interface.\n\n(2) removing duplicated coordinate calculations and instead making more widespread use of the [[grd]] structure for all vertical s-coordinate information. Roms_Get_Grid now uses the vertical stretching transformation routines written by Hernan Arango. \n\n(3) supporting the use of the [[ctl]] control structure wherever a FileName is requested. This doesn't work in all cases yet. \n\nJohn Wilkin: IMCS Rutgers University\n71 Dudley Rd, New Brunswick, NJ 08901-8521, USA. ph: 732-932-6555(x251)
/***\n| Name:|QuickOpenTagPlugin|\n| Description:|Changes tag links to make it easier to open tags as tiddlers|\n| Version:|6.1.1|\n| Date:|01-Oct-2006|\n| Source:||\n| Author:|Simon Baird <>|\n| CoreVersion:|2.1.x|\n***/\n//{{{\nconfig.quickOpenTag = {\n\n dropdownChar: (document.all ? "\su25bc" : "\su25be"), // the little one doesn't work in IE\n\n createTagButton: function(place,tag,excludeTiddler) {\n // little hack so we can to <<tag PrettyTagName|RealTagName>>\n var splitTag = tag.split("|");\n var pretty = tag;\n if (splitTag.length == 2) {\n tag = splitTag[1];\n pretty = splitTag[0];\n }\n \n var sp = createTiddlyElement(place,"span",null,"quickopentag");\n createTiddlyText(createTiddlyLink(sp,tag,false),pretty);\n \n var theTag = createTiddlyButton(sp,config.quickOpenTag.dropdownChar,\n config.views.wikified.tag.tooltip.format([tag]),onClickTag);\n theTag.setAttribute("tag",tag);\n if (excludeTiddler)\n theTag.setAttribute("tiddler",excludeTiddler);\n return(theTag);\n },\n\n miniTagHandler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var tagged = store.getTaggedTiddlers(tiddler.title);\n if (tagged.length > 0) {\n var theTag = createTiddlyButton(place,config.quickOpenTag.dropdownChar,\n config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);\n theTag.setAttribute("tag",tiddler.title);\n theTag.className = "miniTag";\n }\n },\n\n allTagsHandler: function(place,macroName,params) {\n var tags = store.getTags();\n var theDateList = createTiddlyElement(place,"ul");\n if(tags.length == 0)\n createTiddlyElement(theDateList,"li",null,"listTitle",this.noTags);\n for (var t=0; t<tags.length; t++) {\n var theListItem = createTiddlyElement(theDateList,"li");\n var theLink = createTiddlyLink(theListItem,tags[t][0],true);\n var theCount = " (" + tags[t][1] + ")";\n theLink.appendChild(document.createTextNode(theCount));\n var theDropDownBtn = createTiddlyButton(theListItem," " +\n config.quickOpenTag.dropdownChar,this.tooltip.format([tags[t][0]]),onClickTag);\n theDropDownBtn.setAttribute("tag",tags[t][0]);\n }\n },\n\n // todo fix these up a bit\n styles: \n"/*{{{*/\sn"+\n"/* created by QuickOpenTagPlugin */\sn"+\n".tagglyTagged .quickopentag, .tagged .quickopentag \sn"+\n" { margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }\sn"+\n".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }\sn"+\n".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}\sn"+\n"/* extra specificity to make it work right */\sn"+\n"#displayArea .viewer .quickopentag a.button, \sn"+\n"#displayArea .viewer .quickopentag a.tiddyLink, \sn"+\n"#mainMenu .quickopentag a.tiddyLink, \sn"+\n"#mainMenu .quickopentag a.tiddyLink \sn"+\n" { border:0px solid black; }\sn"+\n"#displayArea .viewer .quickopentag a.button, \sn"+\n"#mainMenu .quickopentag a.button \sn"+\n" { margin-left:0px; padding-left:2px; }\sn"+\n"#displayArea .viewer .quickopentag a.tiddlyLink, \sn"+\n"#mainMenu .quickopentag a.tiddlyLink \sn"+\n" { margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }\sn"+\n"a.miniTag {font-size:150%;} \sn"+\n"#mainMenu .quickopentag a.button \sn"+\n" /* looks better in right justified main menus */\sn"+\n" { margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }\sn" + \n"#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }\sn" +\n"#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }\sn" +\n"#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }\sn" +\n"/*}}}*/\sn"+\n "",\n\n init: function() {\n // we fully replace these builtins. can't hijack them easily\n window.createTagButton = this.createTagButton;\n config.macros.allTags.handler = this.allTagsHandler;\n config.macros.miniTag = { handler: this.miniTagHandler };\n config.shadowTiddlers["QuickOpenTagStyles"] = this.styles;\n if (store)\n store.addNotification("QuickOpenTagStyles",refreshStyles);\n else\n config.notifyTiddlers.push({name:"QuickOpenTagStyles", notify: refreshStyles});\n }\n\n}\n\nconfig.quickOpenTag.init();\n\n//}}}\n
A collection of Matlab functions, scripts and GUI tools for viewing and analyzing ROMS model output, and creating or modifying ROMS netcdf input files.
/***\n| Name:|RenameTagsPlugin|\n| Description:|Allows you to easily rename or delete tags across multiple tiddlers|\n| Version:|6.9.3|\n| Date:|30-Sep-2006|\n| Source:||\n| Author:|Simon Baird <>|\n| CoreVersion:|2.1.x|\nRename a tag and you will be prompted to rename it in all its tagged tiddlers.\n***/\n//{{{\nconfig.renameTags = {\n\n prompts: {\n rename: "Rename the tag '%0' to '%1' in %2 tidder%3?",\n remove: "Remove the tag '%0' from %1 tidder%2?"\n },\n\n removeTag: function(tag,tiddlers) {\n for (var i=0;i<tiddlers.length;i++) {\n store.setTiddlerTag(tiddlers[i].title,false,tag);\n }\n },\n\n renameTag: function(oldTag,newTag,tiddlers) {\n for (var i=0;i<tiddlers.length;i++) {\n store.setTiddlerTag(tiddlers[i].title,false,oldTag); // remove old\n store.setTiddlerTag(tiddlers[i].title,true,newTag); // add new\n }\n },\n\n storeMethods: {\n\n saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,\n\n saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields) {\n if (title != newTitle) {\n var tagged = this.getTaggedTiddlers(title);\n if (tagged.length > 0) {\n // then we are renaming a tag\n if (confirm(config.renameTags.prompts.rename.format([title,newTitle,tagged.length,tagged.length>1?"s":""])))\n config.renameTags.renameTag(title,newTitle,tagged);\n\n if (!this.tiddlerExists(title) && newBody == "")\n // dont create unwanted tiddler\n return null;\n }\n }\n return this.saveTiddler_orig_renameTags(title,newTitle,newBody,modifier,modified,tags,fields);\n },\n\n removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,\n\n removeTiddler: function(title) {\n var tagged = this.getTaggedTiddlers(title);\n if (tagged.length > 0)\n if (confirm(config.renameTags.prompts.remove.format([title,tagged.length,tagged.length>1?"s":""])))\n config.renameTags.removeTag(title,tagged);\n return this.removeTiddler_orig_renameTags(title);\n }\n\n },\n\n init: function() {\n merge(TiddlyWiki.prototype,this.storeMethods);\n }\n}\n\nconfig.renameTags.init();\n\n//}}}\n\n
Some functions for manipulating chunk of ROMS data:\n\nRoms_Zint will produce a vertical integral between two surfaces\nRoms_Get_Date to get ROMS output file times in Matlab datenum and datestr format
Any 3-D set of ROMS model input or output at a fixed time value (including a time average).\n\nThe RomsData needs to be dimensioned (s_dim,eta_dim,xi_dim) which is the index order for data extracted from a ROMS netcdf FileName using MatlabNetcdf tools such as John Evans [[snctools]].
Functions for producing 2-dimensional [[pcolor]] plots that are slices through a 3-dimensional [[ROMS]] data structure. All these functions need the model coordinates loaded into a [[grd]] structure by function Roms_Get_Grid. \n\nPlot directly from a ROMS output or input FileName with:\nRoms_Zview (constant z horizontal slice and optionally overplot vectors)\nRoms_Sview (constant s-level slice and optionally overplot vectors)\nRoms_Iview (constant i-index vertical slice)\nRoms_Jview (constant j-index vertical slice)\nRoms_Bview (vertical slice view of data in a ROMS open boundary conditions file)\nRoms_Addvect (add vectors to an existing horizontal plot)\n\nPlot vector data already extracted from an output FileName, or post-processed from outputs or inputs:\nRoms_Quivergrd\n\nConvert vector data on the curvilinear rotated staggered (u,v) c-grid to east-north coordinates on common tracer (rho) points:\nRoms_Uvrhotate \n\nConvert any of the above plots to a Google Earth KMZ file\nRoms_Kmz\n\nThere are other functions to assist with pos-processing like Roms_Zint to compute vertical integrals.\n
Extract slices of data from ROMS FileName but don't plot it yet:\nRoms_Zslice\nRoms_Islice\nRoms_Jslice\n\nExtract slices of data from a full 3-D RomsData chunk\nRoms_Zslice_Var\nRoms_Slice_Var
Draws vectors of, e.g. velocity or wind stress, over the plot in the current axes. Uses the function Roms_QuiverGrd to handle the staggering of vector components on the ROMS Arakawa-C grid.\n\nUse function Roms_Addvect_Scale to add a scale vector to the plot.
Plot a vertical slice along the requested open boundary of the data in a ROMS boundary conditions file\n\nUsage:\n[TheData,TheHan] = roms_bview(BryFileName,VarName,TimeIndex,Bndy,[[grd]],Xcoord)\n\nInputs:\nBryFileName = roms boundary nc file\nVarName = variable to plot\nTimeIndex = time index into BryFileName if there is more than 1\nBndy = one of the strings 'north', 'south', 'east' or 'west' \n[[grd]] is the ROMS coordinate grid structure from Roms_Get_Grid\nXcoord = one of the strings 'lon','lat', or 'dist' (default) to specify plot abscissa\n
[dnum,dstr] = Roms_Get_Date(FileName,TimeIndex,dateformat)\n\nGet the Matlab datenum (and datestr) values for a given TimeIndex in FileName.\n\nIf TimeIndex = -1 all times in the file are returned.\n\nOptional input dateformat determines the format of the output dstr (see help datestr in Matlab)
Get the lon,lat,mask,depth [and z coordinates] from a ROMS netcdf Grd_File or output FileName and save the result in output structure [[grd]]\n\nThis [[grd]] structure is used by many of the plotting and analysis routines described here.\n\nUsage:\ngrd = roms_get_grid(Grd_File,SCoord,Zeta_In,calc_zuv)\ngrd = roms_get_grid(Grd_File,FileName,Zeta_In,calc_zuv)\n \nInputs:\n\nGrd_File: A file with horizontal grid coordinates (lon_rho, lat_rho etc). (Grd_File can be an existing [[grd]] structure in the case that the structure is to be updated with new vertical grid coordinates)\n \nSCoord: How to specify the s-coordinate vertical stretching.\n\nSince the grid and s-coordinate parameters are written to all output files by default, you can simply use:\n\ngrd = roms_get_grid(FileName,FileName)\nor\ngrd = roms_get_grid(FileName,FileName,0,1)\n\nZeta_In: How to obtain zeta information to use when including free surface height in calculating z-coordinates \n \ncalc_zuv: If present, this argument (any value) activates computation of the depths z_u and z_v on the u and v points of the ROMS C-grid\n \nOutput is a structure containing all the grid information
Extract a vertical slice along a constant 'i' index value\n[data,z,lon,lat,t] = Roms_Iview(FileName,VarName,Iindex,[[grd]])\n\nInputs:\nFileName = roms his/avg/rst etc nc file\nVarName = variable to plot\nIindex = 'i' index along which to extract slice\n[[grd]] is the ROMS coordinate grid structure from Roms_Get_Grid) or the Grd_File name\n
Plot a vertical slice along a constant 'i' index value\n\nUsage:\n[TheData,TheHan] = roms_iview(FileName,VarName,TimeIndex,Iindex,[[grd]])\n\nInputs:\nFileName = roms his/avg/rst etc nc file\nVarName = variable to plot\nTimeIndex = time index into FileName if there is more than 1\nIindex = the 'i' index along which to extract the slice. By default, the function displays latitude as the x-axis of the plot. If Iindex < 0 the plot will be for Iindex = abs(Iindex) but the x-axis coordinates will instead be longitude (useful for grids with xi-axis rotated with respect to east).\n[[grd]] is the ROMS coordinate grid structure from Roms_Get_Grid) or the Grd_File name\n\nPlotTitle: The function does its best to parse time/date information and annotate the plot with this using function [[parsetnc]].
Extract a vertical slice along a constant 'j' index value\n[data,z,lon,lat,t] = Roms_Jview(FileName,VarName,Jindex,[[grd]])\n\nInputs:\nFileName = roms his/avg/rst etc nc file\nVarName = variable to plot\nIindex = 'j' index along which to extract slice\n[[grd]] is the ROMS coordinate grid structure from Roms_Get_Grid) or the Grd_File name\n
Plot a vertical slice along a constant 'i' index value\n\nUsage:\n[TheData,TheHan] = roms_jview(FileName,VarName,TimeIndex,Jindex,[[grd]])\n\nInputs:\nFileName = roms his/avg/rst etc nc file\nVarName = variable to plot\nTimeIndex = time index into FileName if there is more than 1\nJindex = the 'j' index along which to extract the slice. By default, the function displays longitude as the x-axis of the plot. If Jindex < 0 the plot will be for Jindex = abs(Jindex) but the x-axis coordinates will instead be latitude (useful for grids with xi-axis rotated with respect to east).\n[[grd]] is the ROMS coordinate grid structure from Roms_Get_Grid) or the Grd_File name\n\nPlotTitle: The function does its best to parse time/date information and annotate the plot with this usinf function [[parsetnc]].
roms_kmz(outfilename)\n\nConverts the current figure (gcf) to a google earth kmz file (with name outfilename.kmz). Designed to work with e.g. roms_zview type plots but in principle should work with just about any plot in lon/lat coordinates. \n\nThis function needs need export_fig from\nto create a png that preserves the transparency of the background, and googleearth toolbox from\n
TheHan = roms_quivergrd(u,v,[[grd]],[[Vec_d]],UScale,varargin)\n\nThis is a modified form of the Matlab quiver function to handle inputs that are on a ROMS staggered Arakawa-C horizontal grid. \n\nThe vector components and input coordinates on the staggered Arakawa-C grid are averaged to grid rho points and drawn there. \n\nInputs: \n[[grd]] = grid structure\nu,v = vector components on the u,v points of the staggered Arakawa-C grid\n[[Vec_d]] decimates the vectors.\nUScale = scale factor for vectors\nvarargin = any list of valid quiver linetype/style options\n\nIf you call this from within another function you may find you need to use the syntax for varargin:\nroms_quivergrd(u,v,grd,d,uscale,varargin{:})
Extract a constant i or j direction vertical slice of a 3-D ROMS variable \n\nUsage:\n[data,z,lon,lat] = Roms_Slice_Var(RomsData,[[grd]],index,ij,TimeIndex) \n\nInputs:\nRomsData = 3D or 4D chunk of some ROMS variable\n[[grd]] = grid structure\nindex = i or j index on the ROMS horizontal grid\nij = 'i' or 'j' according to which direction you want to slice. For arbitrary path vertical slices see GSlice.\nTimeIndex = optional time index into RomsData \n \nOutputs:\n[data,z,lon,lat] suitable for e.g. pcolor(lon,z,data) \n \n
[TheData,TheGrid,TheHan] = roms_sview(FileName,VarName,TimeIndex,KIndex,[[grd]],[[Vec_d]],UScale,varargin)\n\nProduces a 2-D horizontal [[pcolor]] plot of VarName at the requested vertical grid level KIndex. If requested, velocity vectors are plotted over the image according to the inputs [[Vec_d]], UScale and varargin.\n\nInputs:\nFileName = roms his/avg/rst etc nc file\nVarName = variable to plot\nTimeIndex = time index into netcdf file if there are more than 1\nKIndex = index of vertical direction to plot, between 1 and N where N is the dimension of the vertical grid. \n[[grd]] is the ROMS coordinate grid structure from Roms_Get_Grid, or the Grd_File name. If the [[grd]] is an empty variable the function attempts to obtain the grid information from within FileName. \n\nOptional Inputs to overplot velocity vectors. \nIf the file does not contain velocity variables the function will attempt to plot wind stress (from ROMS variables sustr,svstr) or 10-m wind (from variables Uwind,Vwind) which would be present in a ROMS ForcingFile: \n[[Vec_d]] decimates the density of vectors plotted.\nUScale = scale in lon/lat per velocity units. \nvarargin are any set of legitimate arguments for maltab's quiver function. They are passed through to Roms_Quiver\n \nOutputs:\n \nTheData = structure of data that actually went in to plot.\nTheGrid = ROMS [[grd]] structure\nTheHan = structure of handles for pcolor, quiver and title objects\n\nPlotTitle: The function dodes its best to parse time/date information and annotate the plot with this.
[ueast,vnorth,x,y] = roms_uvrhotate(u,v,[[grd]],[[Vec_d]])\n\nPlace ROMS vector component data given on the u,v c-grid positions onto common rho points (simple 2-point average) and rotate to east-north coordinates (for analysis or plotting with quiver). Optionally decimate the data in space.\n\nInputs: \n[[grd]] = grid structure\nu,v = vector components on the u,v points of the staggered Arakawa-C grid (could be any output on staggered velocity coordinates - velocity, depth-average velocity, surface and bottom stresses). \n[[Vec_d]] decimates the vectors.\n\nIf extra outputs are requested, x,y (lon/lat) are returned and they will be decimated the same way as the vector components. \n\n
Vertical integral of a 3-D chunk of RomsData between z ranges z1 to z2 which can be specified in a variety of ways.\n\n[vint,thickness,dz] = roms_zint(RomsData,[[grd]]);\nThe vertical integral is over the entire water column.\n\n[vint,thickness,dz] = roms_zint(RomsData,[[grd]],z_r_indices);\nVertical integral between two s-coordinate indices.\n\n[vint,thickness,dz] = roms_zint212(RomsData,[[grd]],z2,z1);\nIf z1 and z2 are constants z2 < z1 < 0 the integral is between these fixed depths\nIf z1 and z2 are arrays the dimension of the horizontal grid, then the integral is between the two surfaces they define. For example, if z2 is compted as the depth of the mixed layer z1 = zeta, the integral would be over the mixed layer. \n\nIf z1 is 0 or NaN it is assumed the integral is from the surface to z2.\nIf z2 is NaN or [] it is assumed the integral is from z1 to -h.\n \nOutput:\nvint = the vertical integral, so it has units of RomsData*meter\nthickness (optional) = 2D array of water column heights between the given limits of integration. This allows a vertical average to be calculated if desired.\ndz = thicknesses of each layer in the context of z_w. We cannot compute this if z1 and z2 are given as arrays. If either z1 or z2 are arrays, then the output argument dz cannot be asked for.\n\nTo integrate over depths not the full water column, the layer thickness\nmatrix is modified accordingly by effectively implementing\nint_z2^z1 dz = int_-h^0 dz - int_z1^0 dz - int_-h^z2 dz
[data,x,y,t,grd] = Roms_Zslice(FileName,VarName,TimeIndex,depth,[[grd]])\n\nExtract slice of requested VarName at constant depth.\n\nInputs:\nFileName = roms his/avg/rst etc nc file\nVarName = variable to plot\nTimeIndex = time index into netcdf file if there are more than 1\ndepth = z depth of horizontal slice (m). \n[[grd]] is the ROMS coordinate grid structure from Roms_Get_Grid) or the Grd_File name\n if empty [] the function attempts to obtain the gird information from within FileName\n\nOutputs:\n[data,x,y,t] suitable for plotting e.g. pcolor(x,y,data)\nt: Ocean_Time value for TimeIndex.\n
Get a constant-z slice out of a 3-D ROMS variable \n\nUsage:\n[data,x,y] = Roms_Zslice_Var(RomsData,TimeIndex,depth,[[grd]])\n\nInputs:\nRomsData = input 3-d chunk of ROMS data indexed in the order (s_rho,eta_rho,xi_rho) as would be extracted from a ROMS FileName using the MatlabNetcdf tools. A singleton leading time dimension must be squeezed out of RomsData, so the input TimeIndex isn't used but is left here for compatibility with some old code.\ndepth = z depth of horizontal slice (m) \nTimeIndex isn't used\n[[grd]] is a grid structure\n\nOutputs:\n[data,x,y] are want you want to make a 2-D plot like pcolor(x,y,data) or contour(x,y,data)\n\nGenerally x,y are the lon/lat coordinates that would be found in [[grd]].
[TheData,TheGrid,TheHan] = roms_zview(FileName,VarName,TimeIndex,depth,[[grd]],[[Vec_d]],UScale,varargin)\n\nProduces a [[pcolor]] plot of the requested VarName at constant depth. If requested, velocity vectors are plotted over the image according to the inputs [[Vec_d]], UScale and varargin.\ne.g.: roms_zview('','salt',1,-10,[[grd]],3,2,'r')\n\nInputs:\n\nFileName = roms his/avg/rst netcdf file, or [[ctl]] structure from [[roms_timectl]]\nVarName = variable to plot\nTimeIndex = time index into netcdf file (if there is more than 1) or date string \ndepth = z depth of horizontal slice (m). If depth=0 or isempty(depth) then any requested vector plot (see below) will be for ubar,vbar. If depth>0 it is changed to -depth internally, i.e. only slices at z<0 are allowed.\n[[grd]] is the ROMS coordinate grid structure from Roms_Get_Grid or the Grd_File name. If given as an empty vairable [] the function attempts to obtain the grid information from within FileName itself (which usually works, but means you're reloading the grid every time you use the function).\n\nOptional Inputs will overplot velocity vectors using Roms_Quiver:\n\n[[Vec_d]] decimates the density of vectors plotted over.\nUScale = scale in lon/lat per velocity units. \nvarargin are any set of legitimate inputs to Matlab's quiver function. They are passed through to Roms_Quiver.\n \nOptional outputs:\n \nTheData = structure of data that actually went in to plot.\nTheGrid = ROMS [[grd]] structure\nTheHan = structure of handles for pcolor, quiver and title objects\n\nThe plotaspectratio to set to be approximately Mercator to make maps look better.\n\nThe function does its best to parse time/date information and annotate the PlotTitle with this.\n\n\n
The input SCoord to Roms_Get_Grid instructs where to obtain the parameters theta_s, theta_b, Tcline and N that define the vertical stretching of the ROMS ocean_s_coordinate.\n \nEither:\nSCoord = a 4-element vector [theta_s theta_b Tcline N] of the parameters\nSCoord = any ROMS FileName from which the SCoord parameters can be read.\n
John Wilkin's notebook describing some Matlab tools for viewing and manipulating ROMS outputs and inputs
ROMS Matlab tools TiddlyWiki
/***\n| Name:|TagglyTaggingPlugin|\n| Description:|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|\n| Version:|6.1.5|\n| Date:|05-Oct-2006|\n| Source:||\n| Author:|Simon Baird <>|\n| CoreVersion:|2.1.x|\n!Notes\nSee\n***/\n//{{{\nconfig.taggly = {\n\n // for translations\n lingo: {\n labels: {\n asc: "\su2191", // down arrow\n desc: "\su2193", // up arrow\n title: "title",\n modified: "modified",\n created: "created",\n show: "+",\n hide: "-",\n normal: "normal",\n group: "group",\n commas: "commas",\n sitemap: "sitemap",\n numCols: "cols\su00b1", // plus minus sign\n label: "Tagged as '%0':"\n },\n\n tooltips: {\n title: "Click to sort by title",\n modified: "Click to sort by modified date",\n created: "Click to sort by created date",\n show: "Click to show tagging list",\n hide: "Click to hide tagging list",\n normal: "Click to show a normal ungrouped list",\n group: "Click to show list grouped by tag",\n sitemap: "Click to show a sitemap style list",\n commas: "Click to show a comma separated list",\n numCols: "Click to change number of columns"\n }\n },\n\n config: {\n showTaggingCounts: true,\n listOpts: {\n // the first one will be the default\n sortBy: ["title","modified","created"],\n sortOrder: ["asc","desc"],\n hideState: ["show","hide"],\n listMode: ["normal","group","sitemap","commas"],\n numCols: ["1","2","3","4","5","6"]\n },\n valuePrefix: "taggly."\n },\n\n getTagglyOpt: function(title,opt) {\n var val = store.getValue(title,this.config.valuePrefix+opt);\n return val ? val : this.config.listOpts[opt][0];\n },\n\n setTagglyOpt: function(title,opt,value) {\n if (!store.tiddlerExists(title))\n // create it silently\n store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),null);\n // if value is default then remove it to save space\n return store.setValue(title,\n this.config.valuePrefix+opt,\n value == this.config.listOpts[opt][0] ? null : value);\n },\n\n getNextValue: function(title,opt) {\n var current = this.getTagglyOpt(title,opt);\n var pos = this.config.listOpts[opt].indexOf(current);\n // a little usability enhancement. actually it doesn't work right for grouped or sitemap\n var limit = (opt == "numCols" ? store.getTaggedTiddlers(title).length : this.config.listOpts[opt].length);\n var newPos = (pos + 1) % limit;\n return this.config.listOpts[opt][newPos];\n },\n\n toggleTagglyOpt: function(title,opt) {\n var newVal = this.getNextValue(title,opt);\n this.setTagglyOpt(title,opt,newVal);\n }, \n\n createListControl: function(place,title,type) {\n var lingo = config.taggly.lingo;\n var label;\n var tooltip;\n var onclick;\n\n if ((type == "title" || type == "modified" || type == "created")) {\n // "special" controls. a little tricky. derived from sortOrder and sortBy\n label = lingo.labels[type];\n tooltip = lingo.tooltips[type];\n\n if (this.getTagglyOpt(title,"sortBy") == type) {\n label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];\n onclick = function() {\n config.taggly.toggleTagglyOpt(title,"sortOrder");\n return false;\n }\n }\n else {\n onclick = function() {\n config.taggly.setTagglyOpt(title,"sortBy",type);\n config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);\n return false;\n }\n }\n }\n else {\n // "regular" controls, nice and simple\n label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];\n tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];\n onclick = function() {\n config.taggly.toggleTagglyOpt(title,type);\n return false;\n }\n }\n\n // hide button because commas don't have columns\n if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))\n createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");\n },\n\n makeColumns: function(orig,numCols) {\n var listSize = orig.length;\n var colSize = listSize/numCols;\n var remainder = listSize % numCols;\n\n var upperColsize = colSize;\n var lowerColsize = colSize;\n\n if (colSize != Math.floor(colSize)) {\n // it's not an exact fit so..\n upperColsize = Math.floor(colSize) + 1;\n lowerColsize = Math.floor(colSize);\n }\n\n var output = [];\n var c = 0;\n for (var j=0;j<numCols;j++) {\n var singleCol = [];\n var thisSize = j < remainder ? upperColsize : lowerColsize;\n for (var i=0;i<thisSize;i++) \n singleCol.push(orig[c++]);\n output.push(singleCol);\n }\n\n return output;\n },\n\n drawTable: function(place,columns,theClass) {\n var newTable = createTiddlyElement(place,"table",null,theClass);\n var newTbody = createTiddlyElement(newTable,"tbody");\n var newTr = createTiddlyElement(newTbody,"tr");\n for (var j=0;j<columns.length;j++) {\n var colOutput = "";\n for (var i=0;i<columns[j].length;i++) \n colOutput += columns[j][i];\n var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class\n wikify(colOutput,newTd);\n }\n return newTable;\n },\n\n createTagglyList: function(place,title) {\n switch(this.getTagglyOpt(title,"listMode")) {\n case "group": return this.createTagglyListGrouped(place,title); break;\n case "normal": return this.createTagglyListNormal(place,title,false); break;\n case "commas": return this.createTagglyListNormal(place,title,true); break;\n case "sitemap":return this.createTagglyListSiteMap(place,title); break;\n }\n },\n\n getTaggingCount: function(title) {\n // thanks to Doug Edmunds\n if (this.config.showTaggingCounts) {\n var tagCount = store.getTaggedTiddlers(title).length;\n if (tagCount > 0)\n return " ("+tagCount+")";\n }\n return "";\n },\n\n // this is for normal and commas mode\n createTagglyListNormal: function(place,title,useCommas) {\n\n var list = store.getTaggedTiddlers(title,this.getTagglyOpt(title,"sortBy"));\n\n if (this.getTagglyOpt(title,"sortOrder") == "desc")\n list = list.reverse();\n\n var output = [];\n for (var i=0;i<list.length;i++) {\n var countString = this.getTaggingCount(list[i].title);\n if (useCommas)\n output.push((i > 0 ? ", " : "") + "[[" + list[i].title + "]]" + countString);\n else\n output.push("*[[" + list[i].title + "]]" + countString + "\sn");\n }\n\n return this.drawTable(place,\n this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),\n useCommas ? "commas" : "normal");\n },\n\n // this is for the "grouped" mode\n createTagglyListGrouped: function(place,title) {\n var sortBy = this.getTagglyOpt(title,"sortBy");\n var sortOrder = this.getTagglyOpt(title,"sortOrder");\n\n var list = store.getTaggedTiddlers(title,sortBy);\n\n if (sortOrder == "desc")\n list = list.reverse();\n\n var leftOvers = []\n for (var i=0;i<list.length;i++)\n leftOvers.push(list[i].title);\n\n var allTagsHolder = {};\n for (var i=0;i<list.length;i++) {\n for (var j=0;j<list[i].tags.length;j++) {\n\n if (list[i].tags[j] != title) { // not this tiddler\n\n if (!allTagsHolder[list[i].tags[j]])\n allTagsHolder[list[i].tags[j]] = "";\n\n allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"\n + this.getTaggingCount(list[i].title) + "\sn";\n leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers\n }\n }\n }\n\n var allTags = [];\n for (var t in allTagsHolder)\n allTags.push(t);\n\n var sortHelper = function(a,b) {\n if (a == b) return 0;\n if (a < b) return -1;\n return 1;\n };\n\n allTags.sort(function(a,b) {\n var tidA = store.getTiddler(a);\n var tidB = store.getTiddler(b);\n if (sortBy == "title") return sortHelper(a,b);\n else if (!tidA && !tidB) return 0;\n else if (!tidA) return -1;\n else if (!tidB) return +1;\n else return sortHelper(tidA[sortBy],tidB[sortBy]);\n });\n\n var leftOverOutput = "";\n for (var i=0;i<leftOvers.length;i++)\n leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + "\sn";\n\n var output = [];\n\n if (sortOrder == "desc")\n allTags.reverse();\n else if (leftOverOutput != "")\n // leftovers first...\n output.push(leftOverOutput);\n\n for (var i=0;i<allTags.length;i++)\n output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(leftOvers[i]) + "\sn" + allTagsHolder[allTags[i]]);\n\n if (sortOrder == "desc" && leftOverOutput != "")\n // leftovers last...\n output.push(leftOverOutput);\n\n return this.drawTable(place,\n this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),\n "grouped");\n\n },\n\n // used to build site map\n treeTraverse: function(title,depth,sortBy,sortOrder) {\n\n var list = store.getTaggedTiddlers(title,sortBy);\n if (sortOrder == "desc")\n list.reverse();\n\n var indent = "";\n for (var j=0;j<depth;j++)\n indent += "*"\n\n var childOutput = "";\n for (var i=0;i<list.length;i++)\n if (list[i].title != title)\n childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder);\n\n if (depth == 0)\n return childOutput;\n else\n return indent + "[["+title+"]]" + this.getTaggingCount(title) + "\sn"+childOutput;\n },\n\n // this if for the site map mode\n createTagglyListSiteMap: function(place,title) {\n var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"));\n return this.drawTable(place,\n this.makeColumns(output.split(/(?=^\s*\s[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic\n "sitemap"\n );\n },\n\n macros: {\n tagglyTagging: {\n handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n var refreshContainer = createTiddlyElement(place,"div");\n // do some refresh magic to make it keep the list fresh - thanks Saq\n refreshContainer.setAttribute("refresh","macro");\n refreshContainer.setAttribute("macroName",macroName);\n refreshContainer.setAttribute("title",tiddler.title);\n this.refresh(refreshContainer);\n },\n\n refresh: function(place) {\n var title = place.getAttribute("title");\n removeChildren(place);\n if (store.getTaggedTiddlers(title).length > 0) {\n var lingo = config.taggly.lingo;\n config.taggly.createListControl(place,title,"hideState");\n if (config.taggly.getTagglyOpt(title,"hideState") == "show") {\n createTiddlyElement(place,"span",null,"tagglyLabel",lingo.labels.label.format([title]));\n config.taggly.createListControl(place,title,"title");\n config.taggly.createListControl(place,title,"modified");\n config.taggly.createListControl(place,title,"created");\n config.taggly.createListControl(place,title,"listMode");\n config.taggly.createListControl(place,title,"numCols");\n config.taggly.createTagglyList(place,title);\n }\n }\n }\n }\n },\n\n // todo fix these up a bit\n styles: \n"/*{{{*/\sn"+\n"/* created by TagglyTaggingPlugin */\sn"+\n".tagglyTagging { padding-top:0.5em; }\sn"+\n".tagglyTagging li.listTitle { display:none; }\sn"+\n".tagglyTagging ul {\sn"+\n" margin-top:0px; padding-top:0.5em; padding-left:2em;\sn"+\n" margin-bottom:0px; padding-bottom:0px;\sn"+\n"}\sn"+\n".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }\sn"+\n".tagglyTagging table { margin:0px; padding:0px; }\sn"+\n".tagglyTagging .button { display:none; margin-left:3px; margin-right:3px; }\sn"+\n".tagglyTagging .button, .tagglyTagging .hidebutton {\sn"+\n" color:[[ColorPalette::TertiaryLight]]; font-size:90%;\sn"+\n" border:0px; padding-left:0.3em;padding-right:0.3em;\sn"+\n"}\sn"+\n".tagglyTagging .button:hover, .hidebutton:hover {\sn"+\n" background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];\sn"+\n"}\sn"+\n".selected .tagglyTagging .button {\sn"+\n" display:inline;\sn"+\n"}\sn"+\n".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }\sn"+\n".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }\sn"+\n".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }\sn"+\n".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }\sn"+\n".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}\sn"+\n".tagglyTagging ul ul li {margin-left:0.5em; }\sn"+\n".editLabel { font-size:90%; padding-top:0.5em; }\sn"+\n".tagglyTagging .commas { padding-left:1.8em; }\sn"+\n"/*}}}*/\sn"+\n "",\n\n init: function() {\n merge(config.macros,this.macros);\n config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;\n if (store)\n store.addNotification("TagglyTaggingStyles",refreshStyles);\n else\n config.notifyTiddlers.push({name:"TagglyTaggingStyles", notify: refreshStyles});\n }\n};\n\nconfig.taggly.init();\n\n//}}}\n\n
If there are multiple time levels in the input FileName then TimeIndex indicates which to plot or extract. \n\nIf TimeIndex is a string in Matlab datestr formant, e.g. "03-Sep-2002 12:00", then the nearest time index to the requested date is plotted.
/***\n| Name:|ToggleTagMacro|\n| Description:|Makes a checkbox which toggles a tag in a tiddler|\n| Version:|6.1.6|\n| Date:|06-Oct-2006|\n| Source:||\n| Author:|SimonBaird|\n| License:|[[BSD open source license]]|\n| CoreVersion:|2.1|\n!Usage\n{{{<<toggleTag }}}//{{{TagName TiddlerName LabelText}}}//{{{>>}}}\n* TagName - the tag to be toggled, default value "checked"\n* TiddlerName - the tiddler to toggle the tag in, default value the current tiddler\n* LabelText - the text (gets wikified) to put next to the check box, default value is '{{{[[TagName]]}}}' or '{{{[[TagName]] [[TiddlerName]]}}}'\n(If a parameter is '.' then the default will be used)\n\nExamples:\n\n|Code|Description|Example|h\n|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|\n|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|\n|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|\n|{{{<<toggleTag TagName TiddlerName 'click me'>>}}}|Same but with custom label|<<toggleTag TagName TiddlerName 'click me'>>|\n|{{{<<toggleTag . . 'click me'>>}}}|dot means use default value|<<toggleTag . . 'click me'>>|\n(Note if TiddlerName doesn't exist it will be silently created)\n\n!Known issues\n* Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing. Should it stick the tag in the edit box?\n\n***/\n//{{{\n\nmerge(config.macros,{\n\n toggleTag: {\n\n doRefreshAll: true,\n createIfRequired: true,\n shortLabel: "[[%0]]",\n longLabel: "[[%0]] [[%1]]",\n\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var tag = (params[0] && params[0] != '.') ? params[0] : "checked";\n var title = (params[1] && params[1] != '.') ? params[1] : tiddler.title;\n var defaultLabel = (title == tiddler.title ? this.shortLabel : this.longLabel);\n var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;\n var theTiddler = title == tiddler.title ? tiddler : store.getTiddler(title);\n var cb = createTiddlyCheckbox(place, label.format([tag,title]), theTiddler && theTiddler.isTagged(tag), function(e) {\n if (!theTiddler) {\n if (config.macros.toggleTag.createIfRequired)\n store.saveTiddler(title,title,"",config.options.txtUserName,new Date(),null);\n else\n return false;\n }\n //store.suspendNotifications(); \n store.setTiddlerTag(title,this.checked,tag);\n //refreshDisplay(); \n //store.resumeNotifications();\n return true;\n });\n }\n }\n});\n\n//}}}\n\n
The UScale input is used to scale the length of the quiver vectors. This is required when vector plots are requested to override Matlab's preference to autoscale vectors. When visualizing ROMS output you seldom want to autoscale data because you lose quantitative information and it is difficult to compare vector magnitudes in two related plots. If the length of your vectors is unattractive, experiment with UScale until you get something you like.\n\nBy passing the same UScale value to Roms_Addvect_Scale you can add a velocity scale to any vector plot, and control where it appears.
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |\n| 12/10/2006 18:10:1 | | [[romsmatlab.html|file:///C:/Documents%20and%20Settings/John%20Wilkin/My%20Documents/Work/ROMS/RomsMat/romsmatlab.html]] | [[store.cgi|]] | . | index.html | . |\n| 12/10/2006 22:15:46 | | [[romsmatlab.html|file:///C:/Documents%20and%20Settings/John%20Wilkin/My%20Documents/Work/ROMS/RomsMat/romsmatlab.html]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 12/10/2006 22:18:44 | | [[romsmatlab.html|file:///C:/Documents%20and%20Settings/John%20Wilkin/My%20Documents/Work/ROMS/RomsMat/romsmatlab.html]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 12/10/2006 22:22:54 | | [[romsmatlab.html|file:///C:/Documents%20and%20Settings/John%20Wilkin/My%20Documents/Work/ROMS/RomsMat/romsmatlab.html]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 12/10/2006 22:35:36 | | [[romsmatlab.html|file:///C:/Documents%20and%20Settings/John%20Wilkin/My%20Documents/Work/ROMS/RomsMat/romsmatlab.html]] | [[store.cgi|]] | . | index.html | . |\n| 17/10/2006 13:22:17 | | [[romsmatlab.html|file:///C:/Documents%20and%20Settings/John%20Wilkin/My%20Documents/Work/ROMS/RomsMat/romsmatlab.html]] | [[store.cgi|]] | . | index.html | . |\n| 29/10/2006 21:14:2 | martini | [[romsmatlab.html|file:///C:/Documents%20and%20Settings/John%20Wilkin/My%20Documents/Work/ROMS/RomsMat/romsmatlab.html]] | [[store.cgi|]] | . | index.html | . |\n| 30/10/2006 12:7:35 | martini | [[romsmatlab.html|file:///C:/Documents%20and%20Settings/John%20Wilkin/My%20Documents/Work/ROMS/RomsMat/romsmatlab.html]] | [[store.cgi|]] | . | index.html | . |\n| 30/10/2006 12:8:28 | YourName | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 24/2/2008 12:44:14 | YourName | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 24/2/2008 12:45:35 | YourName | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 24/2/2008 12:47:3 | YourName | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 24/2/2008 12:52:1 | JohnWilkin | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 24/2/2008 12:52:3 | JohnWilkin | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 24/2/2008 12:52:24 | romsmatlab | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 24/2/2008 12:52:40 | RomsMatlab | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 24/2/2008 12:52:56 | RomsMatlab | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 24/2/2008 12:58:32 | RomsMatlab | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 24/2/2008 12:59:4 | RomsMatlab | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 24/2/2008 21:29:50 | romsmatlab | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 24/2/2008 21:30:49 | romsmatlab | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 24/2/2008 21:55:53 | romsmatlab | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 24/2/2008 22:6:17 | romsmatlab | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 25/2/2008 9:15:46 | romsmatlab | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 25/2/2008 9:16:53 | romsmatlab | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 25/2/2008 9:28:5 | romsmatlab | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 7/4/2008 11:21:26 | romsmatlab | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 15/5/2008 9:35:8 | romsmatlab | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 18/9/2008 18:50:32 | JohnWilkin | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 23/10/2008 14:45:30 | YourName | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 23/10/2008 14:50:25 | YourName | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 23/10/2008 14:53:20 | YourName | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 31/12/2009 9:33:33 | JohnWilkin | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 31/12/2009 9:34:28 | JohnWilkin | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 31/12/2009 9:35:46 | JohnWilkin | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 10/3/2010 11:59:4 | JohnWilkin | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/3/2010 12:6:23 | JohnWilkin | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 14/4/2010 11:0:19 | JohnWilkin | [[/|]] | [[store.cgi|]] | . | index.html | . |
/***\n|''Name:''|UploadPlugin|\n|''Description:''|Save to web a TiddlyWiki|\n|''Version:''|3.4.4|\n|''Date:''|Sep 30, 2006|\n|''Source:''||\n|''Documentation:''||\n|''Author:''|BidiX (BidiX (at) bidix (dot) info)|\n|''License:''|[[BSD open source license| ]]|\n|''~CoreVersion:''|2.0.0|\n|''Browser:''|Firefox 1.5; InternetExplorer 6.0; Safari|\n|''Include:''|config.lib.file; config.lib.log; config.lib.options; PasswordTweak|\n|''Require:''|[[UploadService|]]|\n***/\n//{{{\nversion.extensions.UploadPlugin = {\n major: 3, minor: 4, revision: 4, \n date: new Date(2006,8,30),\n source: '',\n documentation: '',\n author: 'BidiX (BidiX (at) bidix (dot) info',\n license: '[[BSD open source license|]]',\n coreVersion: '2.0.0',\n browser: 'Firefox 1.5; InternetExplorer 6.0; Safari'\n};\n//}}}\n\n////+++!![config.lib.file]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.file) config.lib.file= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\nconfig.lib.file.dirname = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(0, lastpos);\n } else {\n return filePath.substring(0, filePath.lastIndexOf("\s\s"));\n }\n};\nconfig.lib.file.basename = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("#")) != -1) \n filePath = filePath.substring(0, lastpos);\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(lastpos + 1);\n } else\n return filePath.substring(filePath.lastIndexOf("\s\s")+1);\n};\nwindow.basename = function() {return "@@deprecated@@";};\n//}}}\n////===\n\n////+++!![config.lib.log]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.log) config.lib.log= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 1}, \n date: new Date(2006,8,19)\n};\nconfig.lib.Log = function(tiddlerTitle, logHeader) {\n if (version.major < 2)\n this.tiddler = store.tiddlers[tiddlerTitle];\n else\n this.tiddler = store.getTiddler(tiddlerTitle);\n if (!this.tiddler) {\n this.tiddler = new Tiddler();\n this.tiddler.title = tiddlerTitle;\n this.tiddler.text = "| !date | !user | !location |" + logHeader;\n this.tiddler.created = new Date();\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[tiddlerTitle] = this.tiddler;\n else\n store.addTiddler(this.tiddler);\n }\n return this;\n};\n\nconfig.lib.Log.prototype.newLine = function (line) {\n var now = new Date();\n var newText = "| ";\n newText += now.getDate()+"/"+(now.getMonth()+1)+"/"+now.getFullYear() + " ";\n newText += now.getHours()+":"+now.getMinutes()+":"+now.getSeconds()+" | ";\n newText += config.options.txtUserName + " | ";\n var location = document.location.toString();\n var filename = config.lib.file.basename(location);\n if (!filename) filename = '/';\n newText += "[["+filename+"|"+location + "]] |";\n this.tiddler.text = this.tiddler.text + "\sn" + newText;\n this.addToLine(line);\n};\n\nconfig.lib.Log.prototype.addToLine = function (text) {\n this.tiddler.text = this.tiddler.text + text;\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[this.tiddler.tittle] = this.tiddler;\n else {\n store.addTiddler(this.tiddler);\n story.refreshTiddler(this.tiddler.title);\n store.notify(this.tiddler.title, true);\n }\n if (version.major < 2)\n store.notifyAll(); \n};\n//}}}\n////===\n\n////+++!![config.lib.options]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.options) config.lib.options = {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\n\nconfig.lib.options.init = function (name, defaultValue) {\n if (!config.options[name]) {\n config.options[name] = defaultValue;\n saveOptionCookie(name);\n }\n};\n//}}}\n////===\n\n////+++!![PasswordTweak]\n\n//{{{\nversion.extensions.PasswordTweak = {\n major: 1, minor: 0, revision: 3, date: new Date(2006,8,30),\n type: 'tweak',\n source: ''\n};\n//}}}\n/***\n!!config.macros.option\n***/\n//{{{\nconfig.macros.option.passwordCheckboxLabel = "Save this password on this computer";\nconfig.macros.option.passwordType = "password"; // password | text\n\nconfig.macros.option.onChangeOption = function(e)\n{\n var opt = this.getAttribute("option");\n var elementType,valueField;\n if(opt) {\n switch(opt.substr(0,3)) {\n case "txt":\n elementType = "input";\n valueField = "value";\n break;\n case "pas":\n elementType = "input";\n valueField = "value";\n break;\n case "chk":\n elementType = "input";\n valueField = "checked";\n break;\n }\n config.options[opt] = this[valueField];\n saveOptionCookie(opt);\n var nodes = document.getElementsByTagName(elementType);\n for(var t=0; t<nodes.length; t++) \n {\n var optNode = nodes[t].getAttribute("option");\n if (opt == optNode) \n nodes[t][valueField] = this[valueField];\n }\n }\n return(true);\n};\n\nconfig.macros.option.handler = function(place,macroName,params)\n{\n var opt = params[0];\n if(config.options[opt] === undefined) {\n return;}\n var c;\n switch(opt.substr(0,3)) {\n case "txt":\n c = document.createElement("input");\n c.onkeyup = this.onChangeOption;\n c.setAttribute ("option",opt);\n c.className = "txtOptionInput "+opt;\n place.appendChild(c);\n c.value = config.options[opt];\n break;\n case "pas":\n // input password\n c = document.createElement ("input");\n c.setAttribute("type",config.macros.option.passwordType);\n c.onkeyup = this.onChangeOption;\n c.setAttribute("option",opt);\n c.className = "pasOptionInput "+opt;\n place.appendChild(c);\n c.value = config.options[opt];\n // checkbox link with this password "save this password on this computer"\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option","chk"+opt);\n c.className = "chkOptionInput "+opt;\n place.appendChild(c);\n c.checked = config.options["chk"+opt];\n // text savePasswordCheckboxLabel\n place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));\n break;\n case "chk":\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option",opt);\n c.className = "chkOptionInput "+opt;\n place.appendChild(c);\n c.checked = config.options[opt];\n break;\n }\n};\n//}}}\n/***\n!! Option cookie stuff\n***/\n//{{{\nwindow.loadOptionsCookie_orig_PasswordTweak = window.loadOptionsCookie;\nwindow.loadOptionsCookie = function()\n{\n var cookies = document.cookie.split(";");\n for(var c=0; c<cookies.length; c++) {\n var p = cookies[c].indexOf("=");\n if(p != -1) {\n var name = cookies[c].substr(0,p).trim();\n var value = cookies[c].substr(p+1).trim();\n switch(name.substr(0,3)) {\n case "txt":\n config.options[name] = unescape(value);\n break;\n case "pas":\n config.options[name] = unescape(value);\n break;\n case "chk":\n config.options[name] = value == "true";\n break;\n }\n }\n }\n};\n\nwindow.saveOptionCookie_orig_PasswordTweak = window.saveOptionCookie;\nwindow.saveOptionCookie = function(name)\n{\n var c = name + "=";\n switch(name.substr(0,3)) {\n case "txt":\n c += escape(config.options[name].toString());\n break;\n case "chk":\n c += config.options[name] ? "true" : "false";\n // is there an option link with this chk ?\n if (config.options[name.substr(3)]) {\n saveOptionCookie(name.substr(3));\n }\n break;\n case "pas":\n if (config.options["chk"+name]) {\n c += escape(config.options[name].toString());\n } else {\n c += "";\n }\n break;\n }\n c += "; expires=Fri, 1 Jan 2038 12:00:00 UTC; path=/";\n document.cookie = c;\n};\n//}}}\n/***\n!! Initializations\n***/\n//{{{\n// define config.options.pasPassword\nif (!config.options.pasPassword) {\n config.options.pasPassword = 'defaultPassword';\n window.saveOptionCookie('pasPassword');\n}\n// since loadCookies is first called befor password definition\n// we need to reload cookies\nwindow.loadOptionsCookie();\n//}}}\n////===\n\n////+++!![config.macros.upload]\n\n//{{{\nconfig.macros.upload = {\n accessKey: "U",\n formName: "UploadPlugin",\n contentType: "text/html;charset=UTF-8",\n defaultStoreScript: "store.php"\n};\n\n// only this two configs need to be translated\nconfig.macros.upload.messages = {\n aboutToUpload: "About to upload TiddlyWiki to %0",\n backupFileStored: "Previous file backuped in %0",\n crossDomain: "Certainly a cross-domain isue: access to an other site isn't allowed",\n errorDownloading: "Error downloading",\n errorUploadingContent: "Error uploading content",\n fileLocked: "Files is locked: You are not allowed to Upload",\n fileNotFound: "file to upload not found",\n fileNotUploaded: "File %0 NOT uploaded",\n mainFileUploaded: "Main TiddlyWiki file uploaded to %0",\n passwordEmpty: "Unable to upload, your password is empty",\n urlParamMissing: "url param missing",\n rssFileNotUploaded: "RssFile %0 NOT uploaded",\n rssFileUploaded: "Rss File uploaded to %0"\n};\n\nconfig.macros.upload.label = {\n promptOption: "Save and Upload this TiddlyWiki with UploadOptions",\n promptParamMacro: "Save and Upload this TiddlyWiki in %0",\n saveLabel: "save to web", \n saveToDisk: "save to disk",\n uploadLabel: "upload" \n};\n\nconfig.macros.upload.handler = function(place,macroName,params){\n // parameters initialization\n var storeUrl = params[0];\n var toFilename = params[1];\n var backupDir = params[2];\n var uploadDir = params[3];\n var username = params[4];\n var password; // for security reason no password as macro parameter\n var label;\n if (document.location.toString().substr(0,4) == "http")\n label = this.label.saveLabel;\n else\n label = this.label.uploadLabel;\n var prompt;\n if (storeUrl) {\n prompt = this.label.promptParamMacro.toString().format([this.toDirUrl(storeUrl, uploadDir, username)]);\n }\n else {\n prompt = this.label.promptOption;\n }\n createTiddlyButton(place, label, prompt, \n function () {\n config.macros.upload.upload(storeUrl, toFilename, uploadDir, backupDir, username, password); \n return false;}, \n null, null, this.accessKey);\n};\nconfig.macros.upload.UploadLog = function() {\n return new config.lib.Log('UploadLog', " !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |" );\n};\nconfig.macros.upload.UploadLog.prototype = config.lib.Log.prototype;\nconfig.macros.upload.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir, backupDir) {\n var line = " [[" + config.lib.file.basename(storeUrl) + "|" + storeUrl + "]] | ";\n line += uploadDir + " | " + toFilename + " | " + backupDir + " |";\n this.newLine(line);\n};\nconfig.macros.upload.UploadLog.prototype.endUpload = function() {\n this.addToLine(" Ok |");\n};\nconfig.macros.upload.basename = config.lib.file.basename;\nconfig.macros.upload.dirname = config.lib.file.dirname;\nconfig.macros.upload.toRootUrl = function (storeUrl, username)\n{\n return root = (this.dirname(storeUrl)?this.dirname(storeUrl):this.dirname(document.location.toString()));\n}\nconfig.macros.upload.toDirUrl = function (storeUrl, uploadDir, username)\n{\n var root = this.toRootUrl(storeUrl, username);\n if (uploadDir && uploadDir != '.')\n root = root + '/' + uploadDir;\n return root;\n}\nconfig.macros.upload.toFileUrl = function (storeUrl, toFilename, uploadDir, username)\n{\n return this.toDirUrl(storeUrl, uploadDir, username) + '/' + toFilename;\n}\nconfig.macros.upload.upload = function(storeUrl, toFilename, uploadDir, backupDir, username, password)\n{\n // parameters initialization\n storeUrl = (storeUrl ? storeUrl : config.options.txtUploadStoreUrl);\n toFilename = (toFilename ? toFilename : config.options.txtUploadFilename);\n backupDir = (backupDir ? backupDir : config.options.txtUploadBackupDir);\n uploadDir = (uploadDir ? uploadDir : config.options.txtUploadDir);\n username = (username ? username : config.options.txtUploadUserName);\n password = config.options.pasUploadPassword; // for security reason no password as macro parameter\n if (!password || password === '') {\n alert(config.macros.upload.messages.passwordEmpty);\n return;\n }\n if (storeUrl === '') {\n storeUrl = config.macros.upload.defaultStoreScript;\n }\n if (config.lib.file.dirname(storeUrl) === '') {\n storeUrl = config.lib.file.dirname(document.location.toString())+'/'+storeUrl;\n }\n if (toFilename === '') {\n toFilename = config.lib.file.basename(document.location.toString());\n }\n\n clearMessage();\n // only for forcing the message to display\n if (version.major < 2)\n store.notifyAll();\n if (!storeUrl) {\n alert(config.macros.upload.messages.urlParamMissing);\n return;\n }\n // Check that file is not locked\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n if (BidiX.GroupAuthoring.lock.isLocked() && !BidiX.GroupAuthoring.lock.isMyLock()) {\n alert(config.macros.upload.messages.fileLocked);\n return;\n }\n }\n \n var log = new this.UploadLog();\n log.startUpload(storeUrl, toFilename, uploadDir, backupDir);\n if (document.location.toString().substr(0,5) == "file:") {\n saveChanges();\n }\n var toDir = config.macros.upload.toDirUrl(storeUrl, toFilename, uploadDir, username);\n displayMessage(config.macros.upload.messages.aboutToUpload.format([toDir]), toDir);\n this.uploadChanges(storeUrl, toFilename, uploadDir, backupDir, username, password);\n if(config.options.chkGenerateAnRssFeed) {\n //var rssContent = convertUnicodeToUTF8(generateRss());\n var rssContent = generateRss();\n var rssPath = toFilename.substr(0,toFilename.lastIndexOf(".")) + ".xml";\n this.uploadContent(rssContent, storeUrl, rssPath, uploadDir, '', username, password, \n function (responseText) {\n if (responseText.substring(0,1) != '0') {\n displayMessage(config.macros.upload.messages.rssFileNotUploaded.format([rssPath]));\n }\n else {\n var toFileUrl = config.macros.upload.toFileUrl(storeUrl, rssPath, uploadDir, username);\n displayMessage(config.macros.upload.messages.rssFileUploaded.format(\n [toFileUrl]), toFileUrl);\n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n });\n }\n return;\n};\n\nconfig.macros.upload.uploadChanges = function(storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var original;\n if (document.location.toString().substr(0,4) == "http") {\n original =, toFilename, uploadDir, backupDir, username, password);\n return;\n }\n else {\n // standard way : Local file\n \n original = loadFile(getLocalPath(document.location.toString()));\n if(window.Components) {\n // it's a mozilla browser\n try {\n"UniversalXPConnect");\n var converter = Components.classes[""]\n .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);\n converter.charset = "UTF-8";\n original = converter.ConvertToUnicode(original);\n }\n catch(e) {\n }\n }\n }\n //DEBUG alert(original);\n this.uploadChangesFrom(original, storeUrl, toFilename, uploadDir, backupDir, \n username, password);\n};\n\nconfig.macros.upload.uploadChangesFrom = function(original, storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var startSaveArea = '<div id="' + 'storeArea">'; // Split up into two so that indexOf() of this source doesn't find it\n var endSaveArea = '</d' + 'iv>';\n // Locate the storeArea div's\n var posOpeningDiv = original.indexOf(startSaveArea);\n var posClosingDiv = original.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1))\n {\n alert(config.messages.invalidFileError.format([document.location.toString()]));\n return;\n }\n var revised = original.substr(0,posOpeningDiv + startSaveArea.length) + \n allTiddlersAsHtml() + "\sn\st\st" +\n original.substr(posClosingDiv);\n var newSiteTitle;\n if(version.major < 2){\n newSiteTitle = (getElementText("siteTitle") + " - " + getElementText("siteSubtitle")).htmlEncode();\n } else {\n newSiteTitle = (wikifyPlain ("SiteTitle") + " - " + wikifyPlain ("SiteSubtitle")).htmlEncode();\n }\n\n revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");\n revised = revised.replaceChunk("<!--PRE-HEAD-START--"+">","<!--PRE-HEAD-END--"+">","\sn" + store.getTiddlerText("MarkupPreHead","") + "\sn");\n revised = revised.replaceChunk("<!--POST-HEAD-START--"+">","<!--POST-HEAD-END--"+">","\sn" + store.getTiddlerText("MarkupPostHead","") + "\sn");\n revised = revised.replaceChunk("<!--PRE-BODY-START--"+">","<!--PRE-BODY-END--"+">","\sn" + store.getTiddlerText("MarkupPreBody","") + "\sn");\n revised = revised.replaceChunk("<!--POST-BODY-START--"+">","<!--POST-BODY-END--"+">","\sn" + store.getTiddlerText("MarkupPostBody","") + "\sn");\n\n var response = this.uploadContent(revised, storeUrl, toFilename, uploadDir, backupDir, \n username, password, function (responseText) {\n if (responseText.substring(0,1) != '0') {\n alert(responseText);\n displayMessage(config.macros.upload.messages.fileNotUploaded.format([getLocalPath(document.location.toString())]));\n }\n else {\n if (uploadDir !== '') {\n toFilename = uploadDir + "/" + config.macros.upload.basename(toFilename);\n } else {\n toFilename = config.macros.upload.basename(toFilename);\n }\n var toFileUrl = config.macros.upload.toFileUrl(storeUrl, toFilename, uploadDir, username);\n if (responseText.indexOf("destfile:") > 0) {\n var destfile = responseText.substring(responseText.indexOf("destfile:")+9, \n responseText.indexOf("\sn", responseText.indexOf("destfile:")));\n toFileUrl = config.macros.upload.toRootUrl(storeUrl, username) + '/' + destfile;\n }\n else {\n toFileUrl = config.macros.upload.toFileUrl(storeUrl, toFilename, uploadDir, username);\n }\n displayMessage(config.macros.upload.messages.mainFileUploaded.format(\n [toFileUrl]), toFileUrl);\n if (backupDir && responseText.indexOf("backupfile:") > 0) {\n var backupFile = responseText.substring(responseText.indexOf("backupfile:")+11, \n responseText.indexOf("\sn", responseText.indexOf("backupfile:")));\n toBackupUrl = config.macros.upload.toRootUrl(storeUrl, username) + '/' + backupFile;\n displayMessage(config.macros.upload.messages.backupFileStored.format(\n [toBackupUrl]), toBackupUrl);\n }\n var log = new config.macros.upload.UploadLog();\n log.endUpload();\n store.setDirty(false);\n // erase local lock\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n BidiX.GroupAuthoring.lock.eraseLock();\n // change mtime with new mtime after upload\n var mtime = responseText.substr(responseText.indexOf("mtime:")+6);\n BidiX.GroupAuthoring.lock.mtime = mtime;\n }\n \n \n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n }\n );\n};\n\nconfig.macros.upload.uploadContent = function(content, storeUrl, toFilename, uploadDir, backupDir, \n username, password, callbackFn) {\n var boundary = "---------------------------"+"AaB03x"; \n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n if (window.netscape){\n try {\n if (document.location.toString().substr(0,4) != "http") {\n'UniversalBrowserRead');}\n }\n catch (e) {}\n } \n //DEBUG alert("user["+config.options.txtUploadUserName+"] password[" + config.options.pasUploadPassword + "]");\n // compose headers data\n var sheader = "";\n sheader += "--" + boundary + "\sr\snContent-disposition: form-data; name=\s"";\n sheader += config.macros.upload.formName +"\s"\sr\sn\sr\sn";\n sheader += "backupDir="+backupDir\n +";user=" + username \n +";password=" + password\n +";uploaddir=" + uploadDir;\n // add lock attributes to sheader\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n var l = BidiX.GroupAuthoring.lock.myLock;\n sheader += ";lockuser=" + l.user\n + ";mtime=" + l.mtime\n + ";locktime=" + l.locktime;\n }\n sheader += ";;\sr\sn"; \n sheader += "\sr\sn" + "--" + boundary + "\sr\sn";\n sheader += "Content-disposition: form-data; name=\s"userfile\s"; filename=\s""+toFilename+"\s"\sr\sn";\n sheader += "Content-Type: " + config.macros.upload.contentType + "\sr\sn";\n sheader += "Content-Length: " + content.length + "\sr\sn\sr\sn";\n // compose trailer data\n var strailer = new String();\n strailer = "\sr\sn--" + boundary + "--\sr\sn";\n //strailer = "--" + boundary + "--\sr\sn";\n var data;\n data = sheader + content + strailer;\n //"POST", storeUrl, true, username, password);\n try {\n"POST", storeUrl, true); \n }\n catch(e) {\n alert(config.macros.upload.messages.crossDomain + "\snError:" +e);\n exit;\n }\n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if (request.status == 200)\n callbackFn(request.responseText);\n else\n alert(config.macros.upload.messages.errorUploadingContent + "\snStatus: "+request.status.statusText);\n }\n };\n request.setRequestHeader("Content-Length",data.length);\n request.setRequestHeader("Content-Type","multipart/form-data; boundary="+boundary);\n request.send(data); \n};\n\n\ = function(uploadUrl, uploadToFilename, uploadDir, uploadBackupDir, \n username, password) {\n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n try {\n if (uploadUrl.substr(0,4) == "http") {\n"UniversalBrowserRead");\n }\n else {\n"UniversalXPConnect");\n }\n } catch (e) { }\n //"GET", document.location.toString(), true, username, password);\n try {\n"GET", document.location.toString(), true);\n }\n catch(e) {\n alert(config.macros.upload.messages.crossDomain + "\snError:" +e);\n exit;\n }\n \n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if(request.status == 200) {\n config.macros.upload.uploadChangesFrom(request.responseText, uploadUrl, \n uploadToFilename, uploadDir, uploadBackupDir, username, password);\n }\n else\n alert(config.macros.upload.messages.errorDownloading.format(\n [document.location.toString()]) + "\snStatus: "+request.status.statusText);\n }\n };\n request.send(null);\n};\n\n//}}}\n////===\n\n////+++!![Initializations]\n\n//{{{\nconfig.lib.options.init('txtUploadStoreUrl','store.php');\nconfig.lib.options.init('txtUploadFilename','');\nconfig.lib.options.init('txtUploadDir','');\nconfig.lib.options.init('txtUploadBackupDir','');\nconfig.lib.options.init('txtUploadUserName',config.options.txtUserName);\nconfig.lib.options.init('pasUploadPassword','');\nsetStylesheet(\n ".pasOptionInput {width: 11em;}\sn"+\n ".txtOptionInput.txtUploadStoreUrl {width: 25em;}\sn"+\n ".txtOptionInput.txtUploadFilename {width: 25em;}\sn"+\n ".txtOptionInput.txtUploadDir {width: 25em;}\sn"+\n ".txtOptionInput.txtUploadBackupDir {width: 25em;}\sn"+\n "",\n "UploadOptionsStyles");\nconfig.shadowTiddlers.UploadDoc = "[[Full Documentation| ]]\sn"; \nconfig.options.chkAutoSave = false; saveOptionCookie('chkAutoSave');\n\n//}}}\n////===\n\n////+++!![Core Hijacking]\n\n//{{{\nconfig.macros.saveChanges.label_orig_UploadPlugin = config.macros.saveChanges.label;\nconfig.macros.saveChanges.label = config.macros.upload.label.saveToDisk;\n\nconfig.macros.saveChanges.handler_orig_UploadPlugin = config.macros.saveChanges.handler;\n\nconfig.macros.saveChanges.handler = function(place)\n{\n if ((!readOnly) && (document.location.toString().substr(0,4) != "http"))\n createTiddlyButton(place,this.label,this.prompt,this.onClick,null,null,this.accessKey);\n};\n\n//}}}\n////===\n
UrlName is a string variable for a valid Opendap URL that serves ROMS data. \n\nFor example: Output from the simulations of the model of the Martha's Vineyard Coastal Observatory (Wilkin, 2006) are served at:\nUrlName = ''\n\nWilkin, J., 2006: Modeling the summer time heat budget and circulation of southeast New England shelf waters, Journal of Physical Oceanography, in press.\n\n
Any valid netcdf variable name in FileName can be requested.\n\nSome speical options are allowed. In Roms_Zview and Roms_Sview: Requesting variable names umag and ubarmag will plot the magnitude of the velocity or depth-averaged velocity (assuming u,v and ubar,vbar) are in the file.
Vec_d causes the density of vectors plotted to be decimated.\nIf a scalar, both horizontal dimensions are decimated by this factor.\nIf a 2-element vector [nx ny] then each direction is decimated accordingly.
This document is a ~TiddlyWiki from A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.\n\n@@font-weight:bold;font-size:1.3em;color:#444; //What now?// &nbsp;&nbsp;@@ Before you can save any changes, you need to enter your password in the form below. Then configure privacy and other site settings at your [[control panel|]] (your control panel username is //romsmatlab//).\n<<tiddler tiddlyspotControls>>\n@@font-weight:bold;font-size:1.3em;color:#444; //Working online// &nbsp;&nbsp;@@ You can edit this ~TiddlyWiki right now, and save your changes using the "save to web" button in the column on the right.\n\n@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// &nbsp;&nbsp;@@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick. You can make changes and save them locally without being connected to the Internet. When you're ready to sync up again, just click "upload" and your ~TiddlyWiki will be saved back to\n\n@@font-weight:bold;font-size:1.3em;color:#444; //Help!// &nbsp;&nbsp;@@ Find out more about ~TiddlyWiki at [[|]]. Also visit [[TiddlyWiki Guides|]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|]], which is an excellent place to ask questions and get help. If you have a tiddlyspot related problem email [[tiddlyspot support|]].\n\n@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// &nbsp;&nbsp;@@ We hope you like using your site. Please email [[|]] with any comments or suggestions.
The argument Zeta_In to Roms_Get_Grid instructs how to obtain the zeta information to use when including free surface height in calculating z-coordinates. The ROMS vertcial S_Coordinate changes with varying sea surface, and there are occasions in plotting and analysis when it is desirable to use this information and accurately computes the grid cell depths as they were in the model. However, for most plotting purposes this is not necessary.\n\nzeta_in = 0 implies assume zeta = 0 (the default)\nzeta_in = integer > 0 implies read zeta for this TimeIndex from FileName\nzeta_in = a 2-D data field the size of the horizontal grid implies use this data in the S_Coordinate calculation
The time control structure output by [[roms_timectl]].
The coordinates of the ROMS grid. The physical coordinates of the ROMS grid points are passed to the various Matlab functions and scripts described here thorugh a single Matlab structure [[grd]].\n\nTypically, [[grd]] is computed by reading the information for the horizontal grid coordinates from the ROMS Grd_File with function Roms_Get_Grid. To compute the vertical locations then information giving the S_Coordinate stretching parameters is required.
Matlab's pcolor function colors each cell by filling a box that is above and to the right of the input coordinate. It does not draw a colored cell centered on the coordinate. This can be easily verified with a simple plot with only a few cells in each direction. The last column and row of data will not display at all. \n\nThis can be somewhat misleading and confusing so I always use a modified version of pcolor called [[pcolorjw]] that shifts the input coordinates a half cell and adds an extra row and column to ensure all the data are plotted with cell centers that fall on the original coordinates. When coastlines are plotted the land/sea mask then coincides properly with the cell centers.
[[ctl]] = roms_timectl(directory,regex,time_variable_name)\n\nModified version of Emanuele Di Lorenzo's rnt_timectl function which will scan a set of files in a directory that match regex and load their names, time index and time value data into a single structure [[ctl]]. \n\nThis is useful when ROMS output is broken into multiple output files, including the case of there being multiple time levels within each file. When [[ctl]] is used as the input FileName to e.g. Roms_Zview, the TimeIndex refers to the global time index in [[ctl]]. \n\nIf input time_variable_name is not given it is assumed to be ocean_time.\n\nThe [[ctl]] structure includes a field 'dnum' which is ocean_time converted to Matlab datenum format.
SNCTOOLS is a set of m-files created by John Evans that perform operations on NetCDF files.\n\nYou might find them a little easier to use in day-to-day activities than the mex-file itself. Check the tutorial at for examples. \n\nThe overwhelming majority of NetCDF operations can be handled by just five routines:\n\n * nc_varget.m: retrieve some or all of a NetCDF variable\n * nc_varput.m: write some or all of a NetCDF variable\n * nc_attget.m: retrieve an attribute\n * nc_attput.m: write an attribute\n * nc_dump.m: dump the metadata to the terminal\n * nc_padheader.m: adds padding to the header of a netcdf file. If you work with file sizes approaching the gigabyte range and have ever tried to add a global attribute, you will appreciate this m-file.\n\nSee the DownLoad page for instructions on obtaining snctools and mexnc. \n\nThe snctools are Matlab m-files and are machine independent, but mexnc (which links Matlab to the NetCDF libraries) must be compiled for different computers. However, if you do not intend to WRITE data to a NetCDF file, you can use the java-netcdf interface. The steps to take to enable this are described at:\n\n
| tiddlyspot password:|<<option pasUploadPassword>>|\n| site management:|<<upload index.html . . romsmatlab>>//(requires tiddlyspot password)//<<br>>[[control panel|]], [[download (go offline)|]]|\n| links:|[[|]], [[FAQs|]], [[announcements|]], [[blog|]], email [[support|]] & [[feedback|]], [[donate|]]|